text/plain
•
3.89 KB
•
113 lines
#include "moon.h"
#include "lvgl.h"
uint8_t button_state;
static lv_obj_t *title_label;
static lv_obj_t *status_label;
static lv_obj_t *test_btn;
static lv_obj_t *reset_btn;
static lv_obj_t *spinner;
static lv_obj_t *progress_bar;
static int click_count = 0;
// Wrapper for lv_bar_set_value to work with animations
static void bar_anim_cb(void *obj, int32_t value) {
lv_bar_set_value(obj, value, LV_ANIM_OFF);
}
static void btn_event_cb(lv_event_t *e) {
lv_event_code_t code = lv_event_get_code(e);
if (code == LV_EVENT_CLICKED) {
click_count++;
lv_label_set_text_fmt(status_label, "Clicks: %d", click_count);
// Animate progress bar on click
int32_t new_val = (click_count * 10) % 110;
lv_anim_t a;
lv_anim_init(&a);
lv_anim_set_var(&a, progress_bar);
lv_anim_set_values(&a, lv_bar_get_value(progress_bar), new_val);
lv_anim_set_duration(&a, 300);
lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)bar_anim_cb);
lv_anim_start(&a);
}
}
static void reset_btn_event_cb(lv_event_t *e) {
lv_event_code_t code = lv_event_get_code(e);
if (code == LV_EVENT_CLICKED) {
click_count = 0;
lv_label_set_text(status_label, "Reset!");
lv_bar_set_value(progress_bar, 0, LV_ANIM_ON);
}
}
void setup(void) {
// Set up dark theme with custom accent color
lv_display_t *disp = lv_display_get_default();
lv_theme_t *theme = lv_theme_default_init(
disp,
lv_color_hex(0xE91E63), // Primary color (vibrant pink)
lv_color_hex(0x81D4FA), // Secondary color (soft sky blue)
true, // Dark mode
&lv_font_montserrat_14
);
lv_display_set_theme(disp, theme);
// Create title label at top
title_label = lv_label_create(lv_screen_active());
lv_label_set_text(title_label, "Onigiri 音楽");
lv_obj_set_style_text_font(title_label, &lv_font_source_han_sans_sc_14_cjk, 0);
lv_obj_align(title_label, LV_ALIGN_TOP_MID, 0, 8);
// Create a small spinner in top-left corner
spinner = lv_spinner_create(lv_screen_active());
lv_obj_set_size(spinner, 20, 20);
lv_obj_align(spinner, LV_ALIGN_TOP_LEFT, 4, 4);
lv_spinner_set_anim_params(spinner, 1000, 200); // 1s rotation, 200 arc length
// Create status label (with CJK test)
status_label = lv_label_create(lv_screen_active());
lv_label_set_text(status_label, "Ready");
lv_obj_set_style_text_font(status_label, &lv_font_source_han_sans_sc_14_cjk, 0);
lv_obj_align(status_label, LV_ALIGN_CENTER, 0, -15);
// Create animated progress bar
progress_bar = lv_bar_create(lv_screen_active());
lv_obj_set_size(progress_bar, 120, 8);
lv_obj_align(progress_bar, LV_ALIGN_CENTER, 0, 10);
lv_bar_set_value(progress_bar, 30, LV_ANIM_OFF);
// Create test button (left side)
test_btn = lv_button_create(lv_screen_active());
lv_obj_align(test_btn, LV_ALIGN_BOTTOM_LEFT, 8, -8);
lv_obj_add_event_cb(test_btn, btn_event_cb, LV_EVENT_CLICKED, NULL);
lv_obj_set_size(test_btn, 68, 26);
lv_obj_t *btn_label = lv_label_create(test_btn);
lv_label_set_text(btn_label, "Test");
lv_obj_center(btn_label);
// Create reset button (right side)
reset_btn = lv_button_create(lv_screen_active());
lv_obj_align(reset_btn, LV_ALIGN_BOTTOM_RIGHT, -8, -8);
lv_obj_add_event_cb(reset_btn, reset_btn_event_cb, LV_EVENT_CLICKED, NULL);
lv_obj_set_size(reset_btn, 68, 26);
lv_obj_t *reset_label = lv_label_create(reset_btn);
lv_label_set_text(reset_label, "Reset");
lv_obj_center(reset_label);
// Add buttons to default group for keyboard navigation
lv_group_add_obj(lv_group_get_default(), test_btn);
lv_group_add_obj(lv_group_get_default(), reset_btn);
// Focus first button to enable navigation
lv_group_focus_obj(test_btn);
}
void loop(void) {
// Input is now handled by LVGL indev driver (lvgl_indev.c)
}