full implementation
This commit is contained in:
156
ui-util.cpp
Normal file
156
ui-util.cpp
Normal 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);
|
||||
}
|
||||
Reference in New Issue
Block a user