/*
* 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();
}