392 lines
15 KiB
C
392 lines
15 KiB
C
#include "include.h"
|
|
#include "func.h"
|
|
#include "app_variable.h"
|
|
|
|
#if TRACE_EN
|
|
#define TRACE(...) printf(__VA_ARGS__)
|
|
#else
|
|
#define TRACE(...)
|
|
#endif
|
|
|
|
|
|
#define FUNC_SLEEP_SIMULATE_DATA_EN 1 //假数据
|
|
#define TODAY_SLEEP_TIME_TXT_MAX 2//16
|
|
#define SLEEP_PROGRESS_BAR_WIDTH 124 //睡眠进度条总长度
|
|
#define SLEEP_CIR_R 22 //睡眠进度条里圆直径
|
|
|
|
|
|
enum
|
|
{
|
|
COMPO_ID_TEXT_DEEP_TIME_HOUR = 1,
|
|
COMPO_ID_TEXT_DEEP_TIME_MIN,
|
|
COMPO_ID_TEXT_LIGHT_TIME_HOUR,
|
|
COMPO_ID_TEXT_LIGHT_TIME_MIN,
|
|
|
|
COMPO_ID_CHART,
|
|
};
|
|
|
|
enum
|
|
{
|
|
CHART_ANIM_STA_IDLE,
|
|
CHART_ANIM_STA_START,
|
|
CHART_ANIM_STA_END,
|
|
|
|
};
|
|
|
|
typedef struct f_sleep_t_ {
|
|
page_tp_move_t *ptm;
|
|
|
|
u8 anim_sta;
|
|
u16 data[7];
|
|
u16 lsleep_x; //潜睡x偏移
|
|
u16 dsleep_x; //深睡x偏移
|
|
} f_sleep_t;
|
|
|
|
|
|
#if FUNC_SLEEP_SIMULATE_DATA_EN
|
|
static const uint16_t total_sleep_time[] = {8*60+30, 9*60+40, 7*60+20, 10*60+30, 5*60+10, 0, 8*60+30}; //min
|
|
#endif
|
|
|
|
//创建睡眠窗体,创建窗体中不要使用功能结构体 func_cb.f_cb
|
|
compo_form_t *func_sleep_form_create(void)
|
|
{
|
|
component_t *compo;
|
|
char buf[16];
|
|
|
|
//新建窗体和背景
|
|
compo_form_t *frm = compo_form_create(true);
|
|
f_sleep_t *f_sleep = (f_sleep_t *)func_cb.f_cb;
|
|
|
|
|
|
//设置标题栏
|
|
compo_form_set_title(frm, i18n[STR_SLEEP]);
|
|
compo_form_set_mode(frm, COMPO_FORM_MODE_SHOW_TITLE | COMPO_FORM_MODE_SHOW_TIME);
|
|
|
|
// SysVariable.sleep.lightTime = 80;
|
|
// SysVariable.sleep.deepTime = 320;
|
|
f_sleep->lsleep_x = SysVariable.sleep.lightTime /2;
|
|
f_sleep->dsleep_x = SysVariable.sleep.deepTime;
|
|
|
|
if(f_sleep->lsleep_x > (SLEEP_PROGRESS_BAR_WIDTH - SLEEP_CIR_R))
|
|
{
|
|
f_sleep->lsleep_x =(SLEEP_PROGRESS_BAR_WIDTH - SLEEP_CIR_R);
|
|
}
|
|
if(f_sleep->dsleep_x > (SLEEP_PROGRESS_BAR_WIDTH - SLEEP_CIR_R))
|
|
{
|
|
f_sleep->dsleep_x =(SLEEP_PROGRESS_BAR_WIDTH - SLEEP_CIR_R);
|
|
}
|
|
|
|
compo_form_add_image(frm, UI_BUF_SLEEP_SLEEP_BIN, GUI_SCREEN_CENTER_X, 34+29);
|
|
|
|
//创建动画
|
|
// compo_animation_t *animation = compo_animation_create(frm, UI_BUF_SLEEP_SLEEP_BIN);
|
|
// compo_animation_set_pos(animation, GUI_SCREEN_CENTER_X, 64+55);
|
|
// compo_animation_set_radix(animation, 1);
|
|
// compo_animation_set_interval(animation, 100);
|
|
|
|
|
|
// 下方小时间图标 【用来记录几点入睡,几点清醒】 代码暂不支持,故不作
|
|
compo_picturebox_t *pic = compo_picturebox_create(frm, UI_BUF_COMMON_TIME_BIN);
|
|
compo_picturebox_set_size(pic,15,15);
|
|
compo_picturebox_set_pos(pic, GUI_SCREEN_CENTER_X-40, GUI_SCREEN_HEIGHT-20);
|
|
// compo_form_add_image(pic, UI_BUF_COMMON_TIME_BIN, GUI_SCREEN_CENTER_X-40, GUI_SCREEN_HEIGHT-20);
|
|
|
|
//检测时间
|
|
compo_textbox_t *txt_time = compo_textbox_create(frm, 13);
|
|
// compo_textbox_set_location(txt_time, GUI_SCREEN_CENTER_X, 266+10, GUI_SCREEN_CENTER_X, 30);
|
|
compo_textbox_set_pos(txt_time, GUI_SCREEN_CENTER_X +5, GUI_SCREEN_HEIGHT-20);
|
|
// if(SysVariable.deviceInfo.timeType == TIME_TYPE_12_HOUR)
|
|
// compo_textbox_set(txt_time, "10:00-8:00");
|
|
// else
|
|
compo_textbox_set(txt_time, "22:00-8:00");
|
|
|
|
|
|
//睡眠日总时长详情
|
|
compo = (component_t *)compo_textbox_create(frm, TODAY_SLEEP_TIME_TXT_MAX);
|
|
compo_textbox_set_font((compo_textbox_t *)compo, UI_BUF_0FONT_FONT_DIN_PRO_NUM_20_BIN);
|
|
compo_setid(compo, COMPO_ID_TEXT_DEEP_TIME_HOUR);
|
|
compo_textbox_set_pos((compo_textbox_t *)compo, GUI_SCREEN_CENTER_X-35, 113);
|
|
snprintf(buf, sizeof(buf), "%02d", SysVariable.sleep.totalTime / 60);
|
|
compo_textbox_set((compo_textbox_t *)compo, buf);
|
|
|
|
compo = (component_t *)compo_textbox_create(frm, TODAY_SLEEP_TIME_TXT_MAX);
|
|
compo_textbox_set_font((compo_textbox_t *)compo, UI_BUF_0FONT_FONT_DIN_PRO_NUM_20_BIN);
|
|
compo_textbox_set_pos((compo_textbox_t *)compo, GUI_SCREEN_CENTER_X-15, 113);
|
|
snprintf(buf, sizeof(buf), "%s", "H");
|
|
compo_textbox_set((compo_textbox_t *)compo, buf);
|
|
|
|
compo = (component_t *)compo_textbox_create(frm, TODAY_SLEEP_TIME_TXT_MAX);
|
|
compo_textbox_set_font((compo_textbox_t *)compo, UI_BUF_0FONT_FONT_DIN_PRO_NUM_20_BIN);
|
|
compo_setid(compo, COMPO_ID_TEXT_DEEP_TIME_MIN);
|
|
compo_textbox_set_pos((compo_textbox_t *)compo, GUI_SCREEN_CENTER_X+10, 113);
|
|
snprintf(buf, sizeof(buf), "%02d", SysVariable.sleep.totalTime % 60);
|
|
compo_textbox_set((compo_textbox_t *)compo, buf);
|
|
|
|
compo = (component_t *)compo_textbox_create(frm, TODAY_SLEEP_TIME_TXT_MAX);
|
|
compo_textbox_set_font((compo_textbox_t *)compo, UI_BUF_0FONT_FONT_DIN_PRO_NUM_20_BIN);
|
|
compo_textbox_set_pos((compo_textbox_t *)compo, GUI_SCREEN_CENTER_X+30, 113);
|
|
compo_textbox_set((compo_textbox_t *)compo, "M");
|
|
|
|
|
|
//创建潜睡 淡紫色 圆角矩形底框
|
|
compo_shape_t *lsleep_btn ;
|
|
lsleep_btn = compo_radius_shape_create(frm, COMPO_SHAPE_TYPE_ROUNDED_RECTANGLE,SLEEP_CIR_R/2);
|
|
compo_shape_set_color(lsleep_btn, make_color(116, 116, 255));
|
|
// compo_setid(lsleep_btn, COMPO_ID_BTN_GREEN);
|
|
compo_shape_set_location(lsleep_btn, GUI_SCREEN_CENTER_X, GUI_SCREEN_HEIGHT-FORM_TITLE_HEIGHT+38+SLEEP_CIR_R/2, SLEEP_PROGRESS_BAR_WIDTH, SLEEP_CIR_R);
|
|
compo_shape_set_alpha(lsleep_btn,182);
|
|
|
|
|
|
//创建潜睡 淡紫色 进度条
|
|
compo_shape_t *lsleep_shape ;
|
|
lsleep_shape = compo_radius_shape_create(frm, COMPO_SHAPE_TYPE_ROUNDED_RECTANGLE,SLEEP_CIR_R/2);
|
|
compo_shape_set_align_center(lsleep_shape,false);
|
|
compo_shape_set_color(lsleep_shape, make_color(116, 116, 255));
|
|
compo_shape_set_location(lsleep_shape, (GUI_SCREEN_WIDTH -SLEEP_PROGRESS_BAR_WIDTH)/2, GUI_SCREEN_HEIGHT-FORM_TITLE_HEIGHT+38, f_sleep->lsleep_x+SLEEP_CIR_R, SLEEP_CIR_R);
|
|
|
|
//小图标
|
|
compo_form_add_image(frm, UI_BUF_SLEEP_ICON_LIGHT_BIN, (GUI_SCREEN_WIDTH -SLEEP_PROGRESS_BAR_WIDTH)/2+SLEEP_CIR_R/2, GUI_SCREEN_HEIGHT-FORM_TITLE_HEIGHT+38+SLEEP_CIR_R/2);
|
|
|
|
//今日浅睡睡眠时长
|
|
compo = (component_t *)compo_textbox_create(frm, TODAY_SLEEP_TIME_TXT_MAX);
|
|
compo_textbox_set_font((compo_textbox_t *)compo, UI_BUF_0FONT_FONT_BIN);
|
|
compo_setid(compo, COMPO_ID_TEXT_LIGHT_TIME_HOUR);
|
|
compo_textbox_set_pos((compo_textbox_t *)compo, GUI_SCREEN_WIDTH-65, GUI_SCREEN_HEIGHT-FORM_TITLE_HEIGHT+38+SLEEP_CIR_R/2);
|
|
snprintf(buf, sizeof(buf), "%02d", SysVariable.sleep.lightTime/ 60);
|
|
compo_textbox_set((compo_textbox_t *)compo, buf);
|
|
|
|
compo = (component_t *)compo_textbox_create(frm, TODAY_SLEEP_TIME_TXT_MAX);
|
|
compo_textbox_set_pos((compo_textbox_t *)compo, GUI_SCREEN_WIDTH-50, GUI_SCREEN_HEIGHT-FORM_TITLE_HEIGHT+38+SLEEP_CIR_R/2);
|
|
compo_textbox_set((compo_textbox_t *)compo, "H");
|
|
|
|
compo = (component_t *)compo_textbox_create(frm, TODAY_SLEEP_TIME_TXT_MAX);
|
|
compo_textbox_set_font((compo_textbox_t *)compo, UI_BUF_0FONT_FONT_BIN);
|
|
compo_setid(compo, COMPO_ID_TEXT_LIGHT_TIME_MIN);
|
|
compo_textbox_set_pos((compo_textbox_t *)compo, GUI_SCREEN_WIDTH-35, GUI_SCREEN_HEIGHT-FORM_TITLE_HEIGHT+38+SLEEP_CIR_R/2);
|
|
snprintf(buf, sizeof(buf), "%02d", SysVariable.sleep.lightTime % 60);
|
|
compo_textbox_set((compo_textbox_t *)compo, buf);
|
|
|
|
compo = (component_t *)compo_textbox_create(frm, TODAY_SLEEP_TIME_TXT_MAX);
|
|
compo_textbox_set_pos((compo_textbox_t *)compo, GUI_SCREEN_WIDTH-20, GUI_SCREEN_HEIGHT-FORM_TITLE_HEIGHT+38+SLEEP_CIR_R/2);
|
|
compo_textbox_set((compo_textbox_t *)compo, "M");
|
|
|
|
|
|
//创建深睡 深紫色 圆角矩形底框
|
|
compo_shape_t *dsleep_btn ;
|
|
dsleep_btn = compo_radius_shape_create(frm, COMPO_SHAPE_TYPE_ROUNDED_RECTANGLE,SLEEP_CIR_R/2);
|
|
compo_shape_set_color(dsleep_btn, make_color(146, 81, 255));
|
|
// compo_setid(dsleep_btn, COMPO_ID_BTN_GREEN);
|
|
compo_shape_set_location(dsleep_btn, GUI_SCREEN_CENTER_X, GUI_SCREEN_HEIGHT-FORM_TITLE_HEIGHT+90+SLEEP_CIR_R/2, SLEEP_PROGRESS_BAR_WIDTH, SLEEP_CIR_R);
|
|
compo_shape_set_alpha(dsleep_btn,182);
|
|
|
|
//创建深睡 深紫色 进度条
|
|
compo_shape_t *dsleep_shape ;
|
|
dsleep_shape = compo_radius_shape_create(frm, COMPO_SHAPE_TYPE_ROUNDED_RECTANGLE,SLEEP_CIR_R/2);
|
|
compo_shape_set_align_center(dsleep_shape,false);
|
|
compo_shape_set_color(dsleep_shape, make_color(146, 81, 255));
|
|
compo_shape_set_location(dsleep_shape, (GUI_SCREEN_WIDTH -SLEEP_PROGRESS_BAR_WIDTH)/2, GUI_SCREEN_HEIGHT-FORM_TITLE_HEIGHT+90, f_sleep->dsleep_x+SLEEP_CIR_R, SLEEP_CIR_R);
|
|
|
|
//小图标
|
|
compo_form_add_image(frm, UI_BUF_SLEEP_ICON_DEEP_BIN, (GUI_SCREEN_WIDTH -SLEEP_PROGRESS_BAR_WIDTH)/2+SLEEP_CIR_R/2, GUI_SCREEN_HEIGHT-FORM_TITLE_HEIGHT+90+SLEEP_CIR_R/2);
|
|
|
|
//今日深度睡眠时长
|
|
compo = (component_t *)compo_textbox_create(frm, TODAY_SLEEP_TIME_TXT_MAX);
|
|
compo_textbox_set_font((compo_textbox_t *)compo, UI_BUF_0FONT_FONT_BIN);
|
|
compo_setid(compo, COMPO_ID_TEXT_DEEP_TIME_HOUR);
|
|
compo_textbox_set_pos((compo_textbox_t *)compo, GUI_SCREEN_WIDTH-65, GUI_SCREEN_HEIGHT-FORM_TITLE_HEIGHT+90+SLEEP_CIR_R/2);
|
|
snprintf(buf, sizeof(buf), "%02d", SysVariable.sleep.deepTime / 60);
|
|
compo_textbox_set((compo_textbox_t *)compo, buf);
|
|
|
|
compo = (component_t *)compo_textbox_create(frm, TODAY_SLEEP_TIME_TXT_MAX);
|
|
// compo_textbox_set_font((compo_textbox_t *)compo, UI_BUF_0FONT_FONT_DIN_PRO_NUM_20_BIN);
|
|
compo_textbox_set_pos((compo_textbox_t *)compo, GUI_SCREEN_WIDTH-50, GUI_SCREEN_HEIGHT-FORM_TITLE_HEIGHT+90+SLEEP_CIR_R/2);
|
|
compo_textbox_set((compo_textbox_t *)compo, "H");
|
|
|
|
compo = (component_t *)compo_textbox_create(frm, TODAY_SLEEP_TIME_TXT_MAX);
|
|
compo_textbox_set_font((compo_textbox_t *)compo, UI_BUF_0FONT_FONT_BIN);
|
|
compo_setid(compo, COMPO_ID_TEXT_DEEP_TIME_MIN);
|
|
compo_textbox_set_pos((compo_textbox_t *)compo, GUI_SCREEN_WIDTH-35, GUI_SCREEN_HEIGHT-FORM_TITLE_HEIGHT+90+SLEEP_CIR_R/2);
|
|
snprintf(buf, sizeof(buf), "%02d", SysVariable.sleep.deepTime % 60);
|
|
compo_textbox_set((compo_textbox_t *)compo, buf);
|
|
|
|
compo = (component_t *)compo_textbox_create(frm, TODAY_SLEEP_TIME_TXT_MAX);
|
|
compo_textbox_set_pos((compo_textbox_t *)compo, GUI_SCREEN_WIDTH-20, GUI_SCREEN_HEIGHT-FORM_TITLE_HEIGHT+90+SLEEP_CIR_R/2);
|
|
compo_textbox_set((compo_textbox_t *)compo, "M");
|
|
|
|
|
|
#if (!FUNC_SLEEP_SIMULATE_DATA_EN)
|
|
uint16_t total_sleep_time[2] = {0};
|
|
#endif
|
|
|
|
//创建图表
|
|
// compo_chartbox_t *chart = compo_chartbox_create(frm, CHART_TYPE_BAR, 7);
|
|
// compo_chartbox_set_location(chart, 180, 597, 230, 200);
|
|
// compo_chartbox_set_pixel(chart, 2);
|
|
// compo_setid(chart, COMPO_ID_CHART);
|
|
|
|
return frm;
|
|
}
|
|
|
|
//刷新睡眠数据
|
|
// static void func_sleep_data_refresh(void)
|
|
// {
|
|
// #if (!FUNC_SLEEP_SIMULATE_DATA_EN)
|
|
// uint16_t total_sleep_time[2] = {0};
|
|
// #endif
|
|
|
|
// f_sleep_t *f_sleep = (f_sleep_t *)func_cb.f_cb;
|
|
// for (int i=0; i<7; i++) {
|
|
// f_sleep->data[i] = total_sleep_time[i] * 20 * 6 / (12 * 60) / 2;
|
|
// }
|
|
|
|
//更新图表数据
|
|
// compo_chartbox_t *chart = compo_getobj_byid(COMPO_ID_CHART);
|
|
// u8 max_num = compo_chartbox_get_max_num(chart);
|
|
//
|
|
// chart_t chart_info;
|
|
// chart_info.y = 0;
|
|
// chart_info.width = 5; //5 * pixel(2) = 10像素点
|
|
// for (int i=0; i<max_num; i++) {
|
|
// chart_info.x = i*17 + 1;
|
|
// chart_info.height = total_sleep_time[i] * 20 * 6 / (12 * 60) / 2;
|
|
// compo_chartbox_set_value(chart, i, chart_info, COLOR_BLUE);
|
|
// }
|
|
|
|
// }
|
|
|
|
//睡眠图表动画
|
|
static void func_sleep_animation(void)
|
|
{
|
|
f_sleep_t *f_sleep = (f_sleep_t *)func_cb.f_cb;
|
|
if (f_sleep->anim_sta == CHART_ANIM_STA_END) {
|
|
return;
|
|
}
|
|
compo_chartbox_t *chart = compo_getobj_byid(COMPO_ID_CHART);
|
|
u8 max_num = compo_chartbox_get_max_num(chart);
|
|
|
|
chart_t chart_info;
|
|
chart_info.y = 0;
|
|
chart_info.width = 5; //5 * pixel(2) = 10像素点
|
|
|
|
static u8 anim_cnt;
|
|
static u32 ticks;
|
|
if(tick_check_expire(ticks, 10)) {
|
|
ticks = tick_get();
|
|
|
|
switch (f_sleep->anim_sta) {
|
|
case CHART_ANIM_STA_IDLE:
|
|
// printf("sleep_get_offs:%d\n", compo_page_move_get_offset(f_sleep->ptm));
|
|
if (compo_page_move_get_offset(f_sleep->ptm) < -300) {
|
|
anim_cnt = 0;
|
|
f_sleep->anim_sta = CHART_ANIM_STA_START;
|
|
}
|
|
break;
|
|
|
|
case CHART_ANIM_STA_START:
|
|
for (int i=0; i<max_num; i++) {
|
|
if (i == 0 && ++anim_cnt >= 255) { //图表数据最大时退出动画
|
|
f_sleep->anim_sta = CHART_ANIM_STA_END;
|
|
}
|
|
if (anim_cnt > f_sleep->data[i]) {
|
|
continue;
|
|
}
|
|
chart_info.x = i*17 + 1;
|
|
chart_info.height = anim_cnt;
|
|
compo_chartbox_set_value(chart, i, chart_info, COLOR_BLUE);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
//睡眠功能消息处理
|
|
static void func_sleep_process(void)
|
|
{
|
|
f_sleep_t *f_sleep = (f_sleep_t *)func_cb.f_cb;
|
|
|
|
compo_page_move_process(f_sleep->ptm);
|
|
func_sleep_animation();
|
|
func_process();
|
|
}
|
|
|
|
static void func_sleep_message(size_msg_t msg)
|
|
{
|
|
f_sleep_t *f_sleep = (f_sleep_t *)func_cb.f_cb;
|
|
|
|
switch (msg) {
|
|
case MSG_CTP_TOUCH:
|
|
compo_page_move_touch_handler(f_sleep->ptm);
|
|
break;
|
|
|
|
case MSG_CTP_CLICK:
|
|
case MSG_CTP_SHORT_UP:
|
|
case MSG_CTP_SHORT_DOWN:
|
|
case MSG_CTP_LONG:
|
|
break;
|
|
|
|
case MSG_QDEC_BACKWARD:
|
|
if (func_cb.flag_sort) { //快捷应用状态下不滚动页面
|
|
func_message(msg);
|
|
} else {
|
|
compo_page_move_set_by_pages(f_sleep->ptm, -1);
|
|
}
|
|
break;
|
|
|
|
case MSG_QDEC_FORWARD:
|
|
if (func_cb.flag_sort) {
|
|
func_message(msg);
|
|
} else {
|
|
compo_page_move_set_by_pages(f_sleep->ptm, 1);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
func_message(msg);
|
|
break;
|
|
}
|
|
}
|
|
|
|
//进入睡眠功能
|
|
static void func_sleep_enter(void)
|
|
{
|
|
func_cb.f_cb = func_zalloc(sizeof(f_sleep_t));
|
|
func_cb.frm_main = func_sleep_form_create();
|
|
|
|
f_sleep_t *f_sleep = (f_sleep_t *)func_cb.f_cb;
|
|
f_sleep->ptm = (page_tp_move_t *)func_zalloc(sizeof(page_tp_move_t));
|
|
page_move_info_t info = {
|
|
.title_used = true,
|
|
.page_size = (GUI_SCREEN_HEIGHT - (GUI_SCREEN_HEIGHT / 8))*2-FORM_TITLE_HEIGHT,
|
|
.page_count = 1,
|
|
// .jump_perc = 10,
|
|
// .quick_jump_perc = 100,
|
|
.up_over_perc = 10,
|
|
.down_over_perc = 10,
|
|
};
|
|
compo_page_move_init(f_sleep->ptm, func_cb.frm_main->page_body, &info);
|
|
|
|
|
|
// func_sleep_data_refresh();
|
|
}
|
|
|
|
//退出睡眠功能
|
|
static void func_sleep_exit(void)
|
|
{
|
|
f_sleep_t *f_sleep = (f_sleep_t *)func_cb.f_cb;
|
|
if (f_sleep->ptm) {
|
|
func_free(f_sleep->ptm);
|
|
}
|
|
}
|
|
|
|
//睡眠功能
|
|
void func_sleep(void)
|
|
{
|
|
printf("%s\n", __func__);
|
|
func_sleep_enter();
|
|
while (func_cb.sta == FUNC_SLEEP) {
|
|
func_sleep_process();
|
|
func_sleep_message(msg_dequeue());
|
|
}
|
|
func_sleep_exit();
|
|
}
|