#include "include.h" #include "func.h" #if TRACE_EN #define TRACE(...) printf(__VA_ARGS__) #else #define TRACE(...) #endif //秒表状态 enum { STOPWATCH_STA_IDLE, STOPWATCH_STA_WORKING, }; //组件ID enum { //按键 COMPO_ID_BTN_RECORD_VIEW = 1, //查看记录 COMPO_ID_BTN_RECORD, //记录当前时间 COMPO_ID_BTN_AFRESH, //重新开始 COMPO_ID_BTN_START_REC, //开始计时 //图像 COMPO_ID_PIC_RECORD_VIEW_CLICK, //按钮触摸效果图 COMPO_ID_PIC_RECORD_CLICK, COMPO_ID_PIC_AFRESH_CLICK, COMPO_ID_PIC_START_REC, COMPO_ID_PIC_START_REC_CLICK, COMPO_ID_PIC_PAUSE_REC, COMPO_ID_PIC_PAUSE_REC_CLICK, //数字 COMPO_ID_NUM_STOPWATCH_REC, //记录数 COMPO_ID_NUM_STOPWATCH_REC_CLICK, //记录数 COMPO_ID_NUM_STOPWATCH_MIN, //分 COMPO_ID_NUM_STOPWATCH_SEC, //秒 COMPO_ID_NUM_STOPWATCH_MSEC, //毫秒 }; typedef struct f_stopwatch_t_ { u8 sta; u8 min; //分 u8 sec; //秒 u8 msec; //毫秒 u32 total_msec; //总毫秒 u32 total_rec; //总计当前记录的个数 } f_stopwatch_t; typedef struct stopwatch_btn_item_t_ { u32 res_addr; u16 btn_id; s16 x; s16 y; bool visible_en; } stopwatch_btn_item_t; #define STOPWATCH_BTN_ITEM_CNT ((int)(sizeof(tbl_stopwatch_btn_item) / sizeof(tbl_stopwatch_btn_item[0]))) //搞个按键item,创建时遍历一下 static const stopwatch_btn_item_t tbl_stopwatch_btn_item[] = { {UI_BUF_STOPWATCH_RECORD1_BIN, COMPO_ID_BTN_RECORD_VIEW, 160, 93, true}, {UI_BUF_STOPWATCH_RECORD_BIN, COMPO_ID_BTN_RECORD, 265, 321, true}, {UI_BUF_STOPWATCH_AFRESH_BIN, COMPO_ID_BTN_AFRESH, 55, 321, true}, }; typedef struct stopwatch_pic_item_t_ { u32 res_addr; u16 pic_id; s16 x; s16 y; bool visible_en; } stopwatch_pic_item_t; #define STOPWATCH_PIC_ITEM_CNT ((int)(sizeof(tbl_stopwatch_pic_item) / sizeof(tbl_stopwatch_pic_item[0]))) //搞个图片item,创建时遍历一下 static const stopwatch_pic_item_t tbl_stopwatch_pic_item[] = { {UI_BUF_STOPWATCH_RECORD1_CLICK_BIN, COMPO_ID_PIC_RECORD_VIEW_CLICK, 160, 93, false}, {UI_BUF_STOPWATCH_RECORD_CLICK_BIN, COMPO_ID_PIC_RECORD_CLICK, 265, 321, false}, {UI_BUF_STOPWATCH_AFRESH_CLICK_BIN, COMPO_ID_PIC_AFRESH_CLICK, 55, 321, false}, {UI_BUF_COMMON_START_BIN, COMPO_ID_PIC_START_REC, 160, 321, true}, {UI_BUF_COMMON_START_CLICK_BIN, COMPO_ID_PIC_START_REC_CLICK, 160, 321, false}, {UI_BUF_COMMON_PAUSE_BIN, COMPO_ID_PIC_PAUSE_REC, 160, 321, false}, {UI_BUF_COMMON_PAUSE_CLICK_BIN, COMPO_ID_PIC_PAUSE_REC_CLICK, 160, 321, false}, }; typedef struct stopwatch_num_item_t_ { u32 res_addr; int num_cnt; u16 num_id; int val; s16 x; s16 y; bool zfill_en; bool visible_en; } stopwatch_num_item_t; #define STOPWATCH_NUM_ITEM_CNT ((int)(sizeof(tbl_stopwatch_num_item) / sizeof(tbl_stopwatch_num_item[0]))) //搞个数字item,创建时遍历一下 static const stopwatch_num_item_t tbl_stopwatch_num_item[] = { /* res_addr, num_cnt, num_id, val, x, y, zfill_en, visible_en*/ {UI_BUF_STOPWATCH_NUM1_16_24_BIN, 2, COMPO_ID_NUM_STOPWATCH_REC, 0, 177, 93, true, true}, {UI_BUF_STOPWATCH_NUM1_16_24_CLICK_BIN, 2, COMPO_ID_NUM_STOPWATCH_REC_CLICK, 0, 177, 93, true, false}, {UI_BUF_COMMON_NUM_30_46_BIN, 2, COMPO_ID_NUM_STOPWATCH_MSEC, 0, 238, 179, true, true}, {UI_BUF_COMMON_NUM_30_46_BIN, 2, COMPO_ID_NUM_STOPWATCH_MIN, 0, 84, 179, true, true}, {UI_BUF_COMMON_NUM_30_46_BIN, 2, COMPO_ID_NUM_STOPWATCH_SEC, 0, 162, 179, true, true}, }; //创建秒表窗体,创建窗体中不要使用功能结构体 func_cb.f_cb compo_form_t *func_stopwatch_form_create(void) { //新建窗体和背景 compo_form_t *frm = compo_form_create(true); compo_form_add_image(frm, UI_BUF_COMMON_COLON_NUM_30_46_BIN, 122, 179); compo_form_add_image(frm, UI_BUF_COMMON_POINT_NUM_30_46_BIN, 198, 198); //新建按钮 compo_button_t *btn; btn = compo_button_create(frm); compo_setid(btn, COMPO_ID_BTN_START_REC); compo_button_set_location(btn, 160, 321, 100, 100); for (u8 idx = 0; idx < STOPWATCH_BTN_ITEM_CNT; idx++) { btn = compo_button_create_by_image(frm, tbl_stopwatch_btn_item[idx].res_addr); compo_setid(btn, tbl_stopwatch_btn_item[idx].btn_id); compo_button_set_pos(btn, tbl_stopwatch_btn_item[idx].x, tbl_stopwatch_btn_item[idx].y); widget_set_visible(btn->widget, tbl_stopwatch_btn_item[idx].visible_en); } //新建图像 compo_picturebox_t *pic_click; for (u8 idx = 0; idx < STOPWATCH_PIC_ITEM_CNT; idx++) { pic_click = compo_picturebox_create(frm, tbl_stopwatch_pic_item[idx].res_addr); compo_setid(pic_click, tbl_stopwatch_pic_item[idx].pic_id); compo_picturebox_set_pos(pic_click, tbl_stopwatch_pic_item[idx].x, tbl_stopwatch_pic_item[idx].y); widget_set_visible(pic_click->img, tbl_stopwatch_pic_item[idx].visible_en); } //创建文本 compo_textbox_t *txt_title = compo_textbox_create(frm, 2); compo_textbox_set_location(txt_title, 30, 22, 80, 40); compo_textbox_set(txt_title, "秒表"); func_text_time_create(frm); //时间文本框 //创建数字 compo_number_t *num; u8 min, sec, msec; min = ((sys_cb.stopwatch_total_msec / 100) % 3600) / 60; sec = (sys_cb.stopwatch_total_msec / 100) % 60; msec = sys_cb.stopwatch_total_msec % 100; for (u8 idx = 0; idx < STOPWATCH_NUM_ITEM_CNT; idx++) { num = compo_number_create(frm, tbl_stopwatch_num_item[idx].res_addr, tbl_stopwatch_num_item[idx].num_cnt); compo_setid(num, tbl_stopwatch_num_item[idx].num_id); compo_number_set_pos(num, tbl_stopwatch_num_item[idx].x, tbl_stopwatch_num_item[idx].y); compo_number_set_zfill(num, tbl_stopwatch_num_item[idx].zfill_en); widget_set_visible(num->page, tbl_stopwatch_num_item[idx].visible_en); if (tbl_stopwatch_num_item[idx].num_id == COMPO_ID_NUM_STOPWATCH_REC) { compo_number_set(num, sys_cb.stopwatch_rec_cnt); } else if (tbl_stopwatch_num_item[idx].num_id == COMPO_ID_NUM_STOPWATCH_MIN) { compo_number_set(num, min); } else if (tbl_stopwatch_num_item[idx].num_id == COMPO_ID_NUM_STOPWATCH_SEC) { compo_number_set(num, sec); } else if (tbl_stopwatch_num_item[idx].num_id == COMPO_ID_NUM_STOPWATCH_MSEC) { compo_number_set(num, msec); } } return frm; } //触摸按钮效果处理 static void func_stopwatch_button_touch_handle(void) { int id = compo_get_button_id(); f_stopwatch_t *f_stopwatch = (f_stopwatch_t *)func_cb.f_cb; //获取图片组件的地址 compo_picturebox_t *pic_rec_view_click = compo_getobj_byid(COMPO_ID_PIC_RECORD_VIEW_CLICK); compo_picturebox_t *pic_rec_click = compo_getobj_byid(COMPO_ID_PIC_RECORD_CLICK); compo_picturebox_t *pic_afresh_click = compo_getobj_byid(COMPO_ID_PIC_AFRESH_CLICK); compo_picturebox_t *pic_start_click = compo_getobj_byid(COMPO_ID_PIC_START_REC_CLICK); compo_picturebox_t *pic_pause_click = compo_getobj_byid(COMPO_ID_PIC_PAUSE_REC_CLICK); //获取数字组件的地址 compo_number_t *num_rec = compo_getobj_byid(COMPO_ID_NUM_STOPWATCH_REC); compo_number_t *num_rec_click = compo_getobj_byid(COMPO_ID_NUM_STOPWATCH_REC_CLICK); switch (id) { case COMPO_ID_BTN_RECORD_VIEW: widget_set_visible(pic_rec_view_click->img, true); widget_set_visible(num_rec->page, false); widget_set_visible(num_rec_click->page, true); break; case COMPO_ID_BTN_RECORD: widget_set_visible(pic_rec_click->img, true); break; case COMPO_ID_BTN_AFRESH: widget_set_visible(pic_afresh_click->img, true); break; case COMPO_ID_BTN_START_REC: if (f_stopwatch->sta == STOPWATCH_STA_IDLE) { widget_set_visible(pic_start_click->img, true); } else if (f_stopwatch->sta == STOPWATCH_STA_WORKING) { widget_set_visible(pic_pause_click->img, true); } break; default: break; } } //释放按钮效果处理 static void func_stopwatch_button_release_handle(void) { //获取图片组件的地址 compo_picturebox_t *pic_rec_view_click = compo_getobj_byid(COMPO_ID_PIC_RECORD_VIEW_CLICK); compo_picturebox_t *pic_rec_click = compo_getobj_byid(COMPO_ID_PIC_RECORD_CLICK); compo_picturebox_t *pic_afresh_click = compo_getobj_byid(COMPO_ID_PIC_AFRESH_CLICK); compo_picturebox_t *pic_start_click = compo_getobj_byid(COMPO_ID_PIC_START_REC_CLICK); compo_picturebox_t *pic_pause_click = compo_getobj_byid(COMPO_ID_PIC_PAUSE_REC_CLICK); widget_set_visible(pic_rec_view_click->img, false); widget_set_visible(pic_rec_click->img, false); widget_set_visible(pic_afresh_click->img, false); widget_set_visible(pic_start_click->img, false); widget_set_visible(pic_pause_click->img, false); //获取数字组件的地址 compo_number_t *num_rec = compo_getobj_byid(COMPO_ID_NUM_STOPWATCH_REC); compo_number_t *num_rec_click = compo_getobj_byid(COMPO_ID_NUM_STOPWATCH_REC_CLICK); widget_set_visible(num_rec_click->page, false); widget_set_visible(num_rec->page, true); } //单击按钮 static void func_stopwatch_button_click(void) { int id = compo_get_button_id(); f_stopwatch_t *f_stopwatch = (f_stopwatch_t *)func_cb.f_cb; //获取图片组件的地址 compo_picturebox_t *pic_pause = compo_getobj_byid(COMPO_ID_PIC_PAUSE_REC); compo_picturebox_t *pic_start = compo_getobj_byid(COMPO_ID_PIC_START_REC); //获取数字组件的地址 compo_number_t *num_rec = compo_getobj_byid(COMPO_ID_NUM_STOPWATCH_REC); compo_number_t *num_rec_click = compo_getobj_byid(COMPO_ID_NUM_STOPWATCH_REC_CLICK); compo_number_t *num_min = compo_getobj_byid(COMPO_ID_NUM_STOPWATCH_MIN); compo_number_t *num_sec = compo_getobj_byid(COMPO_ID_NUM_STOPWATCH_SEC); compo_number_t *num_msec = compo_getobj_byid(COMPO_ID_NUM_STOPWATCH_MSEC); switch (id) { case COMPO_ID_BTN_RECORD_VIEW: sys_cb.stopwatch_total_msec = f_stopwatch->total_msec; func_cb.sta = FUNC_STOPWATCH_SUB_RECORD; break; case COMPO_ID_BTN_RECORD: if (f_stopwatch->total_rec < 8) { f_stopwatch->total_rec++; } else { f_stopwatch->total_rec = 1; } sys_cb.stopwatch_rec_cnt = f_stopwatch->total_rec; sys_cb.stopwatch_rec_view[f_stopwatch->total_rec - 1] = f_stopwatch->total_msec; compo_number_set(num_rec, f_stopwatch->total_rec); compo_number_set(num_rec_click, f_stopwatch->total_rec); break; case COMPO_ID_BTN_AFRESH: f_stopwatch->sta = STOPWATCH_STA_IDLE; f_stopwatch->min = 0; f_stopwatch->sec = 0; f_stopwatch->msec = 0; f_stopwatch->total_msec = 0; f_stopwatch->total_rec = 0; memset(sys_cb.stopwatch_rec_view, 0, sizeof(sys_cb.stopwatch_rec_view)); sys_cb.stopwatch_rec_cnt = 0; sys_cb.stopwatch_total_msec = 0; widget_set_visible(pic_pause->img, false); widget_set_visible(pic_start->img, true); compo_number_set(num_min, f_stopwatch->min); compo_number_set(num_sec, f_stopwatch->sec); compo_number_set(num_msec, f_stopwatch->msec); compo_number_set(num_rec, f_stopwatch->total_rec); compo_number_set(num_rec_click, f_stopwatch->total_rec); break; case COMPO_ID_BTN_START_REC: if (f_stopwatch->sta == STOPWATCH_STA_IDLE) { f_stopwatch->sta = STOPWATCH_STA_WORKING; widget_set_visible(pic_pause->img, true); widget_set_visible(pic_start->img, false); } else if (f_stopwatch->sta == STOPWATCH_STA_WORKING) { f_stopwatch->sta = STOPWATCH_STA_IDLE; widget_set_visible(pic_pause->img, false); widget_set_visible(pic_start->img, true); } break; } func_stopwatch_button_release_handle(); } //秒表功能事件处理 static void func_stopwatch_process(void) { f_stopwatch_t *f_stopwatch = (f_stopwatch_t *)func_cb.f_cb; //获取数字组件的地址 compo_number_t *num_min = compo_getobj_byid(COMPO_ID_NUM_STOPWATCH_MIN); compo_number_t *num_sec = compo_getobj_byid(COMPO_ID_NUM_STOPWATCH_SEC); compo_number_t *num_msec = compo_getobj_byid(COMPO_ID_NUM_STOPWATCH_MSEC); static u32 stopwatch_ticks = 0; if (tick_check_expire(stopwatch_ticks, 10) && f_stopwatch->sta == STOPWATCH_STA_WORKING) { stopwatch_ticks = tick_get(); f_stopwatch->total_msec++; f_stopwatch->min = ((f_stopwatch->total_msec / 100) % 3600) / 60; f_stopwatch->sec = (f_stopwatch->total_msec / 100) % 60; f_stopwatch->msec = f_stopwatch->total_msec % 100; compo_number_set(num_min, f_stopwatch->min); compo_number_set(num_sec, f_stopwatch->sec); compo_number_set(num_msec, f_stopwatch->msec); // printf("total_msec:%d, min:%d, sec:%d, msec:%d\n", f_stopwatch->total_msec, f_stopwatch->min, f_stopwatch->sec, f_stopwatch->msec); } func_process(); } //秒表功能消息处理 static void func_stopwatch_message(size_msg_t msg) { switch (msg) { case MSG_CTP_TOUCH: func_stopwatch_button_touch_handle(); break; case MSG_CTP_CLICK: func_stopwatch_button_click(); break; case MSG_CTP_SHORT_UP: case MSG_CTP_SHORT_DOWN: case MSG_CTP_SHORT_LEFT: case MSG_CTP_LONG: func_stopwatch_button_release_handle(); break; case MSG_CTP_SHORT_RIGHT: func_stopwatch_button_release_handle(); func_switching_to_menu(); //右滑缓慢退出任务 break; case MSG_QDEC_FORWARD: case MSG_QDEC_REVERSE: break; default: func_message(msg); break; } } //进入秒表功能 static void func_stopwatch_enter(void) { func_cb.f_cb = func_zalloc(sizeof(f_stopwatch_t)); func_cb.frm_main = func_stopwatch_form_create(); //恢复上次的数据 f_stopwatch_t *f_stopwatch = (f_stopwatch_t *)func_cb.f_cb; f_stopwatch->total_msec = sys_cb.stopwatch_total_msec; f_stopwatch->total_rec = sys_cb.stopwatch_rec_cnt; } //退出秒表功能 static void func_stopwatch_exit(void) { //保存一下数据 f_stopwatch_t *f_stopwatch = (f_stopwatch_t *)func_cb.f_cb; sys_cb.stopwatch_total_msec = f_stopwatch->total_msec; func_cb.last = FUNC_STOPWATCH; } //秒表功能 void func_stopwatch(void) { printf("%s\n", __func__); func_stopwatch_enter(); while (func_cb.sta == FUNC_STOPWATCH) { func_stopwatch_process(); func_stopwatch_message(msg_dequeue()); } func_stopwatch_exit(); }