diff --git a/ch32v-insert-coin/src/app.rs b/ch32v-insert-coin/src/app.rs index 9703585..4cb1053 100644 --- a/ch32v-insert-coin/src/app.rs +++ b/ch32v-insert-coin/src/app.rs @@ -372,16 +372,18 @@ impl App { pub fn service(&mut self) { // timers if self.timers.sp_timer.need_service() { - self.timers.batt_adc_timer.service(); + self.timers.sp_timer.service(); #[cfg(feature = "enable_print")] println!("sp service"); self.timers.sp_timer.reset(); + self.main_button_short_press(); } if self.timers.lp_timer.need_service() { - self.timers.batt_adc_timer.service(); + self.timers.lp_timer.service(); #[cfg(feature = "enable_print")] println!("lp service"); self.timers.lp_timer.reset(); + self.main_button_long_press(); } if self.timers.batt_adc_timer.need_service() { self.timers.batt_adc_timer.service(); @@ -470,7 +472,7 @@ impl App { if self.services.sample_player.need_service() { self.services.sample_player.service(); - let out = self.services.sample_player.get_amplitude() / 2; + let out = self.services.sample_player.get_amplitude() / 5; self.interfaces .pwm_core .write_amplitude(ch32_hal::timer::Channel::Ch4, out as u8); @@ -480,6 +482,20 @@ impl App { // interfaces to the app (for buttons, etc.) impl App { + pub fn shut_down(&mut self) { + self.interfaces + .pwm_core + .write_amplitude(self.services.led0.channel, 0); + self.interfaces + .pwm_core + .write_amplitude(self.services.led1.channel, 0); + self.interfaces + .pwm_core + .write_amplitude(self.services.led2.channel, 0); + self.interfaces + .pwm_core + .disable(ch32_hal::timer::Channel::Ch4); + } pub fn volume_button(&mut self) { self.settings.volume.next(); #[cfg(feature = "enable_print")] @@ -498,26 +514,29 @@ impl App { self.timers.lp_timer.reset(); self.timers.sp_timer.enable(true); self.timers.lp_timer.enable(true); + self.main_button_click(); } pub fn main_button_release(&mut self) { // TODO - #[cfg(feature = "enable_print")] - println!("main button release"); - match ( - self.timers.sp_timer.is_enabled(), - self.timers.lp_timer.is_enabled(), - ) { - // click - (true, true) => self.main_button_click(), - // short press - (false, true) => self.main_button_short_press(), - // long press - (false, false) => self.main_button_long_press(), - // anything else is not possible - _ => {} - } + // #[cfg(feature = "enable_print")] + // println!("main button release"); + // let timers = ( + // self.timers.sp_timer.is_enabled(), + // self.timers.lp_timer.is_enabled(), + // ); + self.timers.sp_timer.reset(); self.timers.lp_timer.reset(); + // match timers { + // // click + // (true, true) => self.main_button_click(), + // // short press + // (false, true) => self.main_button_short_press(), + // // long press + // (false, false) => self.main_button_long_press(), + // // anything else is not possible + // _ => {} + // } } pub fn coin_detect(&mut self) { #[cfg(feature = "enable_print")] diff --git a/ch32v-insert-coin/src/insert_coin/insert_coin.rs b/ch32v-insert-coin/src/insert_coin/insert_coin.rs index 426c174..d453bea 100644 --- a/ch32v-insert-coin/src/insert_coin/insert_coin.rs +++ b/ch32v-insert-coin/src/insert_coin/insert_coin.rs @@ -37,9 +37,9 @@ impl<'d, T: GeneralInstance16bit> SimplePwmCore<'d, T> { self.pwm.borrow_mut().set_duty(ch, dc); } - // pub fn disable(&self, ch: Channel) { - // self.pwm.borrow_mut().disable(ch); - // } + pub fn disable(&self, ch: Channel) { + self.pwm.borrow_mut().disable(ch); + } } // pub struct SimplePwmHandle { diff --git a/ch32v-insert-coin/src/main.rs b/ch32v-insert-coin/src/main.rs index d29f7d5..633ad7b 100644 --- a/ch32v-insert-coin/src/main.rs +++ b/ch32v-insert-coin/src/main.rs @@ -246,8 +246,8 @@ fn app_main(mut p: hal::Peripherals) -> ! { DebouncedGPIO::new(light_ctrl_btn_pin.degrade(), core_config.tick_rate_hz, 100); let timer_config = TimerConfig { - sp_timer_ms: 2000, - lp_timer_ms: 5000, + sp_timer_ms: 1000, + lp_timer_ms: 3000, batt_adc_timer_ms: 10000, usb_adc_timer_ms: 10000, led0_timer_ms: 100, @@ -418,29 +418,57 @@ fn app_main(mut p: hal::Peripherals) -> ! { app.service(); - // match app.get_state() { - // // enter standby - // app::State::DeepSleep => { - // unsafe { system::enter_standby() }; - // loop { - // riscv::asm::wfi(); - // let mut config = hal::Config::default(); - // config.rcc = hal::rcc::Config::SYSCLK_FREQ_48MHZ_HSI; - // unsafe { - // hal::rcc::init(config.rcc); - // } - // unsafe { - // #[allow(static_mut_refs)] - // if INPUT_FLAGS.sense_coin_flag.active() { - // app.set_state(State::Active); - // break; - // } - // }; - // } - // } - // // for everything else, don't do anything - // _ => {} - // } + match app.get_state() { + // enter standby + app::State::DeepSleep => { + app.shut_down(); + + loop { + unsafe { system::enter_standby() }; + unsafe { + #[allow(static_mut_refs)] + INPUT_FLAGS.sense_coin_flag.clear(); + #[allow(static_mut_refs)] + INPUT_FLAGS.main_btn_flag.clear(); + } + riscv::asm::wfi(); + let mut config = hal::Config::default(); + config.rcc = hal::rcc::Config::SYSCLK_FREQ_48MHZ_HSI; + unsafe { + hal::rcc::init(config.rcc); + } + unsafe { + #[allow(static_mut_refs)] + if INPUT_FLAGS.sense_coin_flag.active() + || (INPUT_FLAGS.main_btn_flag.active() + && main_btn_input.is_high_immediate()) + { + unsafe { + use hal::pac::Interrupt; + use qingke::interrupt::Priority; + use qingke_rt::CoreInterrupt; + + system::clear_interrupt(2, 6); + + qingke::pfic::set_priority( + CoreInterrupt::SysTick as u8, + Priority::P15 as u8, + ); + + qingke::pfic::enable_interrupt(Interrupt::EXTI7_0 as u8); + qingke::pfic::enable_interrupt(CoreInterrupt::SysTick as u8); + } + + app.set_state(State::Active); + + break; + } + } + } + } + // for everything else, don't do anything + _ => {} + } } } // // if adc1_timer.need_service() {