#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 220 //睡眠进度条总长度 #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, COMPO_ID_TXT_TIME, }; 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_textbox_t *txt_title; txt_title = compo_textbox_create(frm, 30); compo_textbox_set(txt_title,i18n[STR_SLEEP]); compo_textbox_set_pos(txt_title, GUI_SCREEN_CENTER_X, 18); //睡眠中间大图标 compo_form_add_image(frm, UI_BUF_SLEEP_SLEEP_BIN, GUI_SCREEN_CENTER_X, 43 + 56); // //检测时间 // 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, 266+10); // 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, 266+10); // } // else // { // compo_textbox_set(txt_time, "22:00-8:00"); // // 下方小时间图标 【用来记录几点入睡,几点清醒】 代码暂不支持,故不作 // compo_picturebox_set_pos(pic, 61+10, 266+10); // } //第二页上方睡眠文字 txt_title = compo_textbox_create(frm, 30); compo_textbox_set(txt_title,i18n[STR_SLEEP]); compo_textbox_set_pos(txt_title, GUI_SCREEN_CENTER_X, 41 + GUI_SCREEN_HEIGHT); //第二页上方时间 char buf_time[10] = {0}; if (SysVariable.deviceInfo.timeType == TIME_TYPE_12_HOUR) sprintf(buf_time, "%02d:%02d%s", get_autoformat_hour(SysVariable.Rtc.hour), SysVariable.Rtc.min, SysVariable.Rtc.hour >= 12 ? "PM" : "AM"); else sprintf(buf_time, "%02d:%02d", SysVariable.Rtc.hour, SysVariable.Rtc.min); compo_textbox_t *txt_time = compo_textbox_create(frm, 8); compo_setid(txt_time, COMPO_ID_TXT_TIME); compo_textbox_set_location(txt_time, GUI_SCREEN_CENTER_X, 20 + GUI_SCREEN_HEIGHT, 0, 0); compo_textbox_set_autosize(txt_time, true); compo_textbox_set(txt_time, buf_time); compo_textbox_set_visible(txt_time, true); //睡眠日总时长详情 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, 177); 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, 177); 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, 177); 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, 177); 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+88+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+88, 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+88+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, 140, GUI_SCREEN_HEIGHT+88+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, 160, GUI_SCREEN_HEIGHT+88+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, 180, GUI_SCREEN_HEIGHT+88+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, 200, GUI_SCREEN_HEIGHT+88+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+138+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+138, 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+138+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, 140, GUI_SCREEN_HEIGHT+138+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_NUM_38_BIN); compo_textbox_set_pos((compo_textbox_t *)compo, 160, GUI_SCREEN_HEIGHT+138+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, 180, GUI_SCREEN_HEIGHT+138+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, 200, GUI_SCREEN_HEIGHT+138+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; 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_title = (compo_textbox_t *)compo_getobj_byid(COMPO_ID_TXT_TIME); char buf_time[10] = {0}; static u32 tick = 0; if (tick_check_expire(tick, 500)) { tick = tick_get(); if (SysVariable.deviceInfo.timeType == TIME_TYPE_12_HOUR) sprintf(buf_time, "%02d:%02d%s", get_autoformat_hour(SysVariable.Rtc.hour), SysVariable.Rtc.min, SysVariable.Rtc.hour >= 12 ? "PM" : "AM"); else sprintf(buf_time, "%02d:%02d", SysVariable.Rtc.hour, SysVariable.Rtc.min); if(txt_time_title ) compo_textbox_set(txt_time_title, buf_time); } // 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, 266+10); // } // } // else{ // if(txt_time) // { // compo_textbox_set(txt_time, "22:00-8:00"); // } // if(pic) // { // compo_picturebox_set_pos(pic, 61+10, 266+10); // } // } } //睡眠功能消息处理 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 = false, .page_size = GUI_SCREEN_HEIGHT, .page_count = 1, .page_count = 2, .jump_perc = 1, .quick_jump_perc = 0, .up_over_perc = 0, .down_over_perc = 0, }; compo_page_move_init(f_sleep->ptm, func_cb.frm_main->page_body, &info); 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); } func_cb.last = FUNC_SLEEP; } //睡眠功能 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(); }