1157 lines
48 KiB
C
1157 lines
48 KiB
C
#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();
|
||
}
|