diff --git a/ch32v-insert-coin/src/app.rs b/ch32v-insert-coin/src/app.rs index 17c2a77..b1befab 100644 --- a/ch32v-insert-coin/src/app.rs +++ b/ch32v-insert-coin/src/app.rs @@ -124,7 +124,7 @@ pub mod sequencer { ticks_remaining: 0, num_loops: 1, loop_count: 0, - enabled: true, + enabled: false, } } @@ -132,6 +132,9 @@ pub mod sequencer { self.sequence = sequence; self.num_loops = num_loops; self.loop_count = 0; + self.enabled = true; + self.index = 0; + self.ticks_remaining = 0; } pub fn enable(&mut self) { @@ -343,6 +346,7 @@ impl App { self.timers.led2_timer.enable(true); self.services.synth0.set_freq(440); + self.services.synth0.disable(); } pub fn set_state(&mut self, state: State) { @@ -455,10 +459,10 @@ impl App { if self.services.sample_player.need_service() { self.services.sample_player.service(); - // let out = self.services.sample_player.get_amplitude(); - // self.interfaces - // .pwm_core - // .write_amplitude(ch32_hal::timer::Channel::Ch4, out as u8); + let out = self.services.sample_player.get_amplitude(); + self.interfaces + .pwm_core + .write_amplitude(ch32_hal::timer::Channel::Ch4, out as u8); } } } @@ -504,7 +508,7 @@ impl App { self.timers.sp_timer.reset(); self.timers.lp_timer.reset(); } - pub fn coin_detect(&self) { + pub fn coin_detect(&mut self) { #[cfg(feature = "enable_print")] println!("coin detect"); self.services.sample_player.play_sample(); @@ -513,10 +517,16 @@ impl App { // Events impl App { - fn main_button_click(&self) { + fn main_button_click(&mut self) { // TODO #[cfg(feature = "enable_print")] println!("click"); + self.services.sequencer.play_sequence(&crate::TEST_SEQ, 1); + self.services.synth0.enable(); + + // TODO: + // this is a hack to stop the coin thing from playing. + self.services.sample_player.disable(); } fn main_button_short_press(&self) { // TODO @@ -543,6 +553,8 @@ impl App { // AUDIO: // 2. dac switching // 3. amp_en control +// 4. write sequences +// 5. sample player start disabled // // LED: // @@ -559,3 +571,4 @@ impl App { // 1. clean up edge detector // 2. better handling for pwm scaling (brightness / volume) // 3. better interrupt handling structs +// 4. led DynamicSequence diff --git a/ch32v-insert-coin/src/insert_coin/services/dac.rs b/ch32v-insert-coin/src/insert_coin/services/dac.rs index 1d18994..d262a14 100644 --- a/ch32v-insert-coin/src/insert_coin/services/dac.rs +++ b/ch32v-insert-coin/src/insert_coin/services/dac.rs @@ -8,6 +8,7 @@ pub struct DacService<'a> { dpcm_decoder: core::cell::RefCell>, amplitude: core::cell::RefCell, pub channel: Channel, + enabled: bool, } impl<'a> DacService<'a> { @@ -17,11 +18,17 @@ impl<'a> DacService<'a> { dpcm_decoder: core::cell::RefCell::new(DpcmDecoder::new()), amplitude: core::cell::RefCell::new(0), channel, + enabled: false, } } - pub fn play_sample(&self) { + pub fn play_sample(&mut self) { self.dpcm_decoder.borrow_mut().seek_to_sample(0); + self.enabled = true; + } + + pub fn disable(&mut self) { + self.enabled = false; } pub fn load_data(&self, data: &'a [u8]) { @@ -39,12 +46,14 @@ impl<'a> DacService<'a> { impl<'a> TickService for DacService<'a> { fn tick(&self) { - let mut tc = self.service_data.borrow_mut(); - tc.ticks_remaining = tc.ticks_remaining.saturating_sub(1); + if self.enabled { + let mut tc = self.service_data.borrow_mut(); + tc.ticks_remaining = tc.ticks_remaining.saturating_sub(1); + } } fn need_service(&self) -> bool { - self.service_data.borrow().ticks_remaining == 0 + self.enabled && self.service_data.borrow().ticks_remaining == 0 } fn service(&self) { diff --git a/ch32v-insert-coin/src/main.rs b/ch32v-insert-coin/src/main.rs index c7e2368..9fc0841 100644 --- a/ch32v-insert-coin/src/main.rs +++ b/ch32v-insert-coin/src/main.rs @@ -39,7 +39,7 @@ use qingke::riscv; use crate::app::sequencer::{DynamicSequence, SequenceEntry}; static LED0_SEQ: [u8; 8] = [0u8, 25u8, 50u8, 75u8, 100u8, 75u8, 50u8, 25u8]; -static TEST_SEQ: [app::sequencer::SequenceEntry; 2] = [ +pub static TEST_SEQ: [app::sequencer::SequenceEntry; 2] = [ SequenceEntry { frequency_hz: 440, duration_ms: 1000, @@ -267,7 +267,8 @@ fn app_main(mut p: hal::Peripherals) -> ! { let dac_tick_per_service = tick_rate_hz / dac_sample_rate_hz; let dac_service_data = TickServiceData::new(dac_tick_per_service); - let coin_sound = include_bytes!("../audio/coin2.raw"); + let coin_sound = include_bytes!("../audio/coin.raw"); + // let coin_sound = include_bytes!("../audio/coin2.raw"); let sample_player = DacService::new(ch32_hal::timer::Channel::Ch4, dac_service_data); sample_player.load_data(coin_sound); diff --git a/ch32v-insert-coin/src/synthesizer.rs b/ch32v-insert-coin/src/synthesizer.rs index d3cb3a1..810336e 100644 --- a/ch32v-insert-coin/src/synthesizer.rs +++ b/ch32v-insert-coin/src/synthesizer.rs @@ -34,10 +34,11 @@ impl SynthesizerService { } pub fn need_service(&self) -> bool { - self.need_service || self.synth.has_new_output() + self.need_service || (self.enabled && self.synth.has_new_output()) } pub fn service(&mut self) -> Option { + self.need_service = false; if self.enabled { Some(self.synth.get_output()) } else {