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

421 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 232 //睡眠进度条总长度
#define SLEEP_CIR_R 26 //睡眠进度条里圆直径
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,
COMPO_ID_TEXT_AMPM_TIME,
COMPO_ID_PIC_SLEEP_SMALL_ICON,
};
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];
} 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);
u16 lsleep_x, dsleep_x;
lsleep_x = SysVariable.sleep.lightTime / 2;
dsleep_x = SysVariable.sleep.deepTime;
if (lsleep_x > (SLEEP_PROGRESS_BAR_WIDTH - SLEEP_CIR_R))
lsleep_x = (SLEEP_PROGRESS_BAR_WIDTH - SLEEP_CIR_R);
if (dsleep_x > (SLEEP_PROGRESS_BAR_WIDTH - SLEEP_CIR_R))
dsleep_x = (SLEEP_PROGRESS_BAR_WIDTH - SLEEP_CIR_R);
//设置标题栏
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;
compo_form_add_image(frm, UI_BUF_SLEEP_SLEEP_BIN, GUI_SCREEN_CENTER_X, 64+55);
//创建动画
// 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_textbox_t *txt_time = compo_textbox_create(frm, 16);
compo_setid(txt_time, COMPO_ID_TEXT_AMPM_TIME);
// 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, 264);
compo_picturebox_t *pic = compo_picturebox_create(frm, UI_BUF_COMMON_TIME_BIN);
compo_setid(pic, COMPO_ID_PIC_SLEEP_SMALL_ICON);
if(SysVariable.deviceInfo.timeType == TIME_TYPE_12_HOUR)
{
compo_textbox_set(txt_time, "10:00PM-8:00AM");
compo_picturebox_set_pos(pic, 61+10 -20, 264);
}
else
{
compo_textbox_set(txt_time, "22:00-8:00");
// 下方小时间图标 【用来记录几点入睡,几点清醒】 代码暂不支持,故不作
compo_picturebox_set_pos(pic, 61+10, 264);
}
//睡眠日总时长详情
compo = (component_t *)compo_textbox_create(frm, TODAY_SLEEP_TIME_TXT_MAX);
compo_textbox_set_font((compo_textbox_t *)compo, UI_BUF_0FONT_FONT_NUM_38_BIN);
compo_setid(compo, COMPO_ID_TEXT_DEEP_TIME_HOUR);
compo_textbox_set_pos((compo_textbox_t *)compo, 53, 211);
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_NUM_38_BIN);
compo_textbox_set_pos((compo_textbox_t *)compo, 83 + 16, 211);
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_NUM_38_BIN);
compo_setid(compo, COMPO_ID_TEXT_DEEP_TIME_MIN);
compo_textbox_set_pos((compo_textbox_t *)compo, 128 + 18, 211);
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_NUM_38_BIN);
compo_textbox_set_pos((compo_textbox_t *)compo, 173 + 20, 211);
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, 266+95+6, 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, 266 + 95 + 6 - SLEEP_CIR_R / 2, lsleep_x + SLEEP_CIR_R, SLEEP_CIR_R);
//小图标
compo_form_add_image(frm, UI_BUF_SLEEP_ICON_LIGHT_BIN, 4+13, 266+95+6);
//今日浅睡睡眠时长
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, 140, 266+95+6);
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, 160, 266+95+6);
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, 180, 266+95+6);
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, 200, 266+95+6);
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, 266+165+6, 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, 266 + 165 + 6 - SLEEP_CIR_R / 2, dsleep_x + SLEEP_CIR_R, SLEEP_CIR_R);
//小图标
compo_form_add_image(frm, UI_BUF_SLEEP_ICON_DEEP_BIN, 4+13, 266+165+6);
//今日深度睡眠时长
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, 140, 266+165+6);
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_NUM_38_BIN);
compo_textbox_set_pos((compo_textbox_t *)compo, 160, 266+165+6);
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, 180, 266+165+6);
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, 200, 266+165+6);
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_timetype_refresh(void)
{
compo_textbox_t *txt_time = (compo_textbox_t *)compo_getobj_byid(COMPO_ID_TEXT_AMPM_TIME);
compo_picturebox_t *pic = (compo_picturebox_t *)compo_getobj_byid(COMPO_ID_PIC_SLEEP_SMALL_ICON);
if(SysVariable.deviceInfo.timeType == TIME_TYPE_12_HOUR)
{
if(txt_time)
{
compo_textbox_set(txt_time, "10:00PM-8:00AM");
}
if(pic)
{
compo_picturebox_set_pos(pic, 61+10 -20, 264);
}
}
else{
if(txt_time)
{
compo_textbox_set(txt_time, "22:00-8:00");
}
if(pic)
{
compo_picturebox_set_pos(pic, 61+10, 264);
}
}
}
//睡眠功能消息处理
static void func_sleep_process(void)
{
f_sleep_t *f_sleep = (f_sleep_t *)func_cb.f_cb;
func_sleep_timetype_refresh();
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-30,
.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();
}