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

1157 lines
48 KiB
C
Raw 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 "spirit_island_api.h"
#if TRACE_EN
#define TRACE(...) printf(__VA_ARGS__)
#else
#define TRACE(...)
#endif
static void func_stopwatch_record_pos_update(void);
#define NUM_REC_COLOR make_color(9, 9, 9)
#define NUM_REC_COLOR_LAST make_color(131, 131, 131)
#define LINE_REC_COLOR make_color(160, 160, 160)
#define LINE_REC_COLOR_LAST make_color(192, 192, 192)
#define BIG_SECONDS_CLOCK_X GUI_SCREEN_CENTER_X
#define BIG_SECONDS_CLOCK_Y 140
#define BIG_SECONDS_WIDTH 204
#define BIG_SECONDS_HEIGHT 204
#define BIG_SECONDS_POINTER_WIDTH 12
#define BIG_SECONDS_POINTER_HEIGHT 117
#define BIG_SECONDS_POINTER_OFFSET_X 6
#define BIG_SECONDS_POINTER_OFFSET_Y 100
#define MINUTE_POINTER_OFFSET_X 4
#define MINUTE_POINTER_OFFSET_Y 30
#define MINUTE_CLOCK_X 48
#define SMALL_CLOCK_WIDTH 60
#define SMALL_CLOCK_HEIGHT 60
#define SECONDS_CLOCK_X GUI_SCREEN_CENTER_X
#define SMALL_CLOCK_Y 100
#define SECONDS_POINTER_WIDTH 8
#define SECONDS_HEIGHT 32
#define MILLSECONDS_CLOCK_X 194
#define SMALL_CLOCK_Y 100
#define SMALL_CLOCK_Y2 75
#define SMALL_CLOCK_Y3 35
#define RECODE_LINE_HEIGHT 2
#define RECODE_FIRST_LINE_X 20
#define RECODE_LAST_LINE_X 220
#define RECODE_FIRST_LINE_Y 136
#define RECODE_CENTRE_LINE_Y 168
#define RECODE_LAST_LINE_Y 296
#define RECODE_ITEM_HEIGHT 34
#define RECODE_LIST_HEIGHT 100
#define RECODE_LIST_ROLL_MIN 3
#define RECODE_LIST_BG_X RECODE_FIRST_LINE_X
#define RECODE_LIST_BG_W RECODE_LAST_LINE_X - RECODE_LIST_BG_X
#define RECODE_LIST_NUM_X RECODE_FIRST_LINE_X
#define RECODE_LIST_NUM_W 100
#define RECODE_LIST_DATA_X RECODE_LIST_NUM_X + RECODE_LIST_NUM_W
#define RECODE_LIST_DATA_W RECODE_LIST_BG_W - RECODE_LIST_NUM_W
#define SPRING_Y_MAX 0 // 回弹到顶部时的ofs_y
#define SPRING_Y_MIN (-2 * GUI_SCREEN_HEIGHT) // 回弹到底部时的ofs_y
#define DRAG_Y_MAX (SPRING_Y_MAX) // 拖动到顶部时的ofs_y
#define DRAG_Y_MIN (SPRING_Y_MIN)
#define TIME_BG_X GUI_SCREEN_CENTER_X // 时钟背景
#define TIME_BG_Y 168
#define TIME_BG_W 220
#define TIME_BG_H TIME_BG_W
#define TIME_BG_Y2 130
#define TIME_BG_Y3 95
#define TIME_BG_MAX_H 42
#define TIME_BG_ZOOM_RATIO 230 // (2.3)放大100倍
#define FOCUS_AUTO_TICK_EXPIRE 18 // 松手后自动对齐焦点单位时间(ms)
#define FOCUS_AUTO_STEP 12 // 松手后自动对齐焦点单位时间步进
#define FOCUS_AUTO_STEP_DIV 8
#define FOCUS_AUTO_EXCESS 4 // 回弹延迟距离
#define DRAG_AUTO_SPEED 1 // 拖动松手后的速度(惯性)
#define GUI_PAGE_TIME_WIDTH (GUI_SCREEN_WIDTH * 2 / 5 - 8)
#define GUI_PAGE_NUM (3)
//组件ID
enum
{
/* 记录列表 */
COMPO_ID_LIST_RECORD_BG = 0x01,
COMPO_ID_LIST_RECORD_BG_MAX = COMPO_ID_LIST_RECORD_BG + STOPWATCH_REC_NUM_MAX,
COMPO_ID_LIST_RECORD_NUM,
COMPO_ID_LIST_RECORD_NUM_MAX = COMPO_ID_LIST_RECORD_NUM + STOPWATCH_REC_NUM_MAX,
COMPO_ID_LIST_RECORD_DATA,
COMPO_ID_LIST_RECORD_DATA_MAX = COMPO_ID_LIST_RECORD_DATA + STOPWATCH_REC_NUM_MAX,
COMPO_ID_RECT_BG_UP, // 遮住列表上方矩形区域
COMPO_ID_BIG_SECONDS_CLOCK, // 大秒钟模拟时钟
COMPO_ID_BIG_SECONDS_CLOCK_REC, // 记录指针
COMPO_ID_BIG_SECONDS_CLOCK_POINTER, // 指针
COMPO_ID_MINUTE_CLOCK, // 分钟模拟时钟
COMPO_ID_MINUTE_CLOCK_POINTER, // 指针
COMPO_ID_SECONDS_CLOCK, // 秒钟模拟时钟
COMPO_ID_SECONDS_CLOCK_POINTER, // 秒钟指针
COMPO_ID_MILLSECONDS_CLOCK, // 毫秒模拟时钟
COMPO_ID_MILLSECONDS_CLOCK_POINTER, // 指针
COMPO_ID_BTN_RECORD, // 记录当前时间
COMPO_ID_BTN_AFRESH, // 重新开始
COMPO_ID_BTN_START_REC, // 开始计时
COMPO_ID_NUM_STOPWATCH_TIME, // 当前计时
COMPO_ID_PAGE_INDEX_1, // 当前计时
COMPO_ID_PAGE_INDEX_2, // 当前计时
COMPO_ID_PAGE_INDEX_3, // 当前计时
};
typedef struct f_stopwatch_t_ {
compo_listbox_t *listbox;
u8 min; //分
u8 sec; //秒
u16 msec; //毫秒
/* 分段记录 */
bool list_drag;
s16 list_offset;
s16 list_offset_temp;
s16 list_start_pos;
u32 list_pos_tick;
s32 last_move_y;
s32 last_move_x;
s32 auto_move_y;
u32 tick;
s32 ofs_y;
s32 ofs_y_drag;
s8 focus_card; // 靠近屏幕中央的卡片序号
bool page_drag_flag; // 开始拖动
bool flag_move_auto; // 自动移到坐标
s32 moveto_y; // 设定自动移到的坐标
} f_stopwatch_t;
/* 页面总体位置偏移 */
static s32 stopwatch_ofs_y = 0;
//限制滑动偏移位置
static s16 func_stopwatch_limit_y(s16 ofs_y)
{
ofs_y = MIN(DRAG_Y_MAX, MAX(DRAG_Y_MIN, ofs_y));
// printf("func_stopwatch_limit_y[%d,%d,%d]\n",DRAG_Y_MIN,DRAG_Y_MAX,ofs_y);
return ofs_y;
}
//根据偏移位置把最近的卡片对齐到屏幕中央
static s16 func_stopwatch_align_y(s16 ofs_y)
{
if (ofs_y > DRAG_Y_MIN / 4)
{
ofs_y = 0;
}
else if ((ofs_y >= DRAG_Y_MIN / 2) && (ofs_y < DRAG_Y_MIN / 4))
{
ofs_y = DRAG_Y_MIN / 2;
}
else if ((ofs_y >= DRAG_Y_MIN * 3 / 4) && (ofs_y < DRAG_Y_MIN / 2))
{
ofs_y = DRAG_Y_MIN / 2;
}
else if ((ofs_y < DRAG_Y_MIN * 3 / 4))
{
ofs_y = DRAG_Y_MIN;
}
return (ofs_y);
}
//更新组件位置和大小
static void func_stopwatch_compo_update(s32 ofs_y, bool creating)
{
f_stopwatch_t *f_stopwatch = (f_stopwatch_t *)func_cb.f_cb;
u8 transparent = 0;
s16 x = 0, y = 0, w = 0, h = 0;
compo_shape_t *rect_bg;
compo_cardbox_t *cardbox;
compo_picturebox_t *pic;
component_t *compo = (component_t *)compo_pool_get_top();
while (compo != NULL)
{
// 获取初始值
switch (compo->id)
{
case COMPO_ID_BIG_SECONDS_CLOCK: // 时钟
x = BIG_SECONDS_CLOCK_X;
if ((ofs_y >= DRAG_Y_MIN / 2) && (ofs_y <= 0))
{
y = SMALL_CLOCK_Y2 + (GUI_SCREEN_HEIGHT + ofs_y) * (BIG_SECONDS_CLOCK_Y - SMALL_CLOCK_Y2) / GUI_SCREEN_HEIGHT;
w = SMALL_CLOCK_WIDTH + (GUI_SCREEN_HEIGHT + ofs_y) * (BIG_SECONDS_WIDTH - SMALL_CLOCK_WIDTH) / GUI_SCREEN_HEIGHT;
h = w;
transparent = (GUI_SCREEN_HEIGHT + ofs_y) * (255) / GUI_SCREEN_HEIGHT;
// printf("ofs_y1 = %d,y = %d,w = %d,h = %d\n",ofs_y,y,w,h);
}
else if ((ofs_y >= DRAG_Y_MIN) && (ofs_y < DRAG_Y_MIN / 2))
{
y = SMALL_CLOCK_Y2;
w = SMALL_CLOCK_WIDTH;
h = w;
transparent = 0;
// printf("ofs_y2 = %d,y = %d,w = %d,h = %d\n",ofs_y,y,w,h);
}
pic = (compo_picturebox_t *)compo;
compo_picturebox_set_alpha(pic, transparent);
compo_picturebox_set_pos(pic, x, y);
compo_picturebox_set_size(pic, w, h);
break;
case COMPO_ID_BIG_SECONDS_CLOCK_REC: // 时钟
x = BIG_SECONDS_CLOCK_X;
if ((ofs_y >= DRAG_Y_MIN / 2) && (ofs_y <= 0))
{
y = SMALL_CLOCK_Y2 + (GUI_SCREEN_HEIGHT + ofs_y) * (BIG_SECONDS_CLOCK_Y - SMALL_CLOCK_Y2) / GUI_SCREEN_HEIGHT;
w = SECONDS_POINTER_WIDTH + (GUI_SCREEN_HEIGHT + ofs_y) * (BIG_SECONDS_POINTER_WIDTH - SECONDS_POINTER_WIDTH) / GUI_SCREEN_HEIGHT;
h = SECONDS_HEIGHT + (GUI_SCREEN_HEIGHT + ofs_y) * (BIG_SECONDS_POINTER_HEIGHT - SECONDS_HEIGHT) / GUI_SCREEN_HEIGHT;
transparent = (GUI_SCREEN_HEIGHT + ofs_y) * (255) / GUI_SCREEN_HEIGHT;
// printf("ofs_y1 = %d,y = %d,w = %d,h = %d\n",ofs_y,y,w,h);
}
else if ((ofs_y >= DRAG_Y_MIN) && (ofs_y < DRAG_Y_MIN / 2))
{
y = SMALL_CLOCK_Y2;
w = SECONDS_POINTER_WIDTH;
h = SECONDS_HEIGHT;
transparent = 0;
// printf("ofs_y2 = %d,y = %d,w = %d,h = %d\n",ofs_y,y,w,h);
}
pic = (compo_picturebox_t *)compo;
compo_picturebox_set_alpha(pic, transparent);
compo_picturebox_set_pos(pic, x, y);
compo_picturebox_set_size(pic, w, h);
break;
case COMPO_ID_BIG_SECONDS_CLOCK_POINTER: // 时钟
x = BIG_SECONDS_CLOCK_X;
if ((ofs_y >= DRAG_Y_MIN / 2) && (ofs_y <= 0))
{
y = SMALL_CLOCK_Y2 + (GUI_SCREEN_HEIGHT + ofs_y) * (BIG_SECONDS_CLOCK_Y - SMALL_CLOCK_Y2) / GUI_SCREEN_HEIGHT;
w = SECONDS_POINTER_WIDTH + (GUI_SCREEN_HEIGHT + ofs_y) * (BIG_SECONDS_POINTER_WIDTH - SECONDS_POINTER_WIDTH) / GUI_SCREEN_HEIGHT;
h = SECONDS_HEIGHT + (GUI_SCREEN_HEIGHT + ofs_y) * (BIG_SECONDS_POINTER_HEIGHT - SECONDS_HEIGHT) / GUI_SCREEN_HEIGHT;
transparent = (GUI_SCREEN_HEIGHT + ofs_y) * (255) / GUI_SCREEN_HEIGHT;
}
else if ((ofs_y >= DRAG_Y_MIN) && (ofs_y < DRAG_Y_MIN / 2))
{
y = SMALL_CLOCK_Y2;
w = SECONDS_POINTER_WIDTH;
h = SECONDS_HEIGHT;
transparent = 0;
}
pic = (compo_picturebox_t *)compo;
compo_picturebox_set_alpha(pic, transparent);
compo_picturebox_set_pos(pic, x, y);
compo_picturebox_set_size(pic, w, h);
break;
case COMPO_ID_MINUTE_CLOCK: // 时钟
if ((ofs_y >= DRAG_Y_MIN / 2) && (ofs_y <= 0))
{
x = MINUTE_CLOCK_X + (GUI_SCREEN_HEIGHT + ofs_y) * (BIG_SECONDS_CLOCK_X - MINUTE_CLOCK_X) / GUI_SCREEN_HEIGHT;
y = SMALL_CLOCK_Y2 + (GUI_SCREEN_HEIGHT + ofs_y) * (SMALL_CLOCK_Y - SMALL_CLOCK_Y2) / GUI_SCREEN_HEIGHT;
w = SMALL_CLOCK_WIDTH;
h = w;
transparent = 255;
// printf("ofs_y3 = %d,y = %d,w = %d,h = %d\n",ofs_y,y,w,h);
}
else if ((ofs_y >= DRAG_Y_MIN) && (ofs_y < DRAG_Y_MIN / 2))
{
x = MINUTE_CLOCK_X;
y = SMALL_CLOCK_Y3 + (2 * GUI_SCREEN_HEIGHT + ofs_y) * (SMALL_CLOCK_Y2 - SMALL_CLOCK_Y3) / GUI_SCREEN_HEIGHT;
w = SMALL_CLOCK_WIDTH;
h = w;
transparent = (2 * GUI_SCREEN_HEIGHT + ofs_y) * (128) / GUI_SCREEN_HEIGHT;
// printf("ofs_y4 = %d,y = %d,transparent = %d,h = %d\n", ofs_y, y, transparent, h);
}
pic = (compo_picturebox_t *)compo;
compo_picturebox_set_alpha(pic, transparent);
compo_picturebox_set_pos(pic, x, y);
compo_picturebox_set_size(pic, w, h);
break;
case COMPO_ID_MINUTE_CLOCK_POINTER: // 时钟
if ((ofs_y >= DRAG_Y_MIN / 2) && (ofs_y <= 0))
{
x = MINUTE_CLOCK_X + (GUI_SCREEN_HEIGHT + ofs_y) * (BIG_SECONDS_CLOCK_X - MINUTE_CLOCK_X) / GUI_SCREEN_HEIGHT;
y = SMALL_CLOCK_Y2 + (GUI_SCREEN_HEIGHT + ofs_y) * (SMALL_CLOCK_Y - SMALL_CLOCK_Y2) / GUI_SCREEN_HEIGHT;
transparent = 255;
}
else if ((ofs_y >= DRAG_Y_MIN) && (ofs_y < DRAG_Y_MIN / 2))
{
x = MINUTE_CLOCK_X;
y = SMALL_CLOCK_Y3 + (2 * GUI_SCREEN_HEIGHT + ofs_y) * (SMALL_CLOCK_Y2 - SMALL_CLOCK_Y3) / GUI_SCREEN_HEIGHT;
transparent = (2 * GUI_SCREEN_HEIGHT + ofs_y) * (128) / GUI_SCREEN_HEIGHT;
}
pic = (compo_picturebox_t *)compo;
compo_picturebox_set_alpha(pic, transparent);
compo_picturebox_set_pos(pic, x, y);
break;
case COMPO_ID_SECONDS_CLOCK: // 秒钟
if ((ofs_y >= DRAG_Y_MIN / 2) && (ofs_y <= 0))
{
x = GUI_SCREEN_CENTER_X;
y = SMALL_CLOCK_Y2 + (GUI_SCREEN_HEIGHT + ofs_y) * (SMALL_CLOCK_Y - SMALL_CLOCK_Y2) / GUI_SCREEN_HEIGHT;
w = SMALL_CLOCK_WIDTH;
h = w;
transparent = 255;
}
else if ((ofs_y >= DRAG_Y_MIN) && (ofs_y < DRAG_Y_MIN / 2))
{
x = GUI_SCREEN_CENTER_X;
y = SMALL_CLOCK_Y3 + (2 * GUI_SCREEN_HEIGHT + ofs_y) * (SMALL_CLOCK_Y2 - SMALL_CLOCK_Y3) / GUI_SCREEN_HEIGHT;
transparent = (2 * GUI_SCREEN_HEIGHT + ofs_y) * (128) / GUI_SCREEN_HEIGHT;
w = SMALL_CLOCK_WIDTH;
h = w;
}
pic = (compo_picturebox_t *)compo;
compo_picturebox_set_alpha(pic, transparent);
compo_picturebox_set_pos(pic, x, y);
compo_picturebox_set_size(pic, w, h);
break;
case COMPO_ID_SECONDS_CLOCK_POINTER: // 时钟
if ((ofs_y >= DRAG_Y_MIN / 2) && (ofs_y <= 0))
{
x = GUI_SCREEN_CENTER_X;
y = SMALL_CLOCK_Y2 + (GUI_SCREEN_HEIGHT + ofs_y) * (SMALL_CLOCK_Y - SMALL_CLOCK_Y2) / GUI_SCREEN_HEIGHT;
transparent = 255;
}
else if ((ofs_y >= DRAG_Y_MIN) && (ofs_y < DRAG_Y_MIN / 2))
{
x = GUI_SCREEN_CENTER_X;
y = SMALL_CLOCK_Y3 + (2 * GUI_SCREEN_HEIGHT + ofs_y) * (SMALL_CLOCK_Y2 - SMALL_CLOCK_Y3) / GUI_SCREEN_HEIGHT;
transparent = (2 * GUI_SCREEN_HEIGHT + ofs_y) * (128) / GUI_SCREEN_HEIGHT;
// w = SMALL_CLOCK_WIDTH;
// h = w;
// printf("ofs_y4 = %d,y = %d,w = %d,h = %d\n",ofs_y,y,w,h);
}
pic = (compo_picturebox_t *)compo;
compo_picturebox_set_alpha(pic, transparent);
compo_picturebox_set_pos(pic, x, y);
// compo_picturebox_set_size(pic, w, h);
break;
case COMPO_ID_MILLSECONDS_CLOCK: // 时钟
if ((ofs_y >= DRAG_Y_MIN / 2) && (ofs_y <= 0))
{
x = MILLSECONDS_CLOCK_X - (GUI_SCREEN_HEIGHT + ofs_y) * (MILLSECONDS_CLOCK_X - BIG_SECONDS_CLOCK_X) / GUI_SCREEN_HEIGHT;
y = SMALL_CLOCK_Y2 + (GUI_SCREEN_HEIGHT + ofs_y) * (SMALL_CLOCK_Y - SMALL_CLOCK_Y2) / GUI_SCREEN_HEIGHT;
w = SMALL_CLOCK_WIDTH;
h = w;
transparent = 255;
}
else if ((ofs_y >= DRAG_Y_MIN) && (ofs_y < DRAG_Y_MIN / 2))
{
x = MILLSECONDS_CLOCK_X;
y = SMALL_CLOCK_Y3 + (2 * GUI_SCREEN_HEIGHT + ofs_y) * (SMALL_CLOCK_Y2 - SMALL_CLOCK_Y3) / GUI_SCREEN_HEIGHT;
transparent = (2 * GUI_SCREEN_HEIGHT + ofs_y) * (128) / GUI_SCREEN_HEIGHT;
w = SMALL_CLOCK_WIDTH;
h = w;
// printf("ofs_y6 = %d,y = %d,w = %d,h = %d\n",ofs_y,y,w,h);
}
pic = (compo_picturebox_t *)compo;
compo_picturebox_set_alpha(pic, transparent);
compo_picturebox_set_pos(pic, x, y);
compo_picturebox_set_size(pic, w, h);
break;
case COMPO_ID_MILLSECONDS_CLOCK_POINTER: // 时钟
if ((ofs_y >= DRAG_Y_MIN / 2) && (ofs_y <= 0))
{
x = MILLSECONDS_CLOCK_X - (GUI_SCREEN_HEIGHT + ofs_y) * (MILLSECONDS_CLOCK_X - BIG_SECONDS_CLOCK_X) / GUI_SCREEN_HEIGHT;
y = SMALL_CLOCK_Y2 + (GUI_SCREEN_HEIGHT + ofs_y) * (SMALL_CLOCK_Y - SMALL_CLOCK_Y2) / GUI_SCREEN_HEIGHT;
transparent = 255;
}
else if ((ofs_y >= DRAG_Y_MIN) && (ofs_y < DRAG_Y_MIN / 2))
{
x = MILLSECONDS_CLOCK_X;
y = SMALL_CLOCK_Y3 + (2 * GUI_SCREEN_HEIGHT + ofs_y) * (SMALL_CLOCK_Y2 - SMALL_CLOCK_Y3) / GUI_SCREEN_HEIGHT;
transparent = (2 * GUI_SCREEN_HEIGHT + ofs_y) * (128) / GUI_SCREEN_HEIGHT;
}
pic = (compo_picturebox_t *)compo;
compo_picturebox_set_alpha(pic, transparent);
compo_picturebox_set_pos(pic, x, y);
// compo_picturebox_set_size(pic, w, h);
break;
case COMPO_ID_NUM_STOPWATCH_TIME: // 时钟
cardbox = (compo_cardbox_t *)compo;
if ((ofs_y >= DRAG_Y_MIN / 2) && (ofs_y <= 0))
{
y = TIME_BG_Y2 + (GUI_SCREEN_HEIGHT + ofs_y) * (TIME_BG_Y - TIME_BG_Y2) / GUI_SCREEN_HEIGHT;
}
else if ((ofs_y >= DRAG_Y_MIN) && (ofs_y < DRAG_Y_MIN / 2))
{
y = TIME_BG_Y3 + (2 * GUI_SCREEN_HEIGHT + ofs_y) * (TIME_BG_Y2 - TIME_BG_Y3) / GUI_SCREEN_HEIGHT;
}
/* 根据Y轴坐标计算文本显示大小与Y轴成反比关系 */
if (y > TIME_BG_Y2)
h = w = TIME_BG_W - (((y - TIME_BG_Y2) * TIME_BG_ZOOM_RATIO) / 100);
else
h = w = TIME_BG_W;
compo_cardbox_set_location(cardbox, TIME_BG_X, y, w, h);
break;
case COMPO_ID_PAGE_INDEX_1: // 时钟
pic = (compo_picturebox_t *)compo;
if (ofs_y > DRAG_Y_MIN / 4)
compo_picturebox_set(pic, UI_BUF_STOPWATCH_SELECT_BIN);
else
compo_picturebox_set(pic, UI_BUF_STOPWATCH_UNSELECT_BIN);
break;
case COMPO_ID_PAGE_INDEX_2: // 时钟
pic = (compo_picturebox_t *)compo;
if ((ofs_y >= DRAG_Y_MIN * 3 / 4) && (ofs_y < DRAG_Y_MIN / 4))
compo_picturebox_set(pic, UI_BUF_STOPWATCH_SELECT_BIN);
else
compo_picturebox_set(pic, UI_BUF_STOPWATCH_UNSELECT_BIN);
break;
case COMPO_ID_PAGE_INDEX_3: // 时钟
pic = (compo_picturebox_t *)compo;
if (ofs_y < DRAG_Y_MIN * 3 / 4)
compo_picturebox_set(pic, UI_BUF_STOPWATCH_SELECT_BIN);
else
compo_picturebox_set(pic, UI_BUF_STOPWATCH_UNSELECT_BIN);
break;
/* 打点记录 */
case COMPO_ID_LIST_RECORD_BG:
if ((ofs_y >= DRAG_Y_MIN / 2) && (ofs_y <= 0))
{
y = RECODE_CENTRE_LINE_Y + (GUI_SCREEN_HEIGHT + ofs_y) * (RECODE_LAST_LINE_Y - RECODE_CENTRE_LINE_Y) / GUI_SCREEN_HEIGHT;
f_stopwatch->list_start_pos = y;
func_stopwatch_record_pos_update();
}
else if ((ofs_y >= DRAG_Y_MIN) && (ofs_y < DRAG_Y_MIN / 2))
{
y = RECODE_FIRST_LINE_Y + (2 * GUI_SCREEN_HEIGHT + ofs_y) * (RECODE_CENTRE_LINE_Y - RECODE_FIRST_LINE_Y) / GUI_SCREEN_HEIGHT;
f_stopwatch->list_start_pos = y;
func_stopwatch_record_pos_update();
}
break;
case COMPO_ID_RECT_BG_UP:
rect_bg = (compo_shape_t *)compo;
compo_shape_set_location(rect_bg, 0, 0, GUI_SCREEN_WIDTH, f_stopwatch->list_start_pos);
break;
default:
break;
}
compo = compo_get_next(compo); // 遍历组件
}
}
//设置页面偏移位置
static void func_stopwatch_set_offs(s16 ofs_y)
{
f_stopwatch_t *f_stopwatch = (f_stopwatch_t *)func_cb.f_cb;
stopwatch_ofs_y = ofs_y;
func_stopwatch_compo_update(stopwatch_ofs_y, false);
}
static u32 func_stopwatch_tick_get(void)
{
return sys_cb.stopwatch_tick;
}
static void func_stopwatch_tick_reset(void)
{
sys_cb.stopwatch_tick = 0;
}
/* 判定页面与记录列表拖动事件 */
static void func_stopwatch_record_list_drag_check(void)
{
f_stopwatch_t *f_stopwatch = (f_stopwatch_t *)func_cb.f_cb;
if (f_stopwatch == NULL) {
return;
}
int32_t diff_x, diff_y;
/* 未在拖动前判定是否处于列表可拖动区域 */
if (ctp_get_dxy(&diff_x, &diff_y) &&
stopwatch_ofs_y == DRAG_Y_MIN &&
sys_cb.stopwatch_rec_cnt > RECODE_LIST_ROLL_MIN &&
ctp_get_sxy().x >= RECODE_FIRST_LINE_X && ctp_get_sxy().x <= RECODE_LAST_LINE_X &&
ctp_get_sxy().y >= f_stopwatch->list_start_pos && ctp_get_sxy().y <= RECODE_LAST_LINE_Y)
{
f_stopwatch->list_drag = true;
f_stopwatch->page_drag_flag = false;
}
else if (f_stopwatch->list_drag && !ctp_get_dxy(&diff_x, &diff_y))
{
f_stopwatch->list_drag = false;
f_stopwatch->page_drag_flag = false;
}
}
/* 记录列表位置超出自动恢复 */
static void func_stopwatch_record_self_moving(void)
{
f_stopwatch_t *f_stopwatch = (f_stopwatch_t *)func_cb.f_cb;
if (f_stopwatch == NULL) {
return;
}
if (sys_cb.stopwatch_rec_cnt > RECODE_LIST_ROLL_MIN)
{
if (tick_check_expire(f_stopwatch->list_pos_tick, 5))
{
if (f_stopwatch->list_offset < 0)
{
f_stopwatch->list_offset += 1;
func_stopwatch_record_pos_update();
}
else if ((sys_cb.stopwatch_rec_cnt * RECODE_ITEM_HEIGHT) - f_stopwatch->list_offset < (RECODE_ITEM_HEIGHT * 2))
{
f_stopwatch->list_offset -= 1;
func_stopwatch_record_pos_update();
}
}
}
}
static void func_stopwatch_record_data_update(void)
{
u8 min = 0;
u8 sec = 0;
u16 msec = 0;
char buf[16] = {0};
compo_shape_t *record_bg = NULL;
compo_textbox_t *record_num = NULL;
compo_textbox_t *record_data = NULL;
compo_picturebox_t *rec_ss_pointer = compo_getobj_byid(COMPO_ID_BIG_SECONDS_CLOCK_REC);
if (!sys_cb.stopwatch_rec_cnt) {
for (u8 i = 0; i < STOPWATCH_REC_NUM_MAX; i++) {
record_bg = compo_getobj_byid(COMPO_ID_LIST_RECORD_BG + i);
record_num = compo_getobj_byid(COMPO_ID_LIST_RECORD_NUM + i);
record_data = compo_getobj_byid(COMPO_ID_LIST_RECORD_DATA + i);
if (record_bg == NULL || record_num == NULL || record_data == NULL) break;
compo_shape_set_visible(record_bg, false);
compo_textbox_set_visible(record_num, false);
compo_textbox_set_visible(record_data, false);
}
compo_picturebox_set_visible(rec_ss_pointer, false);
}
else
{
for (u8 i = 0; i < sys_cb.stopwatch_rec_cnt; i++) {
record_bg = compo_getobj_byid(COMPO_ID_LIST_RECORD_BG + i);
record_num = compo_getobj_byid(COMPO_ID_LIST_RECORD_NUM + i);
record_data = compo_getobj_byid(COMPO_ID_LIST_RECORD_DATA + i);
if (record_bg == NULL || record_num == NULL || record_data == NULL) break;
min = ((sys_cb.stopwatch_rec_view[i] / 1000) % 3600) / 60;
sec = (sys_cb.stopwatch_rec_view[i] / 1000) % 60;
msec = sys_cb.stopwatch_rec_view[i] % 1000;
sprintf(buf, i18n[STR_STOPWATCH_SPLIT], sys_cb.stopwatch_rec_cnt - i);
compo_textbox_set(record_num, buf);
memset(buf, 0, sizeof(buf));
sprintf(buf, "%02d:%02d.%02d", min, sec, msec / 10);
compo_textbox_set(record_data, buf);
compo_shape_set_visible(record_bg, true);
compo_textbox_set_visible(record_num, true);
compo_textbox_set_visible(record_data, true);
}
compo_picturebox_set_visible(rec_ss_pointer, true);
}
}
/* 列表触摸滑动 */
static void func_stopwatch_record_touch(void)
{
f_stopwatch_t *f_stopwatch = (f_stopwatch_t *)func_cb.f_cb;
if (f_stopwatch == NULL) {
return;
}
int32_t diff_x, diff_y;
ctp_get_dxy(&diff_x, &diff_y);
if (f_stopwatch->list_drag)
{
diff_y = (diff_y * 13) / 10; // 触摸滑动倍增,根据需要调整
f_stopwatch->list_offset = f_stopwatch->list_offset_temp - diff_y;
/* 上下最大滑动范围限制 */
if (f_stopwatch->list_offset < (RECODE_ITEM_HEIGHT * 2) - RECODE_LIST_HEIGHT)
f_stopwatch->list_offset = (RECODE_ITEM_HEIGHT * 2) - RECODE_LIST_HEIGHT;
if ((sys_cb.stopwatch_rec_cnt * RECODE_ITEM_HEIGHT) - f_stopwatch->list_offset < RECODE_ITEM_HEIGHT)
f_stopwatch->list_offset = (sys_cb.stopwatch_rec_cnt * RECODE_ITEM_HEIGHT) - RECODE_ITEM_HEIGHT;
func_stopwatch_record_pos_update();
}
else
{
f_stopwatch->list_offset_temp = f_stopwatch->list_offset;
}
}
static void func_stopwatch_record_pos_update(void)
{
f_stopwatch_t *f_stopwatch = (f_stopwatch_t *)func_cb.f_cb;
if (f_stopwatch == NULL) {
return;
}
compo_shape_t *record_bg = NULL;
compo_textbox_t *record_num = NULL;
compo_textbox_t *record_data = NULL;
if (!f_stopwatch->list_start_pos) {
f_stopwatch->list_start_pos = GUI_SCREEN_HEIGHT;
}
/* 计算透明度 */
uint8_t alpha = 0;
if (f_stopwatch->list_start_pos > RECODE_CENTRE_LINE_Y) {
alpha = ((255 * 100) - ((f_stopwatch->list_start_pos - RECODE_CENTRE_LINE_Y) * ((255 * 100) / (RECODE_LAST_LINE_Y - RECODE_CENTRE_LINE_Y)))) / 100;
} else {
alpha = 255;
}
for (u8 i = 0; i < sys_cb.stopwatch_rec_cnt; i++) {
record_bg = compo_getobj_byid(COMPO_ID_LIST_RECORD_BG + i);
record_num = compo_getobj_byid(COMPO_ID_LIST_RECORD_NUM + i);
record_data = compo_getobj_byid(COMPO_ID_LIST_RECORD_DATA + i);
if (record_bg == NULL || record_num == NULL || record_data == NULL) break;
if (i == 0) {
compo_shape_set_location(record_bg, RECODE_LIST_BG_X - 5, (f_stopwatch->list_start_pos + RECODE_ITEM_HEIGHT * i), RECODE_LIST_BG_W + 10, RECODE_LINE_HEIGHT);
} else {
compo_shape_set_location(record_bg, RECODE_LIST_BG_X, (f_stopwatch->list_start_pos + RECODE_ITEM_HEIGHT * i) - f_stopwatch->list_offset, RECODE_LIST_BG_W, RECODE_LINE_HEIGHT);
}
compo_textbox_set_location(record_num, RECODE_LIST_NUM_X, ((f_stopwatch->list_start_pos + 6) + RECODE_ITEM_HEIGHT * i) - f_stopwatch->list_offset, RECODE_LIST_NUM_W, RECODE_ITEM_HEIGHT);
compo_textbox_set_location(record_data, RECODE_LIST_DATA_X, ((f_stopwatch->list_start_pos + 6) + RECODE_ITEM_HEIGHT * i) - f_stopwatch->list_offset, RECODE_LIST_DATA_W, RECODE_ITEM_HEIGHT);
compo_shape_set_alpha(record_bg, alpha);
compo_textbox_set_alpha(record_num, alpha);
compo_textbox_set_alpha(record_data, alpha);
}
f_stopwatch->list_pos_tick = tick_get();
}
//创建秒表窗体,创建窗体中不要使用功能结构体 func_cb.f_cb
compo_form_t *func_stopwatch_form_create(void)
{
// 新建窗体和背景
compo_form_t *frm = compo_form_create(true);
compo_shape_t *shape_bg = compo_radius_shape_create(frm, COMPO_SHAPE_TYPE_ROUNDED_RECTANGLE, 26);
compo_shape_set_color(shape_bg, make_color(212, 212, 212));
compo_shape_set_location(shape_bg, GUI_SCREEN_CENTER_X, GUI_SCREEN_CENTER_Y, GUI_SCREEN_WIDTH, GUI_SCREEN_HEIGHT);
/* 分段记录 */
compo_shape_t *line = NULL;
for (u8 i = 0; i < STOPWATCH_REC_NUM_MAX; i++)
{
if (i > 0) {
line = compo_shape_create(frm, COMPO_SHAPE_TYPE_RECTANGLE);
compo_setid(line, COMPO_ID_LIST_RECORD_BG + i);
compo_shape_set_align_center(line, false);
compo_shape_set_visible(line, false);
}
compo_textbox_t *txt_num = compo_textbox_create(frm, 6);
compo_setid(txt_num, COMPO_ID_LIST_RECORD_NUM + i);
compo_textbox_set_font(txt_num, UI_BUF_0FONT_FONT_STOPWATCH_16_BIN);
compo_textbox_set_autosize(txt_num, false);
compo_textbox_set_align_center(txt_num, false);
compo_textbox_set_location(txt_num, RECODE_LIST_NUM_X, (RECODE_FIRST_LINE_Y + 6) + RECODE_ITEM_HEIGHT * i, RECODE_LIST_NUM_W, RECODE_ITEM_HEIGHT);
compo_textbox_set_visible(txt_num, false);
compo_textbox_t *txt_record = compo_textbox_create(frm, 8);
compo_setid(txt_record, COMPO_ID_LIST_RECORD_DATA + i);
compo_textbox_set_font(txt_record, UI_BUF_0FONT_FONT_STOPWATCH_16_BIN);
compo_textbox_set_autosize(txt_record, false);
compo_textbox_set_right_align(txt_record, true);
compo_textbox_set_align_center(txt_record, false);
compo_textbox_set_location(txt_record, RECODE_LIST_DATA_X, (RECODE_FIRST_LINE_Y + 6) + RECODE_ITEM_HEIGHT * i, RECODE_LIST_DATA_W, RECODE_ITEM_HEIGHT);
compo_textbox_set_visible(txt_record, false);
if (i == 0) {
compo_textbox_set_forecolor(txt_num, NUM_REC_COLOR);
compo_textbox_set_forecolor(txt_record, NUM_REC_COLOR);
} else {
compo_shape_set_color(line, LINE_REC_COLOR_LAST);
compo_shape_set_location(line, RECODE_LIST_BG_X, RECODE_FIRST_LINE_Y + RECODE_ITEM_HEIGHT * i, RECODE_LIST_BG_W, RECODE_LINE_HEIGHT);
compo_textbox_set_forecolor(txt_num, NUM_REC_COLOR_LAST);
compo_textbox_set_forecolor(txt_record, NUM_REC_COLOR_LAST);
}
}
line = compo_shape_create(frm, COMPO_SHAPE_TYPE_RECTANGLE);
compo_setid(line, COMPO_ID_LIST_RECORD_BG);
compo_shape_set_color(line, LINE_REC_COLOR);
compo_shape_set_location(line, RECODE_LIST_BG_X - 5, RECODE_FIRST_LINE_Y, RECODE_LIST_BG_W + 10, RECODE_LINE_HEIGHT);
compo_shape_set_align_center(line, false);
compo_shape_set_visible(line, false);
compo_shape_t *shape_up = compo_radius_shape_create(frm, COMPO_SHAPE_TYPE_ROUNDED_RECTANGLE, 26);
compo_setid(shape_up, COMPO_ID_RECT_BG_UP);
compo_shape_set_color(shape_up, make_color(212, 212, 212));
compo_shape_set_location(shape_up, 0, 0, GUI_SCREEN_WIDTH, RECODE_FIRST_LINE_Y);
compo_shape_set_align_center(shape_up, false);
/* 秒表数据部分 */
compo_textbox_t *time = compo_textbox_create(frm, 8); // 时间
compo_bonddata(time, COMPO_BOND_TIME);
compo_textbox_set_location(time, GUI_SCREEN_WIDTH - GUI_PAGE_TIME_WIDTH + 16, GUI_SCREEN_HEIGHT / 8 - FORM_TITLE_HEIGHT + 10, GUI_PAGE_TIME_WIDTH, FORM_TITLE_HEIGHT);
compo_textbox_set_font(time, UI_BUF_FONT_FORM_TIME);
compo_textbox_set_forecolor(time, COLOR_BLACK);
compo_textbox_set_right_align(time, true);
compo_picturebox_t *target_pic = compo_picturebox_create(frm, UI_BUF_STOPWATCH_MS_BIN); // 毫秒圆盘
compo_setid(target_pic, COMPO_ID_MILLSECONDS_CLOCK);
compo_picturebox_set_pos(target_pic, BIG_SECONDS_CLOCK_X, SMALL_CLOCK_Y);
target_pic = compo_picturebox_create(frm, UI_BUF_STOPWATCH_M_POINTER_BIN); // 毫秒指针
compo_setid(target_pic, COMPO_ID_MILLSECONDS_CLOCK_POINTER);
compo_picturebox_set_pos(target_pic, BIG_SECONDS_CLOCK_X, SMALL_CLOCK_Y);
compo_picturebox_set_rotation_center(target_pic, 4, 30);
target_pic = compo_picturebox_create(frm, UI_BUF_STOPWATCH_SS_BIN); // 分钟圆盘
compo_setid(target_pic, COMPO_ID_SECONDS_CLOCK);
compo_picturebox_set_pos(target_pic, BIG_SECONDS_CLOCK_X, SMALL_CLOCK_Y);
target_pic = compo_picturebox_create(frm, UI_BUF_STOPWATCH_M_POINTER_BIN); // 分钟指针
compo_setid(target_pic, COMPO_ID_SECONDS_CLOCK_POINTER);
compo_picturebox_set_pos(target_pic, BIG_SECONDS_CLOCK_X, SMALL_CLOCK_Y);
compo_picturebox_set_rotation_center(target_pic, 4, 30);
target_pic = compo_picturebox_create(frm, UI_BUF_STOPWATCH_BS_BIN); // 大圆
compo_setid(target_pic, COMPO_ID_BIG_SECONDS_CLOCK);
compo_picturebox_set_pos(target_pic, BIG_SECONDS_CLOCK_X, BIG_SECONDS_CLOCK_Y);
target_pic = compo_picturebox_create(frm, UI_BUF_STOPWATCH_MM_BIN); // 分钟圆盘
compo_setid(target_pic, COMPO_ID_MINUTE_CLOCK);
compo_picturebox_set_pos(target_pic, BIG_SECONDS_CLOCK_X, SMALL_CLOCK_Y);
target_pic = compo_picturebox_create(frm, UI_BUF_STOPWATCH_S_POINTER_BIN); // 大圆指针
compo_setid(target_pic, COMPO_ID_BIG_SECONDS_CLOCK_POINTER);
compo_picturebox_set_pos(target_pic, BIG_SECONDS_CLOCK_X, BIG_SECONDS_CLOCK_Y);
compo_picturebox_set_rotation_center(target_pic, BIG_SECONDS_POINTER_OFFSET_X, BIG_SECONDS_POINTER_OFFSET_Y);
compo_picturebox_set_rotation(target_pic, 0);
target_pic = compo_picturebox_create(frm, UI_BUF_STOPWATCH_SUBSECTION_POINTER_BIN);
compo_setid(target_pic, COMPO_ID_BIG_SECONDS_CLOCK_REC);
compo_picturebox_set_pos(target_pic, BIG_SECONDS_CLOCK_X, BIG_SECONDS_CLOCK_Y);
compo_picturebox_set_visible(target_pic, false);
compo_picturebox_set_rotation_center(target_pic, BIG_SECONDS_POINTER_OFFSET_X, BIG_SECONDS_POINTER_OFFSET_Y);
compo_picturebox_set_rotation(target_pic, 0);
target_pic = compo_picturebox_create(frm, UI_BUF_STOPWATCH_M_POINTER_BIN); // 分钟指针
compo_setid(target_pic, COMPO_ID_MINUTE_CLOCK_POINTER);
compo_picturebox_set_pos(target_pic, BIG_SECONDS_CLOCK_X, SMALL_CLOCK_Y);
compo_picturebox_set_rotation_center(target_pic, 4, 30);
compo_picturebox_set_rotation(target_pic, 0);
compo_picturebox_t *page_index_pic = compo_picturebox_create(frm, UI_BUF_STOPWATCH_SELECT_BIN);
compo_setid(page_index_pic, COMPO_ID_PAGE_INDEX_1);
compo_picturebox_set_pos(page_index_pic, 232, 87);
page_index_pic = compo_picturebox_create(frm, UI_BUF_STOPWATCH_UNSELECT_BIN);
compo_setid(page_index_pic, COMPO_ID_PAGE_INDEX_2);
compo_picturebox_set_pos(page_index_pic, 232, 97);
page_index_pic = compo_picturebox_create(frm, UI_BUF_STOPWATCH_UNSELECT_BIN);
compo_setid(page_index_pic, COMPO_ID_PAGE_INDEX_3);
compo_picturebox_set_pos(page_index_pic, 232, 107);
char str_buff[15] = {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;
// 数字秒表文本
uint16_t size = TIME_BG_W - (((TIME_BG_Y - TIME_BG_Y2) * TIME_BG_ZOOM_RATIO) / 100);
compo_cardbox_t *cardbox = compo_cardbox_create(frm, 0, 0, 1, TIME_BG_W, TIME_BG_H);
compo_setid(cardbox, COMPO_ID_NUM_STOPWATCH_TIME);
compo_cardbox_set_location(cardbox, TIME_BG_X, TIME_BG_Y, size, size);
compo_cardbox_text_set_color(cardbox, 0, COLOR_BLACK);
compo_cardbox_text_set_align_center(cardbox, 0, true);
compo_cardbox_text_set_autosize(cardbox, 0, true);
compo_cardbox_text_set_font(cardbox, 0, UI_BUF_0FONT_FONT_NUM_38_BIN);
snprintf(str_buff, sizeof(str_buff), "%02d:%02d.%02d", min, sec, msec / 10);
compo_cardbox_text_set(cardbox, 0, str_buff);
u32 res_addr;
compo_button_t *btn;
res_addr = sys_cb.stopwatch_sta ? UI_BUF_STOPWATCH_SUSPEND_BIN : UI_BUF_STOPWATCH_START_BIN; // 开始/暂停
btn = compo_button_create_by_image(frm, res_addr);
compo_setid(btn, COMPO_ID_BTN_START_REC);
compo_button_set_pos(btn, 202, 253);
btn = compo_button_create_by_image(frm, UI_BUF_STOPWATCH_RESET_BIN); // 复位
compo_setid(btn, COMPO_ID_BTN_AFRESH);
compo_button_set_pos(btn, 37, 253);
compo_button_set_visible(btn, sys_cb.stopwatch_total_msec > 0 && !sys_cb.stopwatch_sta);
btn = compo_button_create_by_image(frm, UI_BUF_STOPWATCH_DEFAULT_BIN); // 计次
compo_setid(btn, COMPO_ID_BTN_RECORD);
compo_button_set_pos(btn, 37, 253);
compo_button_set_alpha(btn, sys_cb.stopwatch_sta ? 255 : 120);
compo_button_set_visible(btn, sys_cb.stopwatch_total_msec == 0 || sys_cb.stopwatch_sta);
return frm;
}
//释放按钮效果处理
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);
u32 res_addr = sys_cb.stopwatch_sta ? UI_BUF_STOPWATCH_SUSPEND_BIN : UI_BUF_STOPWATCH_START_BIN; // 开始/暂停
compo_button_set_bgimg(btn_start, res_addr);
compo_button_set_bgimg(btn_afresh, UI_BUF_STOPWATCH_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_STOPWATCH_DEFAULT_BIN); // 计次
compo_button_set_alpha(btn_record, sys_cb.stopwatch_sta ? 255 : 120);
compo_button_set_visible(btn_record, sys_cb.stopwatch_total_msec == 0 || sys_cb.stopwatch_sta);
func_stopwatch_record_data_update();
}
static void stopwatch_data_reset(void)
{
f_stopwatch_t *f_stopwatch = (f_stopwatch_t *)func_cb.f_cb;
compo_cardbox_t *num_time = compo_getobj_byid(COMPO_ID_NUM_STOPWATCH_TIME);
compo_picturebox_t *mm_pointer = compo_getobj_byid(COMPO_ID_MINUTE_CLOCK_POINTER);
compo_picturebox_t *ss_pointer = compo_getobj_byid(COMPO_ID_SECONDS_CLOCK_POINTER);
compo_picturebox_t *ms_pointer = compo_getobj_byid(COMPO_ID_MILLSECONDS_CLOCK_POINTER);
compo_picturebox_t *rec_ss_pointer = compo_getobj_byid(COMPO_ID_BIG_SECONDS_CLOCK_REC);
compo_picturebox_t *big_ss_pointer = compo_getobj_byid(COMPO_ID_BIG_SECONDS_CLOCK_POINTER);
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_cardbox_text_set(num_time, 0, "00:00.00");
/* 指针复位 */
compo_picturebox_set_rotation(ss_pointer, 0);
compo_picturebox_set_rotation(mm_pointer, 0);
compo_picturebox_set_rotation(ms_pointer, 0);
compo_picturebox_set_rotation(big_ss_pointer, 0);
compo_picturebox_set_rotation(rec_ss_pointer, 0);
compo_picturebox_set_visible(rec_ss_pointer, false);
}
//单击按钮
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;
switch (id)
{
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;
sys_cb.record_msec = sys_cb.stopwatch_total_msec;
func_stopwatch_record_data_update();
f_stopwatch->list_offset = 0;
func_stopwatch_record_pos_update();
compo_picturebox_t *rec_ss_pointer = compo_getobj_byid(COMPO_ID_BIG_SECONDS_CLOCK_REC);
compo_picturebox_set_visible(rec_ss_pointer, true);
}
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;
if (f_stopwatch == NULL)
return;
/* 记录列表事件 */
func_stopwatch_record_list_drag_check();
func_stopwatch_record_touch();
func_stopwatch_record_self_moving();
/* 整体页面拖动事件, 列表拖动时页面不需要移动 */
if (f_stopwatch->page_drag_flag && !f_stopwatch->list_drag)
{
s32 dx, dy;
f_stopwatch->page_drag_flag = ctp_get_dxy(&dx, &dy);
if (f_stopwatch->page_drag_flag)
{
// 拖动页面
f_stopwatch->ofs_y_drag = func_stopwatch_limit_y(stopwatch_ofs_y + dy);
func_stopwatch_compo_update(f_stopwatch->ofs_y_drag, false);
}
else
{
// 抬手
stopwatch_ofs_y = f_stopwatch->ofs_y_drag;
s16 last_dy = ctp_get_last_dxy().y;
s16 to_y = stopwatch_ofs_y;
f_stopwatch->moveto_y = func_stopwatch_align_y(to_y);
f_stopwatch->flag_move_auto = true;
f_stopwatch->tick = tick_get();
}
}
else if (f_stopwatch->flag_move_auto)
{
// 自动移动
if (stopwatch_ofs_y == f_stopwatch->moveto_y)
{
if (stopwatch_ofs_y < SPRING_Y_MIN)
{
f_stopwatch->moveto_y = SPRING_Y_MIN;
}
else if (stopwatch_ofs_y > SPRING_Y_MAX)
{
f_stopwatch->moveto_y = SPRING_Y_MAX;
}
else
{
f_stopwatch->flag_move_auto = false; // 移动完成
}
}
else if (tick_check_expire(f_stopwatch->tick, FOCUS_AUTO_TICK_EXPIRE))
{
s16 dy;
f_stopwatch->tick = tick_get();
dy = f_stopwatch->moveto_y - stopwatch_ofs_y;
if (dy > 0)
{
if (dy > FOCUS_AUTO_STEP * FOCUS_AUTO_STEP_DIV)
{
dy = dy / FOCUS_AUTO_STEP_DIV;
}
else if (dy > FOCUS_AUTO_STEP)
{
dy = FOCUS_AUTO_STEP;
}
}
else if (dy < 0)
{
if (dy < -FOCUS_AUTO_STEP * FOCUS_AUTO_STEP_DIV)
{
dy = dy / FOCUS_AUTO_STEP_DIV;
}
else if (dy < -FOCUS_AUTO_STEP)
{
dy = -FOCUS_AUTO_STEP;
}
}
func_stopwatch_set_offs(stopwatch_ofs_y + dy);
}
}
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;
u8 rec_sec = ((sys_cb.stopwatch_total_msec - sys_cb.record_msec) / 1000) % 60;
u16 rec_msec = (sys_cb.stopwatch_total_msec - sys_cb.record_msec) % 1000;
char str_buff[9];
// 获取数字组件的地址
compo_cardbox_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_cardbox_text_set(num_time, 0, str_buff);
compo_picturebox_t *rec_ss_pointer = compo_getobj_byid(COMPO_ID_BIG_SECONDS_CLOCK_REC);
compo_picturebox_t *big_ss_pointer = compo_getobj_byid(COMPO_ID_BIG_SECONDS_CLOCK_POINTER);
compo_picturebox_t *mm_pointer = compo_getobj_byid(COMPO_ID_MINUTE_CLOCK_POINTER);
compo_picturebox_t *ss_pointer = compo_getobj_byid(COMPO_ID_SECONDS_CLOCK_POINTER);
compo_picturebox_t *ms_pointer = compo_getobj_byid(COMPO_ID_MILLSECONDS_CLOCK_POINTER);
// printf("rotate sec[%d]\n",msec / 10);
compo_picturebox_set_rotation(rec_ss_pointer, (rec_sec * 60 + rec_msec / 100 * 6));
compo_picturebox_set_rotation(big_ss_pointer, (sec * 60 + msec / 100 * 6));
compo_picturebox_set_rotation(ss_pointer, (sec * 60 + msec / 100 * 6));
compo_picturebox_set_rotation(mm_pointer, min * 120 % 3600);
compo_picturebox_set_rotation(ms_pointer, msec / 10 * 36);
}
}
func_process();
}
//秒表功能消息处理
static void func_stopwatch_message(size_msg_t msg)
{
f_stopwatch_t *f_stopwatch = (f_stopwatch_t *)func_cb.f_cb;
switch (msg) {
case MSG_CTP_TOUCH:
f_stopwatch->page_drag_flag = true;
break;
case MSG_CTP_CLICK:
func_stopwatch_button_click();
break;
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();
/* 页面位置偏移 */
stopwatch_ofs_y = 0;
}
}
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();
if (func_cb.flag_sort) {
func_message(msg);
}
break;
case MSG_CTP_SHORT_RIGHT:
/*未开灵动岛的情况,右滑退出暂停计数,走按键退出的逻辑*/
if (!SysVariable.SpiritIslandSwitch && sys_cb.stopwatch_sta)
{
sys_cb.stopwatch_sta = !sys_cb.stopwatch_sta;
func_stopwatch_button_release_handle();
}
else
{
func_stopwatch_button_release_handle();
func_message(msg);
}
break;
case MSG_QDEC_FORWARD: // 向前滚动
break;
case MSG_QDEC_BACKWARD: // 向后滚动
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();
func_stopwatch_record_data_update();
func_stopwatch_compo_update(stopwatch_ofs_y, false);
}
//退出秒表功能
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
}
//秒表功能
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();
}