From 0e7e330998975382657287eed5b54472379c8cd9 Mon Sep 17 00:00:00 2001 From: sawyer bristol Date: Mon, 17 Nov 2025 15:02:32 -0700 Subject: [PATCH] selection ui for wav_player --- Cargo.lock | 1 + user-apps/wav_player/Cargo.toml | 1 + user-apps/wav_player/src/main.rs | 81 +++++++++++++++++++++++--------- 3 files changed, 61 insertions(+), 22 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 097fc7f..3dce1b4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2762,6 +2762,7 @@ dependencies = [ "embedded-audio", "embedded-graphics", "rand", + "selection_ui", ] [[package]] diff --git a/user-apps/wav_player/Cargo.toml b/user-apps/wav_player/Cargo.toml index 85c67ac..37b1594 100644 --- a/user-apps/wav_player/Cargo.toml +++ b/user-apps/wav_player/Cargo.toml @@ -5,6 +5,7 @@ edition = "2024" [dependencies] abi = { path = "../../abi" } +selection_ui = { path = "../../selection_ui" } embedded-graphics = "0.8.1" rand = { version = "0.9.0", default-features = false } embedded-audio = { git = "https://github.com/LegitCamper/embedded-audio" } diff --git a/user-apps/wav_player/src/main.rs b/user-apps/wav_player/src/main.rs index c662038..66bee3c 100644 --- a/user-apps/wav_player/src/main.rs +++ b/user-apps/wav_player/src/main.rs @@ -5,14 +5,21 @@ extern crate alloc; use abi::{ audio::{AUDIO_BUFFER_LEN, audio_buffer_ready, send_audio_buffer}, display::Display, - fs::{file_len, read_file}, + format, + fs::{Entries, file_len, list_dir, read_file}, get_key, keyboard::{KeyCode, KeyState}, println, }; -use alloc::string::String; +use alloc::{string::String, vec::Vec}; use core::panic::PanicInfo; use embedded_audio::{AudioFile, PlatformFile, PlatformFileError, wav::Wav}; +use embedded_graphics::{ + mono_font::{MonoTextStyle, ascii::FONT_6X10}, + pixelcolor::Rgb565, + prelude::RgbColor, +}; +use selection_ui::{SelectionUi, SelectionUiError, draw_text_center}; #[panic_handler] fn panic(info: &PanicInfo) -> ! { @@ -27,30 +34,60 @@ pub extern "Rust" fn _start() { pub fn main() { println!("Starting Wav player app"); - let mut _display = Display::take(); - - let mut buf = [0_u8; AUDIO_BUFFER_LEN]; - - let file = File::new(String::from("/music/test.wav")); - let mut wav = Wav::new(file).unwrap(); - println!("sample rate: {}", wav.sample_rate()); - println!("channels: {:?}", wav.channels() as u8); + let mut display = Display::take().unwrap(); loop { - if audio_buffer_ready() { - if wav.is_eof() { - wav.restart().unwrap() + let mut entries = Entries::new(); + list_dir("/music", &mut entries); + + let mut files = entries.entries(); + files.retain(|e| e.extension().unwrap_or("") == "wav"); + let mut wavs = files.iter().map(|e| e.full_name()).collect::>(); + wavs.sort(); + + let mut selection_ui = SelectionUi::new(&mut wavs); + let selection = match selection_ui.run_selection_ui(&mut display) { + Ok(maybe_sel) => maybe_sel, + Err(e) => match e { + SelectionUiError::SelectionListEmpty => { + draw_text_center( + &mut display, + "No Wavs were found in /gifs", + MonoTextStyle::new(&FONT_6X10, Rgb565::RED), + ) + .expect("Display Error"); + None + } + SelectionUiError::DisplayError(_) => panic!("Display Error"), + }, + }; + + assert!(selection.is_some()); + + let file_name = format!("/music/{}", wavs[selection.unwrap()]); + let file = File::new(String::from(file_name)); + let mut wav = Wav::new(file).unwrap(); + println!("sample rate: {}", wav.sample_rate()); + println!("channels: {:?}", wav.channels() as u8); + + let mut buf = [0_u8; AUDIO_BUFFER_LEN]; + + loop { + if audio_buffer_ready() { + if wav.is_eof() { + break; + } + + let _read = wav.read(&mut buf).unwrap(); + send_audio_buffer(&buf); } - let _read = wav.read(&mut buf).unwrap(); - send_audio_buffer(&buf); - } - - let event = get_key(); - if event.state == KeyState::Released { - match event.key { - KeyCode::Esc => return, - _ => (), + let event = get_key(); + if event.state == KeyState::Released { + match event.key { + KeyCode::Esc => return, + _ => (), + } } } }