#include "lvgl.h" #include "pins_config.h" #include "AXS15231B.h" #include "ui-util.h" #include "time.h" #include #include #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); }