#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; ianim_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= 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(); }