Login
1 branch 0 tags
Ben (Desktop/Arch) UI 784bc06 1 month ago 13 Commits
moon / firmware / src / main.c
#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)
}