Login
1 branch 0 tags
Ben (Desktop/Arch) Improved podcast episode list e9e6fb4 29 days ago 81 Commits
moon / src / screens / usb_screen.c
#include "usb_screen.h"
#include <stdlib.h>
#include "../audio_player.h"
#include "../playlist.h"
#include "../storage.h"
#include "../topbar.h"

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

static void exit_usb_mode(void) {
	storage_remount();
	playlist_load();
	navigate_none(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(lv_obj_t* parent) {
	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(parent);
	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;
	}
	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
}