Compare commits

...

2 commits

Author SHA1 Message Date
8ea4b4401e add amp_en control 2025-11-14 13:30:01 -07:00
1c2823eb1b add 4 hour shutdown timer 2025-11-14 13:14:02 -07:00
2 changed files with 61 additions and 12 deletions

View file

@ -193,6 +193,7 @@ pub struct TimerConfig {
pub usb_adc_timer_ms: usize, pub usb_adc_timer_ms: usize,
pub led0_timer_ms: usize, pub led0_timer_ms: usize,
pub led1_timer_ms: usize, pub led1_timer_ms: usize,
pub shutdown_timer_ms: usize,
// pub led2_timer_ms: usize, // pub led2_timer_ms: usize,
} }
@ -203,6 +204,7 @@ pub struct Timers {
usb_adc_timer: TickTimerService, usb_adc_timer: TickTimerService,
led0_timer: TickTimerService, led0_timer: TickTimerService,
led1_timer: TickTimerService, led1_timer: TickTimerService,
shutdown_timer: TickTimerService,
// led2_timer: TickTimerService, // led2_timer: TickTimerService,
} }
@ -233,10 +235,13 @@ impl Timers {
TickServiceData::new(config.led1_timer_ms * system_tick_rate_hz / 1000), TickServiceData::new(config.led1_timer_ms * system_tick_rate_hz / 1000),
true, true,
), ),
// led2_timer: TickTimerService::new( shutdown_timer: TickTimerService::new(
// TickServiceData::new(config.led2_timer_ms * system_tick_rate_hz / 1000), TickServiceData::new(config.shutdown_timer_ms * system_tick_rate_hz / 1000),
// true, false,
// ), ), // led2_timer: TickTimerService::new(
// TickServiceData::new(config.led2_timer_ms * system_tick_rate_hz / 1000),
// true,
// ),
} }
} }
pub fn tick(&mut self) { pub fn tick(&mut self) {
@ -246,6 +251,7 @@ impl Timers {
self.usb_adc_timer.tick(); self.usb_adc_timer.tick();
self.led0_timer.tick(); self.led0_timer.tick();
self.led1_timer.tick(); self.led1_timer.tick();
self.shutdown_timer.tick();
// self.led2_timer.tick(); // self.led2_timer.tick();
} }
pub fn need_service(&self) -> bool { pub fn need_service(&self) -> bool {
@ -255,6 +261,7 @@ impl Timers {
| self.usb_adc_timer.need_service() | self.usb_adc_timer.need_service()
| self.led0_timer.need_service() | self.led0_timer.need_service()
| self.led1_timer.need_service() | self.led1_timer.need_service()
| self.shutdown_timer.need_service()
// | self.led2_timer.need_service() // | self.led2_timer.need_service()
} }
pub fn init(&mut self) { pub fn init(&mut self) {
@ -302,6 +309,7 @@ pub struct Sequences {
pub struct Interfaces { pub struct Interfaces {
pub pwm_core: SimplePwmCore<'static, ch32_hal::peripherals::TIM1>, pub pwm_core: SimplePwmCore<'static, ch32_hal::peripherals::TIM1>,
pub adc_core: crate::AdcCore, pub adc_core: crate::AdcCore,
pub amp: crate::Amplifier,
} }
pub struct App { pub struct App {
@ -345,6 +353,9 @@ impl App {
self.timers.led1_timer.reset(); self.timers.led1_timer.reset();
self.timers.led1_timer.enable(true); self.timers.led1_timer.enable(true);
self.timers.shutdown_timer.reset();
self.timers.shutdown_timer.enable(true);
// self.timers.led2_timer.reset(); // self.timers.led2_timer.reset();
// self.timers.led2_timer.enable(true); // self.timers.led2_timer.enable(true);
@ -394,14 +405,8 @@ impl App {
// #[cfg(feature = "enable_print")] // #[cfg(feature = "enable_print")]
// println!("batt adc service: {bv}, {avg}"); // println!("batt adc service: {bv}, {avg}");
if avg < 421 { if avg < 421 {
// self.services
// .sequencer
// .play_sequence(&crate::sequences::COIN_CHIRP, 0);
self.set_state(State::DeepSleep); self.set_state(State::DeepSleep);
} }
// TODO:
// do stuff if the battery voltage is below some threshold
} }
if self.timers.usb_adc_timer.need_service() { if self.timers.usb_adc_timer.need_service() {
self.timers.usb_adc_timer.service(); self.timers.usb_adc_timer.service();
@ -442,6 +447,11 @@ impl App {
// #[cfg(feature = "enable_print")] // #[cfg(feature = "enable_print")]
// println!("led1 service"); // println!("led1 service");
} }
if self.timers.shutdown_timer.need_service() {
self.timers.shutdown_timer.service();
self.timers.shutdown_timer.reset();
self.set_state(State::DeepSleep);
}
// if self.timers.led2_timer.need_service() { // if self.timers.led2_timer.need_service() {
// let out = match self.settings.brightness { // let out = match self.settings.brightness {
// Level::Off => 0, // Level::Off => 0,
@ -493,10 +503,14 @@ impl App {
} else { } else {
self.services.sequencer.disable(); self.services.sequencer.disable();
self.services.synth0.disable(); self.services.synth0.disable();
self.interfaces.amp.disable();
} }
} }
if self.services.synth0.need_service() { if self.services.synth0.need_service() {
if !self.interfaces.amp.enabled() {
self.interfaces.amp.enable();
}
let out = match self.services.synth0.service() { let out = match self.services.synth0.service() {
Some(value) => value / 6 / self.settings.volume.as_volume_divisor(), Some(value) => value / 6 / self.settings.volume.as_volume_divisor(),
None => 0, None => 0,
@ -531,16 +545,21 @@ impl App {
self.interfaces self.interfaces
.pwm_core .pwm_core
.disable(ch32_hal::timer::Channel::Ch4); .disable(ch32_hal::timer::Channel::Ch4);
self.interfaces.amp.disable();
} }
pub fn volume_button(&mut self) { pub fn volume_button(&mut self) {
self.settings.volume.next(); self.settings.volume.next();
#[cfg(feature = "enable_print")] #[cfg(feature = "enable_print")]
println!("new volume: {:?}", self.settings.volume); println!("new volume: {:?}", self.settings.volume);
self.timers.shutdown_timer.reset();
self.timers.shutdown_timer.enable(true);
} }
pub fn brightness_button(&mut self) { pub fn brightness_button(&mut self) {
self.settings.brightness.next(); self.settings.brightness.next();
#[cfg(feature = "enable_print")] #[cfg(feature = "enable_print")]
println!("new brightness: {:?}", self.settings.brightness); println!("new brightness: {:?}", self.settings.brightness);
self.timers.shutdown_timer.reset();
self.timers.shutdown_timer.enable(true);
} }
pub fn main_button_press(&mut self) { pub fn main_button_press(&mut self) {
// TODO // TODO
@ -548,8 +567,10 @@ impl App {
println!("main button press"); println!("main button press");
self.timers.sp_timer.reset(); self.timers.sp_timer.reset();
self.timers.lp_timer.reset(); self.timers.lp_timer.reset();
self.timers.shutdown_timer.reset();
self.timers.sp_timer.enable(true); self.timers.sp_timer.enable(true);
self.timers.lp_timer.enable(true); self.timers.lp_timer.enable(true);
self.timers.shutdown_timer.enable(true);
self.main_button_click(); self.main_button_click();
} }
pub fn main_button_release(&mut self) { pub fn main_button_release(&mut self) {
@ -581,6 +602,8 @@ impl App {
self.services self.services
.sequencer .sequencer
.play_sequence(&crate::sequences::COIN_CHIRP, 0); .play_sequence(&crate::sequences::COIN_CHIRP, 0);
self.timers.shutdown_timer.reset();
self.timers.shutdown_timer.enable(true);
} }
} }

View file

@ -44,6 +44,27 @@ use crate::app::sequencer::{DynamicSequence, SequenceEntry};
static LED0_SEQ: [u8; 8] = [0u8, 25u8, 50u8, 75u8, 100u8, 75u8, 50u8, 25u8]; static LED0_SEQ: [u8; 8] = [0u8, 25u8, 50u8, 75u8, 100u8, 75u8, 50u8, 25u8];
pub struct Amplifier {
amp_en: Output<'static>,
}
impl Amplifier {
pub fn new(amp_en: Output<'static>) -> Self {
let mut amp = Self { amp_en };
amp.disable();
amp
}
pub fn enable(&mut self) {
self.amp_en.set_low();
}
pub fn disable(&mut self) {
self.amp_en.set_high();
}
pub fn enabled(&self) -> bool {
!self.amp_en.is_set_high()
}
}
use hal::adc::Adc; use hal::adc::Adc;
use hal::peripherals::{ADC1, PD4}; use hal::peripherals::{ADC1, PD4};
@ -271,7 +292,7 @@ fn app_main(mut p: hal::Peripherals) -> ! {
let extra_io_2 = p.PD3; let extra_io_2 = p.PD3;
let mut amp_en_output = Output::new(amp_en, Level::Low, Default::default()); let mut amp_en_output = Output::new(amp_en, Level::Low, Default::default());
amp_en_output.set_low(); let amp = Amplifier::new(amp_en_output);
// set up interrupts // set up interrupts
unsafe { system::init_gpio_irq(sense_coin_pin.pin(), sense_coin_pin.port(), true, false) }; unsafe { system::init_gpio_irq(sense_coin_pin.pin(), sense_coin_pin.port(), true, false) };
@ -297,6 +318,7 @@ fn app_main(mut p: hal::Peripherals) -> ! {
usb_adc_timer_ms: 10000, usb_adc_timer_ms: 10000,
led0_timer_ms: 100, led0_timer_ms: 100,
led1_timer_ms: 100, led1_timer_ms: 100,
shutdown_timer_ms: 4 * 60 * 60 * 1000,
// led2_timer_ms: 100, // led2_timer_ms: 100,
}; };
@ -334,7 +356,11 @@ fn app_main(mut p: hal::Peripherals) -> ! {
audio: &SEQUENCE_LIST, audio: &SEQUENCE_LIST,
}; };
let app_interfaces = Interfaces { pwm_core, adc_core }; let app_interfaces = Interfaces {
pwm_core,
adc_core,
amp,
};
let mut app = App::new(app_config, app_services, app_sequences, app_interfaces); let mut app = App::new(app_config, app_services, app_sequences, app_interfaces);