initial volume and light control button support w/ debouncer

This commit is contained in:
sigil-03 2025-10-26 16:13:59 -06:00
parent 485f617515
commit 144d24cf59

View file

@ -66,6 +66,8 @@ struct DebouncedGPIO<'a> {
value: bool, value: bool,
// GPIO is ready (debounced) // GPIO is ready (debounced)
ready: bool, ready: bool,
// debouncer is active
active: bool,
// debounce timer // debounce timer
timer: TickTimerService, timer: TickTimerService,
} }
@ -77,6 +79,7 @@ impl<'a> DebouncedGPIO<'a> {
input: Input::new(pin, Pull::Up), input: Input::new(pin, Pull::Up),
value: false, value: false,
ready: false, ready: false,
active: false,
timer: TickTimerService::new( timer: TickTimerService::new(
TickServiceData::new(system_tick_rate_hz * debounce_time_ms / 1000), TickServiceData::new(system_tick_rate_hz * debounce_time_ms / 1000),
false, false,
@ -88,6 +91,10 @@ impl<'a> DebouncedGPIO<'a> {
self.ready self.ready
} }
pub fn active(&self) -> bool {
self.active
}
pub fn value(&self) -> bool { pub fn value(&self) -> bool {
self.value self.value
} }
@ -95,11 +102,13 @@ impl<'a> DebouncedGPIO<'a> {
pub fn begin(&mut self) { pub fn begin(&mut self) {
self.reset(); self.reset();
self.timer.enable(true); self.timer.enable(true);
self.active = true;
} }
pub fn reset(&mut self) { pub fn reset(&mut self) {
self.timer.reset(); self.timer.reset();
self.ready = false; self.ready = false;
self.active = false;
} }
pub fn service(&mut self) { pub fn service(&mut self) {
@ -110,6 +119,9 @@ impl<'a> DebouncedGPIO<'a> {
self.ready = true; self.ready = true;
} }
} }
pub fn is_high_immediate(&self) -> bool {
self.input.is_high()
}
} }
// DeepSleep --coin button irq--> Active // DeepSleep --coin button irq--> Active
@ -291,15 +303,15 @@ fn app_main(mut p: hal::Peripherals, mut delay: Delay) -> ! {
// set up interrupts // set up interrupts
unsafe { system::init_gpio_irq(sense_coin_pin.pin(), sense_coin_pin.port(), false, true) }; unsafe { system::init_gpio_irq(sense_coin_pin.pin(), sense_coin_pin.port(), false, true) };
unsafe { system::init_gpio_irq(main_btn_pin.pin(), main_btn_pin.port(), true, true) }; unsafe { system::init_gpio_irq(main_btn_pin.pin(), main_btn_pin.port(), true, true) };
unsafe { system::init_gpio_irq(volume_btn_pin.pin(), volume_btn_pin.port(), true, true) }; // unsafe { system::init_gpio_irq(volume_btn_pin.pin(), volume_btn_pin.port(), true, true) };
unsafe { // unsafe {
system::init_gpio_irq( // system::init_gpio_irq(
light_ctrl_btn_pin.pin(), // light_ctrl_btn_pin.pin(),
light_ctrl_btn_pin.port(), // light_ctrl_btn_pin.port(),
true, // true,
true, // true,
) // )
}; // };
// coin debouncer (100ms) // coin debouncer (100ms)
let mut sense_coin_input = let mut sense_coin_input =
@ -414,11 +426,25 @@ fn app_main(mut p: hal::Peripherals, mut delay: Delay) -> ! {
INPUT_FLAGS.main_btn_flag = false; INPUT_FLAGS.main_btn_flag = false;
main_btn_input.begin(); main_btn_input.begin();
} }
if !volume_btn_input.active() {
if !volume_btn_input.is_high_immediate() && !volume_btn_input.active() {
#[cfg(feature = "enable_print")]
println!("volume btn triggered: {}", volume_btn_input.active());
volume_btn_input.begin();
}
}
if !light_ctrl_btn_input.is_high_immediate() && !light_ctrl_btn_input.active() {
#[cfg(feature = "enable_print")]
println!("light ctrl btn triggered!");
light_ctrl_btn_input.begin();
}
} }
// debouncer // debouncer
sense_coin_input.service(); sense_coin_input.service();
main_btn_input.service(); main_btn_input.service();
volume_btn_input.service();
light_ctrl_btn_input.service();
if sense_coin_input.ready() { if sense_coin_input.ready() {
#[cfg(feature = "enable_print")] #[cfg(feature = "enable_print")]
@ -445,6 +471,16 @@ fn app_main(mut p: hal::Peripherals, mut delay: Delay) -> ! {
lp_timer.reset(); lp_timer.reset();
} }
} }
if volume_btn_input.ready() {
#[cfg(feature = "enable_print")]
println!("volume btn value: {}", volume_btn_input.value());
volume_btn_input.reset();
}
if light_ctrl_btn_input.ready() {
#[cfg(feature = "enable_print")]
println!("light_ctrl_btn value: {}", sense_coin_input.value());
sense_coin_input.reset();
}
// timers // timers
sp_timer.tick(); sp_timer.tick();