Login
1 branch 0 tags
Ben (Desktop/Arch) We're USB MSC now! 93094f8 1 month ago 43 Commits
moon / firmware / src / screens / usb_screen.c
#include "usb_screen.h"
#include "../audio_player.h"
#include "../playlist.h"
#include "../storage.h"
#include "../topbar.h"
#include <stdlib.h>

#ifdef ESP_PLATFORM
#include "usb_msc.h"
#endif

static void exit_usb_mode(void) {
    storage_remount();
    playlist_load();
    navigate_to(SCREEN_HOME);
}

static void disconnect_cb(lv_event_t *e) {
    if (lv_event_get_code(e) == LV_EVENT_CLICKED) {
        exit_usb_mode();
    }
}

static void cancel_cb(lv_event_t *e) {
    if (lv_event_get_code(e) == LV_EVENT_CANCEL) {
        exit_usb_mode();
    }
}

ui_state_t setup_usb_screen(void) {
    usb_screen_state_t *state = calloc(1, sizeof(usb_screen_state_t));

    // Stop audio — filesystem is now owned by the PC
    audio_player_stop();

    state->list = bvs_list_create();
    topbar_set_title("USB Mode");

    lv_obj_t *label_btn =
        bvs_list_add_button(state->list, NULL, "Connected to PC");

    lv_obj_t *disconnect_btn =
        bvs_list_add_button(state->list, NULL, "Disconnect");
    lv_obj_add_event_cb(disconnect_btn, disconnect_cb, LV_EVENT_CLICKED, NULL);
    lv_obj_add_event_cb(disconnect_btn, cancel_cb, LV_EVENT_CANCEL, NULL);

    lv_group_add_obj(lv_group_get_default(), label_btn);
    lv_group_add_obj(lv_group_get_default(), disconnect_btn);
    lv_obj_add_event_cb(label_btn, cancel_cb, LV_EVENT_CANCEL, NULL);
    lv_group_focus_obj(disconnect_btn);

    return (ui_state_t){.type = SCREEN_USB, .usb = state};
}

void free_usb_screen(usb_screen_state_t *state) {
    if (!state)
        return;
    bvs_list_clear(state->list);
    free(state);
}

void update_usb_screen(usb_screen_state_t *state) {
    (void)state;
#ifdef ESP_PLATFORM
    // Auto-exit when USB cable is disconnected
    if (usb_msc_host_disconnected()) {
        exit_usb_mode();
    }
#endif
}