do interrupt handling for sleep

This commit is contained in:
sigil-03 2025-11-06 17:46:41 -07:00
parent 935129baed
commit a7cd209989
3 changed files with 93 additions and 46 deletions

View file

@ -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")]

View file

@ -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<T: GeneralInstance16Bit> {

View file

@ -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() {