时钟实现代码


/*
 * Project: vdtools
 * Module: module_name
 * File: Untitled-1
 * Created Date: 2023-08-09 14:44:31
 * Author: vdtools
 * Description: description
 * -----
 * todo: modified
 * -----
 * Copyright (c) 2021 - vDiscovery, Inc
 */

/* ======================================================================================
 * log
 */
#define LOG_ENABLE_DEBUG (1)

/* ======================================================================================
 * includes
 */
#include "app_time.h"

#include "base.h"
#include "lvgl.h"
#include "lvgl_json.h"
#include "src/resource/app_resource.h"

/* ======================================================================================
 * macros
 */
LV_FONT_DECLARE(my_font_104)
/* ======================================================================================
 * types
 */

/* ======================================================================================
 * declaration
 */

vd_void_t app_time_on_create(lv_obj_t* scr, app_scr_info_t data);
vd_void_t app_time_on_update(lv_obj_t* scr, app_scr_info_t data);
vd_void_t app_time_on_destroy(lv_obj_t* scr);

/* ======================================================================================
 * globals
 */
static lv_obj_t* img_bac     = vd_null;
static lv_obj_t* label_time  = vd_null;
static lv_obj_t* label_am_pm = vd_null;
static lv_obj_t* time_bg_img = vd_null;

static lv_obj_t* time_h_img = vd_null;
static lv_obj_t* time_m_img = vd_null;
static lv_obj_t* time_s_img = vd_null;
/* ======================================================================================
 * helper
 */
vd_uint8_t timetheme = 0;
/* ======================================================================================
 * private implementation
 */
static void my_anim_s(lv_obj_t* obj, lv_coord_t y) {
    lv_img_set_angle(obj, y);
    if (lv_img_get_angle(obj) == 0) {
        struct timeval tv;
        time_t         time;
        gettimeofday(&tv, NULL);  //获取系统时间,并保存到tv中,注意这里可以精确到微秒
        time              = tv.tv_sec;
        struct tm* p_time = localtime(&time);
        lv_img_set_angle(time_m_img, p_time->tm_min * 60);
        lv_img_set_angle(time_h_img, p_time->tm_hour * 300 + (p_time->tm_min * 5));
    }
}
void lv_time_ready_cb(lv_anim_t* a) {
    lv_anim_t anim1;
    lv_anim_init(&anim1);
    lv_anim_set_var(&anim1, time_s_img);
    lv_anim_set_exec_cb(&anim1, (lv_anim_exec_xcb_t)my_anim_s);
    lv_anim_set_ready_cb(&anim1, lv_time_ready_cb);
    lv_anim_set_time(&anim1, 60000);
    lv_anim_set_values(&anim1, 0, 3600);
    lv_anim_set_repeat_count(&anim1, LV_ANIM_REPEAT_INFINITE);
    lv_anim_start(&anim1);
}
static void my_timer_cb(lv_timer_t* timer) {
    struct timeval tv;
    time_t         time;
    gettimeofday(&tv, NULL);  //获取系统时间,并保存到tv中,注意这里可以精确到微秒
    time              = tv.tv_sec;
    struct tm* p_time = localtime(&time);
    if (timetheme == TIME_MODE_2) {
        lv_label_set_text_fmt(label_time, "#ffffff %02d:%02d", p_time->tm_hour % 12, p_time->tm_min);
        if (p_time->tm_hour > 12) {
            lv_label_set_text(label_am_pm, "#ffffff PM");
        } else {
            lv_label_set_text(label_am_pm, "#ffffff AM");
        }
    } else {
        lv_label_set_text_fmt(label_time, "#ffffff %02d:%02d", p_time->tm_hour, p_time->tm_min);
    }
}
/* ======================================================================================
 * implementation
 */

vd_void_t app_time_on_create(lv_obj_t* scr, app_scr_info_t data) {
    lv_json_bind(scr, APP_LAYOUT_TIME_JSON_STR);
    timetheme = TIME_MODE_3;
    img_bac   = lv_json_find_widget(scr, APP_ID_TIME_IMG_BAC);
    lv_img_set_src(img_bac, APP_IMG(APP_IMG_ID_IMG_BAC_2_PNG));

    label_time = lv_label_create(img_bac);
    lv_obj_set_style_text_font(label_time, &my_font_104, LV_PART_MAIN);
    lv_label_set_recolor(label_time, true);
    lv_label_set_text(label_time, "#ffffff 11:12");
    lv_obj_align(label_time, LV_ALIGN_CENTER, 0, -20);
    lv_obj_add_flag(label_time, LV_OBJ_FLAG_HIDDEN);

    label_am_pm = lv_label_create(img_bac);
    lv_obj_set_style_text_font(label_am_pm, &my_font_104, LV_PART_MAIN);
    lv_label_set_recolor(label_am_pm, true);
    lv_label_set_text(label_am_pm, "#ffffff PM");
    lv_obj_set_style_text_opa(label_am_pm, 128, 0);
    lv_obj_align(label_am_pm, LV_ALIGN_CENTER, 0, 80);
    lv_obj_add_flag(label_am_pm, LV_OBJ_FLAG_HIDDEN);

    time_bg_img = lv_img_create(img_bac);
    lv_img_set_src(time_bg_img, APP_IMG(APP_IMG_ID_IC_TIME_1_PNG));
    lv_obj_align(time_bg_img, LV_ALIGN_CENTER, 0, 0);
    time_h_img = lv_img_create(time_bg_img);
    lv_img_set_src(time_h_img, APP_IMG(APP_IMG_ID_IC_H_TIME_3_PNG));
    time_m_img = lv_img_create(time_bg_img);
    lv_img_set_src(time_m_img, APP_IMG(APP_IMG_ID_IC_M_TIME_2_PNG));
    time_s_img = lv_img_create(time_bg_img);
    lv_img_set_src(time_s_img, APP_IMG(APP_IMG_ID_IC_S_TIME_4_PNG));
    lv_obj_add_flag(time_bg_img, LV_OBJ_FLAG_HIDDEN);
    struct timeval tv;
    time_t         time;
    gettimeofday(&tv, NULL);  //获取系统时间,并保存到tv中,注意这里可以精确到微秒
    time              = tv.tv_sec;
    struct tm* p_time = localtime(&time);
    lv_img_set_angle(time_m_img, p_time->tm_min * 60);
    lv_img_set_angle(time_h_img, p_time->tm_hour * 300 + (p_time->tm_min * 5));
    if (timetheme == TIME_MODE_2) {
        lv_label_set_text_fmt(label_time, "#ffffff %02d:%02d", p_time->tm_hour % 12, p_time->tm_min);
    } else {
        lv_label_set_text_fmt(label_time, "#ffffff %02d:%02d", p_time->tm_hour, p_time->tm_min);
    }
    if (p_time->tm_hour > 12) {
        lv_label_set_text(label_am_pm, "#ffffff PM");
    } else {
        lv_label_set_text(label_am_pm, "#ffffff AM");
    }
    lv_anim_t anim;
    lv_anim_init(&anim);
    lv_anim_set_var(&anim, time_s_img);
    lv_anim_set_exec_cb(&anim, (lv_anim_exec_xcb_t)my_anim_s);
    lv_anim_set_ready_cb(&anim, lv_time_ready_cb);
    lv_anim_set_time(&anim, ((60 - p_time->tm_sec) * 1000));
    lv_anim_set_values(&anim, p_time->tm_sec * 60, 3600);
    if (timetheme == TIME_MODE_3) {
        lv_anim_start(&anim);
        lv_obj_clear_flag(time_bg_img, LV_OBJ_FLAG_HIDDEN);
    } else if (timetheme == TIME_MODE_2) {
        lv_timer_t* timer_data = lv_timer_create(my_timer_cb, 900, NULL);
        lv_obj_clear_flag(label_time, LV_OBJ_FLAG_HIDDEN);
        lv_obj_clear_flag(label_am_pm, LV_OBJ_FLAG_HIDDEN);
        lv_obj_align(label_am_pm, LV_ALIGN_CENTER, 0, 80);
        lv_obj_align(label_time, LV_ALIGN_CENTER, 0, -20);
    } else {
        lv_timer_t* timer_data = lv_timer_create(my_timer_cb, 900, NULL);
        lv_obj_clear_flag(label_time, LV_OBJ_FLAG_HIDDEN);
        lv_obj_align(label_time, LV_ALIGN_CENTER, 0, 0);
    }
}

vd_void_t app_time_on_update(lv_obj_t* scr, app_scr_info_t data) {
}

vd_void_t app_time_on_destroy(lv_obj_t* scr) {
    lv_anim_del_all();
}


/*
 * Project: linux-kit
 * Module:
 * File: app_time.h
 * Created Date: 2023-08-09 14:44:31
 * Author: vdtools
 * Description: description
 * -----
 * todo: modified
 * -----
 * Copyright (c) 2021 - vDiscovery, Inc
 */
#ifndef APP_TIME_H
#define APP_TIME_H

/* ======================================================================================
 * includes
 */
#include "base.h"
#include "lvgl.h"
#include "src/resource/app_resource.h"

/* ======================================================================================
 * extern
 */
__vd_extern_c_enter__;

/* ======================================================================================
 * macros
 */

/* ======================================================================================
 * types
 */

typedef enum {
    TIME_MODE_1,
    TIME_MODE_2,
    TIME_MODE_3,
} time_theme_e;
/* ======================================================================================
 * globals
 */

/* ======================================================================================
 * declaration
 */

/* ======================================================================================
 * extern
 */
__vd_extern_c_leave__
#endif  // APP_TIME_H

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值