full implementation

This commit is contained in:
2025-10-18 13:35:36 +02:00
commit 303d59076f
21 changed files with 62065 additions and 0 deletions

156
ui-util.cpp Normal file
View File

@@ -0,0 +1,156 @@
#include "lvgl.h"
#include "pins_config.h"
#include "AXS15231B.h"
#include "ui-util.h"
#include "time.h"
#include <Arduino.h>
#include <SPI.h>
#define set_anim_src(x) ((const void *)trans_ainm_buf[(x)])
#define buf_limit(idx) ((idx) % 10)
#define timer_h(v, n, obj) \
do { \
if (v != n / 10) { \
v = buf_limit(n / 10); \
if (v != 0) \
lv_gif_set_src(obj, (const void *)trans_ainm_buf[v - 1]); \
else \
lv_gif_set_src(obj, (const void *)trans_ainm_buf[buf_limit(9)]); \
} \
} while (0);
#define timer_l(v, n, obj) \
do { \
if (v != n % 10) { \
v = buf_limit(n % 10); \
if (v != 0) \
lv_gif_set_src(obj, (const void *)trans_ainm_buf[v - 1]); \
else \
lv_gif_set_src(obj, (const void *)trans_ainm_buf[buf_limit(9)]); \
} \
} while (0);
static lv_obj_t *dis;
static lv_obj_t *img1;
static lv_obj_t *img2;
static lv_obj_t *img3;
static lv_obj_t *img4;
static lv_obj_t *img5;
static lv_obj_t *img6;
// Transition animation
static const void *trans_ainm_buf[] = {
&gif_01, &gif_12, &gif_23, &gif_34, &gif_45,
&gif_56, &gif_67, &gif_78, &gif_89, &gif_90
};
static void update_text_subscriber_cb_demo1(void *s, lv_msg_t *msg);
void set_flip_time_anim(int hour, int minute, int second);
void ui_begin() {
dis = lv_tileview_create(lv_scr_act());
lv_obj_align(dis, LV_ALIGN_TOP_RIGHT, 0, 0);
lv_obj_set_size(dis, LV_PCT(100), LV_PCT(100));
// lv_obj_remove_style(dis, 0, LV_PART_SCROLLBAR);
lv_obj_set_style_bg_color(dis, lv_color_black(), LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_t *tv1 = lv_tileview_add_tile(dis, 0, 0, LV_DIR_VER);
lv_obj_t *tv2 = lv_tileview_add_tile(dis, 0, 1, LV_DIR_VER);
lv_obj_t *tv3 = lv_tileview_add_tile(dis, 0, 2, LV_DIR_VER);
lv_obj_t *tv4 = lv_tileview_add_tile(dis, 0, 3, LV_DIR_VER);
img1 = lv_gif_create(tv1);
img2 = lv_gif_create(tv1);
img3 = lv_gif_create(tv1);
img4 = lv_gif_create(tv1);
img5 = lv_gif_create(tv1);
img6 = lv_gif_create(tv1);
lv_gif_set_src(img1, set_anim_src(9));
lv_gif_set_src(img2, set_anim_src(9));
lv_gif_set_src(img3, set_anim_src(9));
lv_gif_set_src(img4, set_anim_src(9));
lv_gif_set_src(img5, set_anim_src(9));
lv_gif_set_src(img6, set_anim_src(9));
lv_obj_align(img1, LV_ALIGN_LEFT_MID, 20, 0);
lv_obj_align_to(img2, img1, LV_ALIGN_OUT_RIGHT_MID, 0, 0);
lv_obj_align(img3, LV_ALIGN_LEFT_MID, 225, 0);
lv_obj_align_to(img4, img3, LV_ALIGN_OUT_RIGHT_MID, 0, 0);
lv_obj_align(img5, LV_ALIGN_LEFT_MID, 430, 0);
lv_obj_align_to(img6, img5, LV_ALIGN_OUT_RIGHT_MID, 0, 0);
lv_msg_subsribe(MSG_NEW_HOUR, update_text_subscriber_cb_demo1, NULL);
lv_msg_subsribe(MSG_NEW_MIN, update_text_subscriber_cb_demo1, NULL);
lv_msg_subsribe(MSG_NEW_SEC, update_text_subscriber_cb_demo1, NULL);
}
static void update_text_subscriber_cb_demo1(void *s, lv_msg_t *msg) {
static int hour = 0;
static int minute = 0;
static int second = 0;
static uint32_t start_tick = lv_tick_get();
const int32_t *v = (const int32_t *)lv_msg_get_payload(msg);
/* clang-format off */
switch (lv_msg_get_id(msg)) {
case MSG_NEW_HOUR: hour = *v; break;
case MSG_NEW_MIN: minute = *v; break;
case MSG_NEW_SEC: second = *v; break;
default:
break;
} /* clang-format off */
if (lv_tick_elaps(start_tick) >= 1000) {
start_tick = lv_tick_get();
set_flip_time_anim(hour, minute, second);
}
}
void set_flip_time_anim(int hour, int minute, int second) {
static int sec_h, sec_l, min_h, min_l, hou_h, hou_l;
timer_l(sec_l, second, img6);
timer_h(sec_h, second, img5);
timer_l(min_l, minute, img4);
timer_h(min_h, minute, img3);
timer_l(hou_l, hour, img2);
timer_h(hou_h, hour, img1);
// printf("clock=%02d:%02d:%02d\n", hour, minute, second);
}
void my_disp_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p) {
uint32_t w = (area->x2 - area->x1 + 1);
uint32_t h = (area->y2 - area->y1 + 1);
#ifdef LCD_SPI_DMA
char i = 0;
while (get_lcd_spi_dma_write()) {
i = i >> 1;
lcd_PushColors(0, 0, 0, 0, NULL);
}
#endif
lcd_PushColors(area->x1, area->y1, w, h, (uint16_t *)&color_p->full);
#ifdef LCD_SPI_DMA
#else
lv_disp_flush_ready(disp);
#endif
}
void lv_delay_ms(int x) {
do {
uint32_t t = x;
while (t--) {
delay(1);
if (transfer_num <= 0 && lcd_PushColors_len <= 0)
lv_timer_handler();
if (transfer_num <= 1 && lcd_PushColors_len > 0) {
lcd_PushColors(0, 0, 0, 0, NULL);
}
}
} while (0);
}