#include "include.h" #include "func.h" #include "spirit_island_api.h" #if TRACE_EN #define TRACE(...) printf(__VA_ARGS__) #else #define TRACE(...) #endif #define NUM_REC_COLOR make_color(2, 132, 253) #define NUM_REC_COLOR_PRESS make_color(1, 60, 117) //组件ID enum { //按键 COMPO_ID_BTN_RECORD_VIEW = 1, //查看记录 COMPO_ID_BTN_RECORD, //记录当前时间 COMPO_ID_BTN_AFRESH, //重新开始 COMPO_ID_BTN_START_REC, //开始计时 //数字文本 COMPO_ID_NUM_STOPWATCH_TIME, //当前计时 COMPO_ID_NUM_STOPWATCH_REC, //记录数 COMPO_ID_SHAPE, //矩形 COMPO_ID_LISTBOX, }; typedef struct f_stopwatch_t_ { compo_listbox_t *listbox; u8 min; //分 u8 sec; //秒 u16 msec; //毫秒 } f_stopwatch_t; static u32 func_stopwatch_tick_get(void) { return sys_cb.stopwatch_tick; } static u32 func_stopwatch_tick_reset(void) { sys_cb.stopwatch_tick = 0; } //创建秒表窗体,创建窗体中不要使用功能结构体 func_cb.f_cb compo_form_t *func_stopwatch_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_STOP_WATCH]); // 新建按钮 u32 res_addr; compo_button_t *btn; res_addr = sys_cb.stopwatch_sta ? UI_BUF_COMMON_STOP_BIN : UI_BUF_COMMON_START_BIN; // 开始/暂停 btn = compo_button_create_by_image(frm, res_addr); compo_setid(btn, COMPO_ID_BTN_START_REC); compo_button_set_pos(btn, !sys_cb.stopwatch_total_msec ? GUI_SCREEN_CENTER_X : GUI_SCREEN_CENTER_X + 68, 143 + 30); btn = compo_button_create_by_image(frm, UI_BUF_COMMON_RESET_BIN); // 复位 compo_setid(btn, COMPO_ID_BTN_AFRESH); compo_button_set_pos(btn, GUI_SCREEN_CENTER_X - 68, 143 + 30); compo_button_set_visible(btn, sys_cb.stopwatch_total_msec > 0); btn = compo_button_create_by_image(frm, UI_BUF_COMMON_NODE_BIN); // 计次 compo_setid(btn, COMPO_ID_BTN_RECORD); compo_button_set_pos(btn, GUI_SCREEN_CENTER_X - 68, 143 + 30); compo_button_set_visible(btn, sys_cb.stopwatch_sta != 0); btn = compo_button_create(frm); // 计次详情跳转按钮 compo_setid(btn, COMPO_ID_BTN_RECORD_VIEW); compo_button_set_location(btn, GUI_SCREEN_CENTER_X, 122, GUI_SCREEN_WIDTH, 30); // compo_button_set_pos(btn, GUI_SCREEN_CENTER_X, 130); compo_button_set_visible(btn, sys_cb.stopwatch_rec_cnt > 0); // 创建数字文本 compo_textbox_t *txt_num; char str_buff[30] = {0}; u8 min, sec; u16 msec; min = ((sys_cb.stopwatch_total_msec / 1000) % 3600) / 60; sec = (sys_cb.stopwatch_total_msec / 1000) % 60; msec = sys_cb.stopwatch_total_msec % 1000; // 绿色 compo_shape_t *masklayer; masklayer = compo_radius_shape_create(frm, COMPO_SHAPE_TYPE_ROUNDED_RECTANGLE, 1); compo_shape_set_color(masklayer, make_color(12, 237, 65)); compo_setid(masklayer, COMPO_ID_SHAPE); compo_shape_set_location(masklayer, GUI_SCREEN_CENTER_X, 99, GUI_SCREEN_WIDTH, 2); compo_shape_set_alpha(masklayer, 0); txt_num = compo_textbox_create(frm, 20); // 当前计时 compo_setid(txt_num, COMPO_ID_NUM_STOPWATCH_TIME); compo_textbox_set_location(txt_num, 32, 50, 176, 60); compo_textbox_set_font(txt_num, UI_BUF_0FONT_FONT_NUM_38_BIN); compo_textbox_set_autosize(txt_num, false); compo_textbox_set_align_center(txt_num, false); snprintf(str_buff, sizeof(str_buff), "%02d:%02d:%02d", min, sec, msec / 10); compo_textbox_set(txt_num, str_buff); u8 min_recode = 0; u8 sec_recode = 0; u16 msec_recode = 0; min_recode = ((sys_cb.stopwatch_rec_view[0] / 1000) % 3600) / 60; sec_recode = (sys_cb.stopwatch_rec_view[0] / 1000) % 60; msec_recode = sys_cb.stopwatch_rec_view[0] % 1000; snprintf(str_buff, sizeof(str_buff), "%02d %02d:%02d:%02d", sys_cb.stopwatch_rec_cnt, min_recode, sec_recode, msec_recode / 10); txt_num = compo_textbox_create(frm, 24); // 记录数 compo_setid(txt_num, COMPO_ID_NUM_STOPWATCH_REC); compo_textbox_set_pos(txt_num, GUI_SCREEN_CENTER_X, 122); compo_textbox_set_font(txt_num, UI_BUF_0FONT_FONT_NUM_24_BIN); compo_textbox_set(txt_num, str_buff); compo_textbox_set_visible(txt_num, sys_cb.stopwatch_rec_cnt > 0); return frm; } //触摸按钮效果处理 static void func_stopwatch_button_touch_handle(void) { u32 res_addr; int id = compo_get_button_id(); // 获取按钮组件的地址 compo_button_t *btn_start = compo_getobj_byid(COMPO_ID_BTN_START_REC); compo_button_t *btn_afresh = compo_getobj_byid(COMPO_ID_BTN_AFRESH); compo_button_t *btn_record = compo_getobj_byid(COMPO_ID_BTN_RECORD); compo_button_t *btn_record1 = compo_getobj_byid(COMPO_ID_BTN_RECORD_VIEW); // 获取数字组件的地址 switch (id) { case COMPO_ID_BTN_RECORD_VIEW: break; case COMPO_ID_BTN_RECORD: if (sys_cb.stopwatch_rec_cnt && sys_cb.stopwatch_sta) { } break; case COMPO_ID_BTN_AFRESH: break; case COMPO_ID_BTN_START_REC: res_addr = sys_cb.stopwatch_sta ? UI_BUF_COMMON_STOP_BIN : UI_BUF_COMMON_START_BIN; compo_button_set_bgimg(btn_start, res_addr); compo_button_set_pos(btn_start, !sys_cb.stopwatch_total_msec ? GUI_SCREEN_CENTER_X : GUI_SCREEN_CENTER_X + 68, 143 + 30); break; default: break; } } //释放按钮效果处理 static void func_stopwatch_button_release_handle(void) { // 获取按钮组件的地址 compo_button_t *btn_start = compo_getobj_byid(COMPO_ID_BTN_START_REC); compo_button_t *btn_afresh = compo_getobj_byid(COMPO_ID_BTN_AFRESH); compo_button_t *btn_record = compo_getobj_byid(COMPO_ID_BTN_RECORD); compo_button_t *btn_record1 = compo_getobj_byid(COMPO_ID_BTN_RECORD_VIEW); // compo_shape_t *shape = compo_getobj_byid(COMPO_ID_SHAPE); u32 res_addr = sys_cb.stopwatch_sta ? UI_BUF_COMMON_STOP_BIN : UI_BUF_COMMON_START_BIN; compo_button_set_bgimg(btn_start, res_addr); compo_button_set_pos(btn_start, !sys_cb.stopwatch_total_msec && !sys_cb.stopwatch_sta ? GUI_SCREEN_CENTER_X : GUI_SCREEN_CENTER_X + 68, 143 + 30); compo_button_set_bgimg(btn_afresh, UI_BUF_COMMON_RESET_BIN); // 复位 compo_button_set_visible(btn_afresh, sys_cb.stopwatch_total_msec > 0 || sys_cb.stopwatch_sta); compo_button_set_bgimg(btn_record, UI_BUF_COMMON_NODE_BIN); // 计次 compo_button_set_visible(btn_record, sys_cb.stopwatch_sta != 0); // compo_button_set_bgimg(btn_record1, UI_BUF_STOPWATCH_RECORD1_BIN); //计次详情 compo_button_set_visible(btn_record1, sys_cb.stopwatch_rec_cnt > 0); // compo_shape_set_visible(shape, sys_cb.stopwatch_rec_cnt > 0); // 获取数字组件的地址 compo_textbox_t *num_rec = compo_getobj_byid(COMPO_ID_NUM_STOPWATCH_REC); // compo_textbox_set_forecolor(num_rec, NUM_REC_COLOR); compo_textbox_set_visible(num_rec, sys_cb.stopwatch_rec_cnt > 0); } void stopwatch_data_reset(void) { f_stopwatch_t *f_stopwatch = (f_stopwatch_t *)func_cb.f_cb; compo_textbox_t *num_time = compo_getobj_byid(COMPO_ID_NUM_STOPWATCH_TIME); compo_textbox_t *num_rec = compo_getobj_byid(COMPO_ID_NUM_STOPWATCH_REC); func_stopwatch_tick_reset(); f_stopwatch->min = 0; f_stopwatch->sec = 0; f_stopwatch->msec = 0; memset(sys_cb.stopwatch_rec_view, 0, sizeof(sys_cb.stopwatch_rec_view)); sys_cb.stopwatch_rec_cnt = 0; sys_cb.stopwatch_rec_cnt = 0; sys_cb.stopwatch_temp_msec = 0; sys_cb.stopwatch_total_msec = 0; compo_textbox_set(num_time, "00:00:00"); compo_textbox_set(num_rec, "0"); } //单击按钮 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; char str_buff[30] = {0}; u8 min_recode = 0; u8 sec_recode = 0; u16 msec_recode = 0; // 获取数字组件的地址 compo_textbox_t *num_time = compo_getobj_byid(COMPO_ID_NUM_STOPWATCH_TIME); compo_textbox_t *num_rec = compo_getobj_byid(COMPO_ID_NUM_STOPWATCH_REC); switch (id) { case COMPO_ID_BTN_RECORD_VIEW: if (sys_cb.stopwatch_rec_cnt) { func_switch_to_assign_screen(FUNC_STOPWATCH_SUB_RECORD, false); } break; case COMPO_ID_BTN_RECORD: break; case COMPO_ID_BTN_AFRESH: if (sys_cb.stopwatch_sta == 0) { stopwatch_data_reset(); } else { /* 插入记录到头部 */ sys_cb.stopwatch_rec_cnt += (sys_cb.stopwatch_rec_cnt < STOPWATCH_REC_NUM_MAX); for (u8 i = sys_cb.stopwatch_rec_cnt - 1; i > 0; i--) { sys_cb.stopwatch_rec_view[i] = sys_cb.stopwatch_rec_view[i - 1]; } sys_cb.stopwatch_rec_view[0] = sys_cb.stopwatch_total_msec; min_recode = ((sys_cb.stopwatch_rec_view[0] / 1000) % 3600) / 60; sec_recode = (sys_cb.stopwatch_rec_view[0] / 1000) % 60; msec_recode = sys_cb.stopwatch_rec_view[0] % 1000; // snprintf(str_buff, sizeof(str_buff), "%02d", sys_cb.stopwatch_rec_cnt); snprintf(str_buff, sizeof(str_buff), "%02d %02d:%02d:%02d", sys_cb.stopwatch_rec_cnt, min_recode, sec_recode, msec_recode / 10); compo_textbox_set(num_rec, str_buff); } break; case COMPO_ID_BTN_START_REC: func_stopwatch_tick_reset(); sys_cb.stopwatch_sta = !sys_cb.stopwatch_sta; sys_cb.stopwatch_temp_msec = sys_cb.stopwatch_total_msec; 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_shape_t *masklayer; masklayer = compo_getobj_byid(COMPO_ID_SHAPE); if (f_stopwatch == NULL || masklayer == NULL) return; if (sys_cb.stopwatch_sta) { /* 10ms刷新时间 */ sys_cb.stopwatch_total_msec = sys_cb.stopwatch_temp_msec + func_stopwatch_tick_get(); u8 min = ((sys_cb.stopwatch_total_msec / 1000) % 3600) / 60; u8 sec = (sys_cb.stopwatch_total_msec / 1000) % 60; u16 msec = sys_cb.stopwatch_total_msec % 1000; char str_buff[10]; f_stopwatch_t *f_stopwatch = (f_stopwatch_t *)func_cb.f_cb; // 获取数字组件的地址 compo_textbox_t *num_time = compo_getobj_byid(COMPO_ID_NUM_STOPWATCH_TIME); if (f_stopwatch->msec != msec || f_stopwatch->sec != sec || f_stopwatch->min != min) { f_stopwatch->min = min; f_stopwatch->sec = sec; f_stopwatch->msec = msec; snprintf(str_buff, sizeof(str_buff), "%02d:%02d:%02d", min, sec, msec / 10); compo_textbox_set(num_time, str_buff); } } if (sys_cb.stopwatch_rec_cnt > 0) { compo_shape_set_alpha(masklayer, 255); } else { compo_shape_set_alpha(masklayer, 0); } func_process(); } //秒表功能消息处理 static void func_stopwatch_message(size_msg_t msg) { point_t pt = ctp_get_sxy(); switch (msg) { case MSG_CTP_TOUCH: func_stopwatch_button_touch_handle(); break; case MSG_CTP_CLICK: func_stopwatch_button_click(); break; case MSG_QDEC_FORWARD: case MSG_QDEC_BACKWARD: case KU_LEFT: case KU_RIGHT: break; case KU_BACK: if (sys_cb.stopwatch_sta) { sys_cb.stopwatch_sta = !sys_cb.stopwatch_sta; func_stopwatch_button_release_handle(); } else { func_message(msg); /* 用户主动操作按键退出重置数据 */ if (func_cb.sta != FUNC_STOPWATCH) { stopwatch_data_reset(); } } break; case MSG_CTP_SHORT_UP: case MSG_CTP_SHORT_DOWN: case MSG_CTP_LONG: func_stopwatch_button_release_handle(); if (func_cb.flag_sort) { func_message(msg); } break; // case MSG_CTP_SHORT_LEFT: case MSG_CTP_SHORT_RIGHT: if (pt.y > 143&&pt.x > 0&&pt.x < 120) { break; } else { if (sys_cb.stopwatch_sta) { sys_cb.stopwatch_sta = !sys_cb.stopwatch_sta; func_stopwatch_button_release_handle(); } else { func_message(msg); if (func_cb.sta != FUNC_STOPWATCH) { stopwatch_data_reset(); } } } 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(); } //退出秒表功能 static void func_stopwatch_exit(void) { #ifdef TJD_GUI_SPIRIT_ISLAND_SHOW // if (sys_cb.stopwatch_sta) { // si_activated_task(stopwatch, 0); // } else { // si_delet_task(stopwatch); // } #endif 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(); }