diff --git a/ch32v-insert-coin/audio/button_3.raw b/ch32v-insert-coin/audio/button_3.raw index eb62b2d..0477e75 100644 Binary files a/ch32v-insert-coin/audio/button_3.raw and b/ch32v-insert-coin/audio/button_3.raw differ diff --git a/ch32v-insert-coin/audio/coin2.raw b/ch32v-insert-coin/audio/coin2.raw new file mode 100644 index 0000000..1caabb9 Binary files /dev/null and b/ch32v-insert-coin/audio/coin2.raw differ diff --git a/ch32v-insert-coin/src/insert_coin/insert_coin.rs b/ch32v-insert-coin/src/insert_coin/insert_coin.rs index 90d98c2..79d6598 100644 --- a/ch32v-insert-coin/src/insert_coin/insert_coin.rs +++ b/ch32v-insert-coin/src/insert_coin/insert_coin.rs @@ -1,9 +1,8 @@ -use ch32_hal::timer::GeneralInstance16bit; use ch32_hal::timer::simple_pwm::SimplePwm; use ch32_hal::timer::Channel; +use ch32_hal::timer::GeneralInstance16bit; -use crate::insert_coin::services::{DacService, LedService, TickService, TickServiceData, Service}; - +use crate::insert_coin::services::{DacService, LedService, Service, TickService, TickServiceData}; // static mut led0_index: usize = 0; // static LED0: [u8; 8] = [0u8, 25u8, 50u8, 75u8, 100u8, 75u8, 50u8, 25u8]; @@ -11,7 +10,7 @@ use crate::insert_coin::services::{DacService, LedService, TickService, TickServ // static mut LED1_INDEX: usize = 0; // static LED1_DCS: [u8; 5] = [0u8, 25u8, 50u8, 75u8, 100u8]; -pub struct SimplePwmCore<'d, T: GeneralInstance16bit> { +pub struct SimplePwmCore<'d, T: GeneralInstance16bit> { pwm: core::cell::RefCell>, } @@ -43,17 +42,12 @@ impl<'d, T: GeneralInstance16bit> SimplePwmCore<'d, T> { // } } - - - pub struct CoreConfig { pub tick_rate_hz: usize, } impl CoreConfig { pub fn new(tick_rate_hz: usize) -> Self { - Self { - tick_rate_hz, - } + Self { tick_rate_hz } } } @@ -70,25 +64,20 @@ pub struct InsertCoin<'a, T: GeneralInstance16bit> { pub led0: LedService, pub led1: LedService, // led2: LedService, - pub dac: DacService<'a>, } impl<'a, T: GeneralInstance16bit> InsertCoin<'a, T> { - pub fn new(config: CoreConfig, pwm_core: SimplePwmCore<'a, T>) -> Self { - - // LED0 servicer setup let led0 = LedService::new(ch32_hal::timer::Channel::Ch3); // LED1 servicer setup let led1 = LedService::new(ch32_hal::timer::Channel::Ch1); - // DAC servicer setup - let dac_sample_rate_hz = 16000; - let dac_tick_per_service = config.tick_rate_hz/(dac_sample_rate_hz); + let dac_sample_rate_hz = 4000; + let dac_tick_per_service = config.tick_rate_hz / (dac_sample_rate_hz); let dac_service_data = TickServiceData::new(dac_tick_per_service); let dac = DacService::new(ch32_hal::timer::Channel::Ch4, dac_service_data); @@ -105,28 +94,28 @@ impl<'a, T: GeneralInstance16bit> InsertCoin<'a, T> { /// takes self reference and runs pub fn service(&mut self) { - - if self.is_active() { + if self.is_active() { self.dac.tick(); - if self.led0.need_service() { - self.pwm_core.write_amplitude(self.led0.channel, self.led0.amplitude); + self.pwm_core + .write_amplitude(self.led0.channel, self.led0.amplitude); self.led0.service(); } if self.led1.need_service() { - self.pwm_core.write_amplitude(self.led1.channel, self.led1.amplitude); + self.pwm_core + .write_amplitude(self.led1.channel, self.led1.amplitude); self.led1.service(); } if self.dac.need_service() { self.dac.service(); // TODO: adpcm-pwm-dac:e4c811653781e69e40b63fd27a8c1e20 - self.pwm_core.write_amplitude(self.dac.channel, self.dac.get_amplitude() as u8); + self.pwm_core + .write_amplitude(self.dac.channel, self.dac.get_amplitude() as u8); } } - } // /// consumes self and runs @@ -134,7 +123,6 @@ impl<'a, T: GeneralInstance16bit> InsertCoin<'a, T> { // let mut delay = Delay; // let tick_interval_us = 1000000/self.config.tick_rate_hz; - // let mut led0_index = 0; // let led0_dcs = [0u8, 25u8, 50u8, 75u8, 100u8, 75u8, 50u8, 25u8]; @@ -143,12 +131,11 @@ impl<'a, T: GeneralInstance16bit> InsertCoin<'a, T> { // loop { // self.dac.tick(); - // if(self.led0.need_service()) { // self.led0.set_amplitude(led0_dcs[led0_index]); // self.pwm_core.write_amplitude(self.led0.channel, self.led0.amplitude); - + // led0_index += 1; // if led0_index > led0_dcs.len() - 1 { // led0_index = 0; @@ -159,7 +146,7 @@ impl<'a, T: GeneralInstance16bit> InsertCoin<'a, T> { // if(self.led1.need_service()) { // self.led1.set_amplitude(led1_dcs[led1_index]); // self.pwm_core.write_amplitude(self.led1.channel, self.led1.amplitude); - + // led1_index += 1; // if led1_index > led1_dcs.len() - 1 { // led1_index = 0; @@ -178,7 +165,7 @@ impl<'a, T: GeneralInstance16bit> InsertCoin<'a, T> { // } pub fn is_active(&self) -> bool { - self.core.active + self.core.active } pub fn set_active(&mut self, active: bool) { diff --git a/ch32v-insert-coin/src/main.rs b/ch32v-insert-coin/src/main.rs index 54ce5dd..d59d44f 100644 --- a/ch32v-insert-coin/src/main.rs +++ b/ch32v-insert-coin/src/main.rs @@ -268,7 +268,8 @@ fn app_main(mut p: hal::Peripherals, mut delay: Delay) -> ! { pwm.set_polarity(led0_ch, OutputPolarity::ActiveLow); pwm.set_polarity(led1_ch, OutputPolarity::ActiveLow); - let sample_rate_hz = 16000; + let sample_rate_hz = 4000; + // let sample_rate_hz = 16000; let dac_tick_per_service = 5; let tick_rate_hz = sample_rate_hz * dac_tick_per_service; @@ -374,10 +375,10 @@ fn app_main(mut p: hal::Peripherals, mut delay: Delay) -> ! { let tick_interval_us = 1000000 / interfaces.config.tick_rate_hz - 10; // dac data - // let coin_sound = include_bytes!("../audio/coin.raw"); + // let coin_sound = include_bytes!("../audio/coin2.raw"); // let coin_sound = include_bytes!("../audio/sweep_dpcm_u4.raw"); - let coin_sound = include_bytes!("../audio/button_1.raw"); + let button_sound_1 = include_bytes!("../audio/button_1.raw"); let button_sound_2 = include_bytes!("../audio/button_2.raw"); let button_sound_3 = include_bytes!("../audio/button_3.raw"); diff --git a/ch32v-insert-coin/src/system.rs b/ch32v-insert-coin/src/system.rs index 97b43e4..0ee18a6 100644 --- a/ch32v-insert-coin/src/system.rs +++ b/ch32v-insert-coin/src/system.rs @@ -48,6 +48,7 @@ pub fn clear_interrupt(coin_pin: u8, button_pin: u8) -> crate::InputFlags { if (bits & (0x1 << button_pin)) != 0x0 { #[cfg(feature = "enable_print")] println!("main_btn irq!"); + input_flags.main_btn_flag = true; // CHECK PC6 // unsafe { // let mut val = 0;