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

712 lines
26 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"
#include "m_storage.h"
#define TRACE_EN 1
#if TRACE_EN
#define TRACE(...) printf(__VA_ARGS__)
#else
#define TRACE(...)
#endif
#define SEC_TO_HOUR(s) (int)(s / 3600) //总秒数转换为时分秒(时)
#define SEC_TO_MIN(s) (int)((s % 3600) / 60) //总秒数转换为时分秒(分)
#define SEC_TO_SEC(s) (int)(s % 60) //总秒数转换为时分秒(秒)
#define TIMER_DEL_BTN_ALPHA_NOT (120)
#define TIMER_DEL_BTN_ALPHA_MAY (255)
//显示页面
enum {
TIMER_PAGE_SELECT, //选择计时器 6个小圆一个自定义
TIMER_PAGE_CUSTOM, //自定义设置界面加减
TIMER_PAGE_COUNTDOWN, //计时进行中 播放暂停重启
};
//计时状态
enum {
TIMER_STA_IDLE,
TIMER_STA_WORKING,
TIMER_STA_PAUSE,
TIMER_STA_DONE,
TIMER_STA_RESET,
};
//组件ID
enum {
///PAGE_SELECT
//按键
COMPO_ID_BTN_1MIN = 1,
COMPO_ID_BTN_2MIN = 2,
COMPO_ID_BTN_3MIN = 3,
COMPO_ID_BTN_5MIN = 5,
COMPO_ID_BTN_10MIN = 10,
COMPO_ID_BTN_30MIN = 30,
COMPO_ID_BTN_CUSTOM,
///PAGE_CUSTOM
//按键
COMPO_ID_BTN_HOUR_INC, //时+
COMPO_ID_BTN_MIN_INC, //分+
COMPO_ID_BTN_SEC_INC, //秒+
COMPO_ID_BTN_HOUR_RED, //时-
COMPO_ID_BTN_MIN_RED, //分-
COMPO_ID_BTN_SEC_RED, //秒-
COMPO_ID_BTN_OK, //ok
//数字
COMPO_ID_NUM_CUSTOM_HOUR,
COMPO_ID_NUM_CUSTOM_MIN,
COMPO_ID_NUM_CUSTOM_SEC,
COMPO_ID_NUM_CUSTOM_COLON,
COMPO_ID_NUM_CUSTOM_COLON1,
///PAGE_COUNTDOWN
//按键
COMPO_ID_BTN_START,
COMPO_ID_BTN_NO,
//数字
COMPO_ID_NUM_COUNTDOWN,
};
typedef struct f_timer_t_ {
u8 page_disp;
s8 hour;
s8 min;
s8 sec;
} f_timer_t;
//item列表创建时遍历一下
typedef struct timer_btn_item_t_ {
u32 res_addr;
u16 btn_id;
s16 x;
s16 y;
bool visible_en;
} timer_btn_item_t;
typedef struct timer_txt_item_t_ {
const char *text;
u16 max_word_cnt;
s16 x;
s16 y;
bool visible_en;
} timer_txt_item_t;
typedef struct timer_pic_item_t_ {
u32 res_addr;
u16 pic_id;
s16 x;
s16 y;
bool visible_en;
} timer_pic_item_t;
static co_timer_t timer_timer;
//PAGE_SELECT
#define TIMER_BTN_ITEM_CNT ((int)(sizeof(tbl_timer_btn_item) / sizeof(tbl_timer_btn_item[0])))
static const timer_btn_item_t tbl_timer_btn_item[] = {
{UI_BUF_COMMON_START_BIN, COMPO_ID_BTN_1MIN, 12+33, 53+33, true},
{UI_BUF_COMMON_START_BIN, COMPO_ID_BTN_2MIN, 120, 53+33, true},
{UI_BUF_COMMON_START_BIN, COMPO_ID_BTN_3MIN, 162+33, 53+33, true},
{UI_BUF_COMMON_START_BIN, COMPO_ID_BTN_5MIN, 12+33, 141+33, true},
{UI_BUF_COMMON_START_BIN, COMPO_ID_BTN_10MIN, 120, 141+33, true},
{UI_BUF_COMMON_START_BIN, COMPO_ID_BTN_30MIN, 162+33, 141+33, true},
{UI_BUF_COMMON_START_BIN, COMPO_ID_BTN_CUSTOM, 120, 230+25, true},
};
#define TIMER_TXT_ITEM_CNT ((int)(sizeof(tbl_timer_txt_item) / sizeof(tbl_timer_txt_item[0])))
static const timer_txt_item_t tbl_timer_txt_item[] = {
{"1", 4, 12+33, 53+33, true},
{"2", 4, 120, 53+33, true},
{"3", 4, 162+33, 53+33, true},
{"5", 4, 12+33, 141+33, true},
{"10", 5, 120, 141+33, true},
{"30", 5, 162+33, 141+33, true},
{"Custom", 30, 120, 230+25, true},
};
//PAGE_CUSTOM
#define TIMER_CUSTOM_BTN_ITEM_CNT ((int)(sizeof(tbl_timer_custom_btn_item) / sizeof(tbl_timer_custom_btn_item[0])))
static const timer_btn_item_t tbl_timer_custom_btn_item[] = {
{UI_BUF_COMMON_INCREASE_BIN, COMPO_ID_BTN_HOUR_INC, 45, 70, true},
{UI_BUF_COMMON_INCREASE_BIN, COMPO_ID_BTN_MIN_INC, 120, 70, true},
{UI_BUF_COMMON_INCREASE_BIN, COMPO_ID_BTN_SEC_INC, 195, 70, true},
{UI_BUF_COMMON_REDUCE_BIN, COMPO_ID_BTN_HOUR_RED, 45, 186, true},
{UI_BUF_COMMON_REDUCE_BIN, COMPO_ID_BTN_MIN_RED, 120, 186, true},
{UI_BUF_COMMON_REDUCE_BIN, COMPO_ID_BTN_SEC_RED, 195, 186, true},
{UI_BUF_COMMON_REDUCE_BIN, COMPO_ID_BTN_OK, 120, 255, true},
};
static u32 func_timer_tick_get(void)
{
return sys_cb.timer_tick;
}
static void func_timer_tick_reset(void)
{
sys_cb.timer_tick = 0;
}
static void func_timer_finish_text_get(char *text, uint8_t buf_len)
{
if ((SEC_TO_HOUR(sys_cb.timer_total_sec) > 0) && (SEC_TO_MIN(sys_cb.timer_total_sec) > 0) && (SEC_TO_SEC(sys_cb.timer_total_sec) > 0))
{
snprintf(text, buf_len, tjd_Get_Language_Current_Index() == LANGUAGE_TYPE_Chinese ? "%d 小时%d 分钟 %d 秒" : "%dH%dM%dS",
SEC_TO_HOUR(sys_cb.timer_total_sec), SEC_TO_MIN(sys_cb.timer_total_sec), SEC_TO_SEC(sys_cb.timer_total_sec));
}
else if ((SEC_TO_HOUR(sys_cb.timer_total_sec) == 0) && (SEC_TO_MIN(sys_cb.timer_total_sec) > 0) && (SEC_TO_SEC(sys_cb.timer_total_sec) > 0))
{
snprintf(text, buf_len, tjd_Get_Language_Current_Index() == LANGUAGE_TYPE_Chinese ? "%d 分钟%d 秒" : "%dM%dS",
SEC_TO_MIN(sys_cb.timer_total_sec), SEC_TO_SEC(sys_cb.timer_total_sec));
}
else if ((SEC_TO_HOUR(sys_cb.timer_total_sec) > 0) && (SEC_TO_MIN(sys_cb.timer_total_sec) == 0) && (SEC_TO_SEC(sys_cb.timer_total_sec) > 0))
{
snprintf(text, buf_len, tjd_Get_Language_Current_Index() == LANGUAGE_TYPE_Chinese ? "%d 小时%d 秒" : "%dH%dS",
SEC_TO_HOUR(sys_cb.timer_total_sec), SEC_TO_SEC(sys_cb.timer_total_sec));
}
else if ((SEC_TO_HOUR(sys_cb.timer_total_sec) > 0) && (SEC_TO_MIN(sys_cb.timer_total_sec) > 0) && (SEC_TO_SEC(sys_cb.timer_total_sec) == 0))
{
snprintf(text, buf_len, tjd_Get_Language_Current_Index() == LANGUAGE_TYPE_Chinese ? "%d 小时%d 分钟" : "%dH%dM",
SEC_TO_HOUR(sys_cb.timer_total_sec), SEC_TO_MIN(sys_cb.timer_total_sec));
}
else if ((SEC_TO_HOUR(sys_cb.timer_total_sec) == 0) && (SEC_TO_MIN(sys_cb.timer_total_sec) == 0) && (SEC_TO_SEC(sys_cb.timer_total_sec) > 0))
{
snprintf(text, buf_len, tjd_Get_Language_Current_Index() == LANGUAGE_TYPE_Chinese ? "%d 秒" : "%dS", SEC_TO_SEC(sys_cb.timer_total_sec));
}
else if ((SEC_TO_HOUR(sys_cb.timer_total_sec) == 0) && (SEC_TO_MIN(sys_cb.timer_total_sec) > 0) && (SEC_TO_SEC(sys_cb.timer_total_sec) == 0))
{
snprintf(text, buf_len, tjd_Get_Language_Current_Index() == LANGUAGE_TYPE_Chinese ? "%d 分钟" : "%dM", SEC_TO_MIN(sys_cb.timer_total_sec));
}
else if ((SEC_TO_HOUR(sys_cb.timer_total_sec) > 0) && (SEC_TO_MIN(sys_cb.timer_total_sec) == 0) && (SEC_TO_SEC(sys_cb.timer_total_sec) == 0))
{
snprintf(text, buf_len, tjd_Get_Language_Current_Index() == LANGUAGE_TYPE_Chinese ? "%d 小时" : "%dH", SEC_TO_HOUR(sys_cb.timer_total_sec));
}
}
//创建定时器窗体,文件内调用
static compo_form_t *func_timer_form_create_by_type(u8 page_type)
{
u8 hour, min, sec;
u32 res_addr;
char str_buff[TEXTBOX_TEXT_BUF_LEN] = {0};
char done_buff[TEXTBOX_TEXT_BUF_LEN] = {0};
compo_button_t *btn;
compo_textbox_t *txt;
compo_shape_t *shape;
//新建窗体和背景
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_TIMER]);
switch (page_type) {
case TIMER_PAGE_SELECT:
for (u8 idx = 0; idx < TIMER_BTN_ITEM_CNT; idx++) {
if(idx != (TIMER_BTN_ITEM_CNT-1))
{
//创建圆形
shape = compo_radius_shape_create(frm, COMPO_SHAPE_TYPE_ROUNDED_RECTANGLE,33);
compo_shape_set_color(shape, make_color(75, 75, 75));
compo_shape_set_location(shape, tbl_timer_btn_item[idx].x, tbl_timer_btn_item[idx].y, 66, 66);
//创建按钮
btn = compo_button_create(frm);
compo_setid(btn, tbl_timer_btn_item[idx].btn_id);
compo_button_set_location(btn, tbl_timer_btn_item[idx].x, tbl_timer_btn_item[idx].y, 66, 66);
}
else
{
//创建下方矩形
shape = compo_radius_shape_create(frm, COMPO_SHAPE_TYPE_ROUNDED_RECTANGLE,16);
compo_shape_set_color(shape, make_color(0, 228, 198));
compo_shape_set_location(shape, tbl_timer_btn_item[idx].x, tbl_timer_btn_item[idx].y, 216, 50);
//创建按钮
btn = compo_button_create(frm);
compo_setid(btn, tbl_timer_btn_item[idx].btn_id);
compo_button_set_location(btn, tbl_timer_btn_item[idx].x, tbl_timer_btn_item[idx].y, 216, 50);
}
}
// 创建文本
for (u8 idx = 0; idx < TIMER_TXT_ITEM_CNT; idx++) {
txt = compo_textbox_create(frm, tbl_timer_txt_item[idx].max_word_cnt);
compo_textbox_set_pos(txt, tbl_timer_txt_item[idx].x, tbl_timer_txt_item[idx].y);
if(idx == (TIMER_TXT_ITEM_CNT - 1) )
{
compo_textbox_set(txt, i18n[STR_CUSTOM]);
}
else{
snprintf(str_buff, sizeof(str_buff), "%s%s", tbl_timer_txt_item[idx].text, i18n[STR_MIN_SIMPLY]);
compo_textbox_set(txt, str_buff);
}
compo_textbox_set_visible(txt, tbl_timer_txt_item[idx].visible_en);
}
break;
case TIMER_PAGE_CUSTOM:
//创建按钮
for (u8 idx = 0; idx < TIMER_CUSTOM_BTN_ITEM_CNT; idx++) {
if(idx != (TIMER_CUSTOM_BTN_ITEM_CNT-1)){
btn = compo_button_create_by_image(frm, tbl_timer_custom_btn_item[idx].res_addr);
compo_setid(btn, tbl_timer_custom_btn_item[idx].btn_id);
compo_button_set_pos(btn, tbl_timer_custom_btn_item[idx].x, tbl_timer_custom_btn_item[idx].y);
compo_button_set_visible(btn, tbl_timer_custom_btn_item[idx].visible_en);
}
else{
//创建下方矩形
shape = compo_radius_shape_create(frm, COMPO_SHAPE_TYPE_ROUNDED_RECTANGLE,16);
compo_shape_set_color(shape, make_color(0, 228, 198));
compo_shape_set_location(shape, tbl_timer_custom_btn_item[idx].x, tbl_timer_custom_btn_item[idx].y, 216, 50);
//创建按钮
btn = compo_button_create(frm);
compo_setid(btn, tbl_timer_custom_btn_item[idx].btn_id);
compo_button_set_location(btn, tbl_timer_custom_btn_item[idx].x, tbl_timer_custom_btn_item[idx].y, 216, 50);
}
}
//创建数字
hour = SEC_TO_HOUR(sys_cb.timer_custom_sec);
min = SEC_TO_MIN(sys_cb.timer_custom_sec);
sec = SEC_TO_SEC(sys_cb.timer_custom_sec);
txt = compo_textbox_create(frm, 2);
compo_setid(txt, COMPO_ID_NUM_CUSTOM_HOUR);
compo_textbox_set_pos(txt, 45, 123);
compo_textbox_set_font(txt, UI_BUF_0FONT_FONT_NUM_38_BIN);
snprintf(str_buff, sizeof(str_buff), "%02d", hour);
compo_textbox_set(txt, str_buff);
txt = compo_textbox_create(frm, 2);
compo_setid(txt, COMPO_ID_NUM_CUSTOM_MIN);
compo_textbox_set_pos(txt, GUI_SCREEN_CENTER_X, 123);
compo_textbox_set_font(txt, UI_BUF_0FONT_FONT_NUM_38_BIN);
snprintf(str_buff, sizeof(str_buff), "%02d", min);
compo_textbox_set(txt, str_buff);
txt = compo_textbox_create(frm, 2);
compo_setid(txt, COMPO_ID_NUM_CUSTOM_SEC);
compo_textbox_set_pos(txt, 195, 123);
compo_textbox_set_font(txt, UI_BUF_0FONT_FONT_NUM_38_BIN);
snprintf(str_buff, sizeof(str_buff), "%02d", sec);
compo_textbox_set(txt, str_buff);
txt = compo_textbox_create(frm, 1);
compo_setid(txt, COMPO_ID_NUM_CUSTOM_COLON);
compo_textbox_set_pos(txt, 83, 120);
compo_textbox_set_font(txt, UI_BUF_0FONT_FONT_NUM_38_BIN);
snprintf(str_buff, sizeof(str_buff), ":");
compo_textbox_set(txt, str_buff);
txt = compo_textbox_create(frm, 1);
compo_setid(txt, COMPO_ID_NUM_CUSTOM_COLON1);
compo_textbox_set_pos(txt, 157, 120);
compo_textbox_set_font(txt, UI_BUF_0FONT_FONT_NUM_38_BIN);
snprintf(str_buff, sizeof(str_buff), ":");
compo_textbox_set(txt, str_buff);
//创建文本
txt = compo_textbox_create(frm, 3);
compo_textbox_set_pos(txt, 120, 255);
compo_textbox_set(txt, i18n[STR_CONFIMR]);
break;
case TIMER_PAGE_COUNTDOWN:
//新建按钮
res_addr = sys_cb.timer_sta == TIMER_STA_WORKING ? UI_BUF_COMMON_PAUSE_BIN : (sys_cb.timer_sta == TIMER_STA_DONE ? UI_BUF_COMMON_RESET_BIN : UI_BUF_COMMON_START_BIN);
btn = compo_button_create_by_image(frm, res_addr); //start/pause/again
compo_setid(btn, COMPO_ID_BTN_START);
compo_button_set_pos(btn, 174, 240);
btn = compo_button_create_by_image(frm, UI_BUF_COMMON_BACK_BIN); //close
compo_setid(btn, COMPO_ID_BTN_NO);
compo_button_set_pos(btn, 66, 240);
widget_set_alpha(btn->widget, sys_cb.timer_sta == TIMER_STA_WORKING ? TIMER_DEL_BTN_ALPHA_NOT : TIMER_DEL_BTN_ALPHA_MAY);
//新建数字
hour = SEC_TO_HOUR(sys_cb.timer_left_sec);
min = SEC_TO_MIN(sys_cb.timer_left_sec);
sec = SEC_TO_SEC(sys_cb.timer_left_sec);
txt = compo_textbox_create(frm, 60);
compo_setid(txt, COMPO_ID_NUM_COUNTDOWN);
compo_textbox_set_location(txt, GUI_SCREEN_CENTER_X, 123, GUI_SCREEN_WIDTH, 65);
compo_textbox_set_multiline(txt, true);
if (sys_cb.timer_sta == TIMER_STA_DONE) {
compo_textbox_set_font(txt, UI_BUF_0FONT_FONT_BIN);
func_timer_finish_text_get(str_buff, sizeof(str_buff));
snprintf(done_buff, sizeof(done_buff), i18n[STR_COUNTDOWN_ENDS], str_buff);
compo_textbox_set(txt, done_buff);
} else {
compo_textbox_set_font(txt, UI_BUF_0FONT_FONT_NUM_38_BIN);
snprintf(str_buff, sizeof(str_buff), "%02d:%02d:%02d", hour, min, sec);
compo_textbox_set(txt, str_buff);
}
break;
default:
break;
}
return frm;
}
//创建定时器窗体,创建窗体中不要使用功能结构体 func_cb.f_cb
compo_form_t *func_timer_form_create(void)
{
compo_form_t *frm = NULL;
switch (sys_cb.timer_sta)
{
case TIMER_STA_IDLE:
frm = func_timer_form_create_by_type(TIMER_PAGE_SELECT);
break;
case TIMER_STA_WORKING:
case TIMER_STA_PAUSE:
case TIMER_STA_DONE:
case TIMER_STA_RESET:
frm = func_timer_form_create_by_type(TIMER_PAGE_COUNTDOWN);
break;
default:
break;
}
return frm;
}
//释放按钮效果处理
static void func_timer_button_release_handle(void)
{
u32 res_addr;
compo_button_t *btn;
if ((btn = compo_getobj_byid(COMPO_ID_BTN_START)) != NULL)
{
res_addr = sys_cb.timer_sta == TIMER_STA_WORKING ? UI_BUF_COMMON_PAUSE_BIN : (sys_cb.timer_sta == TIMER_STA_DONE ? UI_BUF_COMMON_RESET_BIN : UI_BUF_COMMON_START_BIN);
compo_button_set_bgimg(btn, res_addr);
}
if ((btn = compo_getobj_byid(COMPO_ID_BTN_NO)) != NULL)
{
compo_button_set_bgimg(btn, UI_BUF_COMMON_BACK_BIN);
widget_set_alpha(btn->widget, sys_cb.timer_sta == TIMER_STA_WORKING ? TIMER_DEL_BTN_ALPHA_NOT : TIMER_DEL_BTN_ALPHA_MAY);
}
}
//100ms计时器秒数刷新回调函数
static void timer_100ms_pro(co_timer_t *timer, void *param)
{
bool done = false;
if (sys_cb.timer_sta == TIMER_STA_WORKING) {
if (sys_cb.timer_left_sec == 0) {
done = true;
}
/* 1s更新时间 */
sys_cb.timer_left_sec = sys_cb.timer_total_sec - ((func_timer_tick_get() + sys_cb.timer_temp_tick) / 1000);
if (sys_cb.timer_left_sec <= 0) {
done = true;
}
}
if (done) {
printf(">>>TIMER_DONE\n");
sys_cb.timer_sta = TIMER_STA_DONE;
if (sys_cb.gui_sleep_sta) {
sys_cb.gui_need_wakeup = 1;
}
sys_cb.motor_flag = 1;
set_func_motor(45, 10, 0, 1);
}
}
//单击按钮
static void func_timer_button_click(void)
{
f_timer_t *f_timer = (f_timer_t*)func_cb.f_cb;
u8 page_next = f_timer->page_disp;
int id = compo_get_button_id();
switch (f_timer->page_disp) {
case TIMER_PAGE_SELECT:
switch (id) {
case COMPO_ID_BTN_1MIN:
case COMPO_ID_BTN_2MIN:
case COMPO_ID_BTN_3MIN:
case COMPO_ID_BTN_5MIN:
case COMPO_ID_BTN_10MIN:
case COMPO_ID_BTN_30MIN:
sys_cb.timer_temp_tick = 0;
sys_cb.timer_left_sec = sys_cb.timer_total_sec = id * 60;
sys_cb.timer_sta = TIMER_STA_RESET;
page_next = TIMER_PAGE_COUNTDOWN;
break;
case COMPO_ID_BTN_CUSTOM:
f_timer->hour = SEC_TO_HOUR(sys_cb.timer_custom_sec);
f_timer->min = SEC_TO_MIN(sys_cb.timer_custom_sec);
f_timer->sec = SEC_TO_SEC(sys_cb.timer_custom_sec);
page_next = TIMER_PAGE_CUSTOM;
break;
default:
break;
}
break;
case TIMER_PAGE_CUSTOM:
switch (id) {
case COMPO_ID_BTN_HOUR_INC:
case COMPO_ID_BTN_HOUR_RED:
f_timer->hour = (f_timer->hour + (id == COMPO_ID_BTN_HOUR_INC ? 1 : -1)) % 24;
f_timer->hour = f_timer->hour < 0 ? 23 : f_timer->hour;
break;
case COMPO_ID_BTN_MIN_INC:
case COMPO_ID_BTN_MIN_RED:
f_timer->min = (f_timer->min + (id == COMPO_ID_BTN_MIN_INC ? 1 : -1)) % 60;
f_timer->min = f_timer->min < 0 ? 59 : f_timer->min;
break;
case COMPO_ID_BTN_SEC_INC:
case COMPO_ID_BTN_SEC_RED:
f_timer->sec = (f_timer->sec + (id == COMPO_ID_BTN_SEC_INC ? 1 : -1)) % 60;
f_timer->sec = f_timer->sec < 0 ? 59 : f_timer->sec;
break;
case COMPO_ID_BTN_OK:
sys_cb.timer_temp_tick = 0;
sys_cb.timer_left_sec = sys_cb.timer_total_sec = sys_cb.timer_custom_sec = f_timer->hour * 3600 + f_timer->min * 60 + f_timer->sec;
if(sys_cb.timer_left_sec ==0 && sys_cb.timer_total_sec == 0 && sys_cb.timer_custom_sec == 0)
{
return;
}
sys_cb.timer_sta = TIMER_STA_RESET;
page_next = TIMER_PAGE_COUNTDOWN;
break;
default:
break;
}
break;
case TIMER_PAGE_COUNTDOWN:
switch (id) {
case COMPO_ID_BTN_START:
if (sys_cb.timer_sta == TIMER_STA_WORKING) {
sys_cb.timer_sta = TIMER_STA_PAUSE;
sys_cb.timer_temp_tick += func_timer_tick_get();
} else if (sys_cb.timer_sta == TIMER_STA_DONE) {
sys_cb.timer_left_sec = sys_cb.timer_total_sec;
sys_cb.timer_temp_tick = 0;
sys_cb.timer_sta = TIMER_STA_WORKING;
func_timer_tick_reset();
co_timer_set(&timer_timer, 100, TIMER_REPEAT, LEVEL_LOW_PRI, timer_100ms_pro, NULL);
} else {
if (sys_cb.timer_sta == TIMER_STA_RESET) {
co_timer_set(&timer_timer, 100, TIMER_REPEAT, LEVEL_LOW_PRI, timer_100ms_pro, NULL);
}
sys_cb.timer_sta = TIMER_STA_WORKING;
func_timer_tick_reset();
}
break;
case COMPO_ID_BTN_NO:
if (sys_cb.timer_sta != TIMER_STA_WORKING) {
co_timer_del(&timer_timer);
sys_cb.timer_sta = TIMER_STA_IDLE;
sys_cb.timer_left_sec = sys_cb.timer_total_sec = 0;
page_next = TIMER_PAGE_SELECT;
}
break;
default:
break;
}
break;
default:
break;
}
func_timer_button_release_handle();
if (page_next != f_timer->page_disp) {
f_timer->page_disp = page_next;
compo_form_destroy(func_cb.frm_main);
func_cb.frm_main = func_timer_form_create_by_type(f_timer->page_disp);
}
// TRACE("page[%d] sta[%d]\n", f_timer->page_disp, sys_cb.timer_sta);
}
//定时器功能事件处理
static void func_timer_process(void)
{
u8 hour, min, sec;
char str_buff[24] = {0};
char done_buff[80] = {0};
compo_textbox_t *txt_num;
compo_button_t *btn;
f_timer_t *f_timer = (f_timer_t*)func_cb.f_cb;
switch (f_timer->page_disp) {
case TIMER_PAGE_CUSTOM:
txt_num = compo_getobj_byid(COMPO_ID_NUM_CUSTOM_HOUR);
snprintf(str_buff, sizeof(str_buff), "%02d", f_timer->hour);
compo_textbox_set(txt_num, str_buff);
txt_num = compo_getobj_byid(COMPO_ID_NUM_CUSTOM_MIN);
snprintf(str_buff, sizeof(str_buff), "%02d",f_timer->min);
compo_textbox_set(txt_num, str_buff);
txt_num = compo_getobj_byid(COMPO_ID_NUM_CUSTOM_SEC);
snprintf(str_buff, sizeof(str_buff), "%02d",f_timer->sec);
compo_textbox_set(txt_num, str_buff);
txt_num = compo_getobj_byid(COMPO_ID_NUM_CUSTOM_COLON);
snprintf(str_buff, sizeof(str_buff), ":");
compo_textbox_set(txt_num, str_buff);
break;
case TIMER_PAGE_COUNTDOWN:
hour = SEC_TO_HOUR(sys_cb.timer_left_sec);
min = SEC_TO_MIN(sys_cb.timer_left_sec);
sec = SEC_TO_SEC(sys_cb.timer_left_sec);
if (f_timer->sec != sec || f_timer->min != min || f_timer->hour != hour) {
f_timer->sec = sec;
f_timer->min = min;
f_timer->hour = hour;
txt_num = compo_getobj_byid(COMPO_ID_NUM_COUNTDOWN);
if (sys_cb.timer_sta == TIMER_STA_DONE) {
compo_textbox_set_font(txt_num, UI_BUF_0FONT_FONT_BIN);
func_timer_finish_text_get(str_buff, sizeof(str_buff));
snprintf(done_buff, sizeof(done_buff), i18n[STR_COUNTDOWN_ENDS], str_buff);
compo_textbox_set(txt_num, done_buff);
} else {
compo_textbox_set_font(txt_num, UI_BUF_0FONT_FONT_NUM_38_BIN);
snprintf(str_buff, sizeof(str_buff), "%02d:%02d:%02d", f_timer->hour, f_timer->min, f_timer->sec);
compo_textbox_set(txt_num, str_buff);
}
}
func_timer_button_release_handle();
break;
default:
break;
}
func_process();
}
static void timer_data_reset(void)
{
if (co_timer_handle_is_valid(&timer_timer)) {
co_timer_del(&timer_timer);
}
sys_cb.timer_sta = TIMER_STA_IDLE;
sys_cb.timer_left_sec = sys_cb.timer_total_sec = 0;
sys_cb.timer_temp_tick = 0;
func_timer_button_release_handle();
}
//定时器功能消息处理
static void func_timer_message(size_msg_t msg)
{
f_timer_t *f_timer = (f_timer_t*)func_cb.f_cb;
switch (msg) {
case MSG_CTP_TOUCH:
break;
case MSG_CTP_CLICK:
func_timer_button_click();
break;
case KU_BACK:
if (sys_cb.timer_sta == TIMER_STA_WORKING) {
sys_cb.timer_sta = TIMER_STA_PAUSE;
sys_cb.timer_temp_tick += func_timer_tick_get();
func_timer_button_release_handle();
} else {
func_message(msg);
if (func_cb.sta != FUNC_TIMER) {
timer_data_reset();
}
}
break;
case KU_LEFT:
break;
case KU_RIGHT:
break;
case MSG_CTP_SHORT_UP:
case MSG_CTP_SHORT_DOWN:
case MSG_CTP_LONG:
func_timer_button_release_handle();
if (func_cb.flag_sort) {
func_message(msg);
}
break;
case MSG_CTP_SHORT_LEFT:
case MSG_CTP_SHORT_RIGHT:
if (sys_cb.timer_sta == TIMER_STA_WORKING) {
sys_cb.timer_sta = TIMER_STA_PAUSE;
sys_cb.timer_temp_tick += func_timer_tick_get();
func_timer_button_release_handle();
} else {
if(f_timer->page_disp == TIMER_PAGE_CUSTOM ||f_timer->page_disp == TIMER_PAGE_COUNTDOWN)
{
sys_cb.timer_sta = TIMER_STA_IDLE;
f_timer->page_disp = TIMER_PAGE_SELECT;
compo_form_destroy(func_cb.frm_main);
func_cb.frm_main = func_timer_form_create_by_type(f_timer->page_disp);
}
else
{
func_message(msg);
}
if (func_cb.sta != FUNC_TIMER) {
timer_data_reset();
}
}
break;
default:
func_message(msg);
break;
}
}
//进入定时器功能
static void func_timer_enter(void)
{
func_cb.f_cb = func_zalloc(sizeof(f_timer_t));
func_cb.frm_main = func_timer_form_create();
f_timer_t *f_timer = (f_timer_t*)func_cb.f_cb;
f_timer->page_disp = sys_cb.timer_sta == TIMER_STA_IDLE ? TIMER_PAGE_SELECT : TIMER_PAGE_COUNTDOWN;
}
//退出定时器功能
static void func_timer_exit(void)
{
bsp_motor_stop(MOTOR_PORT);
}
//定时器功能
void func_timer(void)
{
printf("%s\n", __func__);
func_timer_enter();
while (func_cb.sta == FUNC_TIMER) {
func_timer_process();
func_timer_message(msg_dequeue());
}
func_timer_exit();
}