/* * Copyright (c) @CompanyNameMagicTag. 2023. All rights reserved. */ #include "activity.h" #include "lv_demo_watch_font.h" #if LV_USE_DEMO_WATCH #define CIRCLE_GROUP_WIDTH (LV_HOR_RES / 2) #define CIRCLE_GROUP_HEIGHT (LV_VER_RES / 3) #define OUT_LABEL_W (LV_HOR_RES / 2) #define OUT_LABEL_H (GROUP_DEFAULT_H / 4) lv_obj_t* g_label = NULL; lv_obj_t* g_label2 = NULL; static LvPageInfo g_pageInfo; static void ActivityPreloadCb(lv_obj_t* obj) { LV_LOGI("callback %s func\n", __FUNCTION__); } static void ActivityUnloadCb(lv_obj_t* obj) { LV_LOGI("callback %s func\n", __FUNCTION__); } static void ActivityScrollBeginCb(lv_obj_t* obj, bool isActive) { LV_LOGI("callback[%s]: OBJ[%p] IsActive[%d]\n", __FUNCTION__, obj, isActive); } static void ActivityScrollEndCb(lv_obj_t* obj, bool isActive) { LV_LOGI("callback[%s]: OBJ[%p] IsActive[%d]\n", __FUNCTION__, obj, isActive); } static void ActivityCoverBeginCb(lv_obj_t* obj, bool isCovered) { LV_LOGI("callback[%s]: OBJ[%p] isCovered[%d]\n", __FUNCTION__, obj, isCovered); } static void ActivityCoverEndCb(lv_obj_t* obj, bool isCovered) { LV_LOGI("callback[%s]: OBJ[%p] isCovered[%d]\n", __FUNCTION__, obj, isCovered); } LvPageInfo* GetActivityPageInfo() { g_pageInfo.preload = ActivityPreloadCb; g_pageInfo.unload = ActivityUnloadCb; g_pageInfo.scrollBegin = ActivityScrollBeginCb; g_pageInfo.scrollEnd = ActivityScrollEndCb; g_pageInfo.coverBegin = ActivityCoverBeginCb; g_pageInfo.coverEnd = ActivityCoverEndCb; return &g_pageInfo; } static void SetOutAngle(lv_obj_t* obj, int32_t v) { lv_arc_set_value(obj, v); lv_label_set_text_fmt(g_label, "%d/500", v * 500 / 100); // 500: max Calories value; 100: circle animator max value } static void SetInAngle(lv_obj_t* obj, int32_t v) { lv_arc_set_value(obj, v); lv_label_set_text_fmt(g_label2, "%d/30", v * 30 / 100); // 30: max timer value; 100: circle animator max value } static lv_obj_t* CreateArc(lv_obj_t* parent) { if (parent == NULL) { return NULL; } lv_obj_t* circle = lv_arc_create(parent); if (circle == NULL) { return NULL; } lv_arc_set_rotation(circle, 270); // 270: angle lv_arc_set_bg_angles(circle, 0, 360); // 360: angle lv_arc_set_value(circle, 0); lv_obj_remove_style(circle, NULL, LV_PART_KNOB); lv_obj_center(circle); lv_obj_clear_flag(circle, LV_OBJ_FLAG_CLICKABLE); lv_obj_clear_flag(circle, LV_OBJ_FLAG_SCROLLABLE); return circle; } static lv_obj_t* CreateArcTitleLabel(lv_obj_t* parent, const char* text) { if (parent == NULL) { return NULL; } static lv_style_t sty; lv_style_init(&sty); lv_style_set_text_opa(&sty, LV_OPA_100); lv_style_set_text_color(&sty, lv_palette_main(LV_PALETTE_GREY)); lv_style_set_text_font(&sty, GetLvFont(14)); // 14: size lv_obj_t* label = lv_label_create(parent); lv_obj_add_style(label, &sty, 0); lv_label_set_long_mode(label, LV_LABEL_LONG_WRAP); lv_obj_set_size(label, LV_HOR_RES / 2, CIRCLE_GROUP_HEIGHT / 4); // 2, 4: divider if (text != NULL) { lv_label_set_text(label, text); } return label; } static void InitAnimInfo(lv_obj_t* obj, void* var, lv_anim_exec_xcb_t execCb, uint32_t duration, uint32_t delay) { lv_anim_init(obj); lv_anim_set_var(obj, var); lv_anim_set_exec_cb(obj, execCb); lv_anim_set_time(obj, duration); lv_anim_set_repeat_count(obj, LV_ANIM_REPEAT_INFINITE); lv_anim_set_repeat_delay(obj, delay); lv_anim_set_values(obj, 0, 100); // 100: end values return; } static void CreateCircleProgress(lv_obj_t* parent) { static lv_style_t groupStyle; lv_style_init(&groupStyle); lv_style_set_bg_color(&groupStyle, lv_color_black()); lv_style_set_bg_opa(&groupStyle, LV_OPA_100); lv_style_set_pad_all(&groupStyle, 0); lv_style_set_border_opa(&groupStyle, LV_OPA_0); lv_style_set_border_width(&groupStyle, 0); lv_style_set_pad_all(&groupStyle, 2); // 2: pad value lv_obj_t* circleGroup = lv_obj_create(parent); lv_obj_set_size(circleGroup, CIRCLE_GROUP_WIDTH, CIRCLE_GROUP_HEIGHT); lv_obj_add_style(circleGroup, &groupStyle, LV_STATE_DEFAULT); lv_obj_align_to(circleGroup, parent, LV_ALIGN_TOP_LEFT, 0, LV_VER_RES / 7); // 7: divider lv_obj_clear_flag(circleGroup, LV_OBJ_FLAG_SCROLLABLE); lv_obj_clear_flag(circleGroup, LV_OBJ_FLAG_CLICKABLE); lv_obj_t* outArc = CreateArc(circleGroup); lv_coord_t temp = CIRCLE_GROUP_WIDTH < CIRCLE_GROUP_HEIGHT ? CIRCLE_GROUP_WIDTH : CIRCLE_GROUP_HEIGHT; lv_obj_set_size(outArc, temp, temp); lv_obj_set_style_arc_color(outArc, lv_palette_main(LV_PALETTE_PINK), LV_PART_INDICATOR); lv_obj_set_style_arc_color(outArc, lv_palette_main(LV_PALETTE_GREY), LV_PART_MAIN); g_label = lv_label_create(parent); lv_label_set_long_mode(g_label, LV_LABEL_LONG_WRAP); lv_obj_set_size(g_label, LV_HOR_RES / 2, CIRCLE_GROUP_HEIGHT / 4); // 2, 4: divider lv_obj_align_to(g_label, outArc, LV_ALIGN_OUT_RIGHT_TOP, 10, CIRCLE_GROUP_HEIGHT / 4); // 10: offset; 4: divider lv_label_set_text_fmt(g_label, "%d/500", 0); lv_obj_t* titleLabel = CreateArcTitleLabel(parent, "Calories(KCAL)"); lv_obj_align_to(titleLabel, outArc, LV_ALIGN_OUT_RIGHT_TOP, 10, 0); // 10: offset lv_anim_t a; InitAnimInfo(&a, outArc, SetOutAngle, 3000, 500); // 500 : delay time 3000: duration time lv_anim_start(&a); lv_obj_t* inArc = CreateArc(circleGroup); lv_obj_set_size(inArc, temp * 3 / 4, temp * 3 / 4); // 3, 4: ratio lv_obj_set_style_arc_color(inArc, lv_palette_main(LV_PALETTE_GREEN), LV_PART_INDICATOR); lv_obj_set_style_arc_color(inArc, lv_palette_main(LV_PALETTE_GREY), LV_PART_MAIN); lv_obj_t* titleLabel2 = CreateArcTitleLabel(parent, "Time(MIN)"); // 10: offset; 2, 4: ratio lv_obj_align_to(titleLabel2, outArc, LV_ALIGN_OUT_RIGHT_TOP, 10, CIRCLE_GROUP_HEIGHT * 2 / 4); g_label2 = lv_label_create(parent); lv_obj_set_style_text_color(g_label2, lv_palette_main(LV_PALETTE_GREEN), 0); lv_obj_set_style_text_opa(g_label2, LV_OPA_100, 0); lv_label_set_long_mode(g_label2, LV_LABEL_LONG_WRAP); lv_obj_set_size(g_label2, LV_HOR_RES / 2, CIRCLE_GROUP_HEIGHT / 4); // 2, 4: ratio // 10: offset; 3, 4: ratio lv_obj_align_to(g_label2, outArc, LV_ALIGN_OUT_RIGHT_TOP, 10, CIRCLE_GROUP_HEIGHT * 3 / 4); lv_label_set_text_fmt(g_label2, "%d/30", 0); lv_anim_t b; InitAnimInfo(&b, inArc, SetInAngle, 5000, 500); // 500 : delay time 5000: duration time lv_anim_start(&b); } static lv_obj_t* CreateTitleLabel(lv_obj_t* parent) { if (parent == NULL) { return NULL; } static lv_style_t titleLabelStyle; lv_style_init(&titleLabelStyle); lv_style_set_text_font(&titleLabelStyle, GetLvFont(22)); // 22: size lv_style_set_bg_opa(&titleLabelStyle, LV_OPA_0); lv_style_set_text_color(&titleLabelStyle, lv_color_white()); lv_obj_t* activityLabel = lv_label_create(parent); lv_obj_add_style(activityLabel, &titleLabelStyle, 0); lv_label_set_text(activityLabel, "Activity"); lv_obj_set_align(activityLabel, LV_ALIGN_TOP_LEFT); lv_obj_clear_flag(activityLabel, LV_OBJ_FLAG_SCROLLABLE); return activityLabel; } static lv_obj_t* CreateTimeLabel(lv_obj_t* parent) { if (parent == NULL) { return NULL; } static lv_style_t timeLabelStyle; lv_style_init(&timeLabelStyle); lv_style_set_text_font(&timeLabelStyle, GetLvFont(22)); // 22: size lv_style_set_bg_opa(&timeLabelStyle, LV_OPA_0); lv_style_set_text_color(&timeLabelStyle, lv_color_white()); lv_style_set_text_align(&timeLabelStyle, LV_TEXT_ALIGN_RIGHT); lv_obj_t* timeLabel = lv_label_create(parent); lv_obj_add_style(timeLabel, &timeLabelStyle, 0); lv_label_set_text(timeLabel, "10:03"); lv_obj_set_align(timeLabel, LV_ALIGN_TOP_RIGHT); lv_obj_clear_flag(timeLabel, LV_OBJ_FLAG_SCROLLABLE); return timeLabel; } void LvglCreateActivity(lv_obj_t* parent) { static lv_style_t rootViewStyle; lv_style_init(&rootViewStyle); lv_style_set_bg_color(&rootViewStyle, lv_color_black()); lv_style_set_bg_opa(&rootViewStyle, LV_OPA_100); lv_style_set_pad_all(&rootViewStyle, 0); lv_style_set_border_opa(&rootViewStyle, LV_OPA_0); lv_style_set_border_width(&rootViewStyle, 0); lv_style_set_text_color(&rootViewStyle, lv_palette_main(LV_PALETTE_RED)); lv_style_set_text_font(&rootViewStyle, GetLvFont(22)); // 22: size lv_style_set_pad_left(&rootViewStyle, 12); // 12: padding lv_style_set_pad_right(&rootViewStyle, 12); // 12: padding lv_style_set_pad_top(&rootViewStyle, 6); // 6: padding lv_style_set_pad_bottom(&rootViewStyle, 6); // 6: padding lv_obj_add_style(parent, &rootViewStyle, LV_STATE_DEFAULT); CreateTitleLabel(parent); CreateTimeLabel(parent); CreateCircleProgress(parent); } #endif