add tick timer and re-factor for app vs interface
This commit is contained in:
parent
51af5c3343
commit
1a714bd907
8 changed files with 164 additions and 27 deletions
|
|
@ -4,9 +4,15 @@ use ch32_hal::timer::simple_pwm::SimplePwm;
|
|||
use ch32_hal::timer::Channel;
|
||||
use ch32_hal::delay::Delay;
|
||||
|
||||
use crate::insert_coin::services::{DacService, LedService, Service, ServiceData};
|
||||
use crate::insert_coin::services::{DacService, LedService, TickService, TickServiceData};
|
||||
|
||||
|
||||
// static mut led0_index: usize = 0;
|
||||
// static LED0: [u8; 8] = [0u8, 25u8, 50u8, 75u8, 100u8, 75u8, 50u8, 25u8];
|
||||
|
||||
// static mut LED1_INDEX: usize = 0;
|
||||
// static LED1_DCS: [u8; 5] = [0u8, 25u8, 50u8, 75u8, 100u8];
|
||||
|
||||
pub struct SimplePwmCore<'d, T: GeneralInstance16bit> {
|
||||
pwm: core::cell::RefCell<SimplePwm<'d, T>>,
|
||||
}
|
||||
|
|
@ -43,7 +49,7 @@ impl<'d, T: GeneralInstance16bit> SimplePwmCore<'d, T> {
|
|||
|
||||
|
||||
pub struct CoreConfig {
|
||||
tick_rate_hz: usize,
|
||||
pub tick_rate_hz: usize,
|
||||
}
|
||||
impl CoreConfig {
|
||||
pub fn new(tick_rate_hz: usize) -> Self {
|
||||
|
|
@ -56,14 +62,15 @@ impl CoreConfig {
|
|||
#[derive(Default)]
|
||||
struct Core {
|
||||
tick: usize,
|
||||
active: bool,
|
||||
}
|
||||
|
||||
pub struct InsertCoin<'a, T: GeneralInstance16bit> {
|
||||
core: Core,
|
||||
config: CoreConfig,
|
||||
pub config: CoreConfig,
|
||||
pwm_core: SimplePwmCore<'a, T>,
|
||||
led0: LedService,
|
||||
led1: LedService,
|
||||
pub led0: LedService,
|
||||
pub led1: LedService,
|
||||
// led2: LedService,
|
||||
|
||||
dac: DacService<'a>,
|
||||
|
|
@ -77,20 +84,20 @@ impl<'a, T: GeneralInstance16bit> InsertCoin<'a, T> {
|
|||
// LED0 servicer setup
|
||||
let led0_blink_rate_hz = 9;
|
||||
let led0_tick_per_service = (config.tick_rate_hz/(led0_blink_rate_hz * 2));
|
||||
let led0_service_data = ServiceData::new(led0_tick_per_service);
|
||||
let led0_service_data = TickServiceData::new(led0_tick_per_service);
|
||||
let led0 = LedService::new(ch32_hal::timer::Channel::Ch3, led0_service_data);
|
||||
|
||||
// LED1 servicer setup
|
||||
let led1_blink_rate_hz = 3;
|
||||
let led1_tick_per_service = (config.tick_rate_hz/(led1_blink_rate_hz * 2));
|
||||
let led1_service_data = ServiceData::new(led1_tick_per_service);
|
||||
let led1_service_data = TickServiceData::new(led1_tick_per_service);
|
||||
let led1 = LedService::new(ch32_hal::timer::Channel::Ch1, led1_service_data);
|
||||
|
||||
|
||||
// DAC servicer setup
|
||||
let dac_sample_rate_hz = 16000;
|
||||
let dac_tick_per_service = (config.tick_rate_hz/(dac_sample_rate_hz));
|
||||
let dac_service_data = ServiceData::new(dac_tick_per_service);
|
||||
let dac_service_data = TickServiceData::new(dac_tick_per_service);
|
||||
let dac = DacService::new(ch32_hal::timer::Channel::Ch4, dac_service_data);
|
||||
let data = include_bytes!("../../../../dpcm-encoder-decoder/sweep_dpcm_u4.raw");
|
||||
dac.load_data(data);
|
||||
|
|
@ -111,6 +118,34 @@ impl<'a, T: GeneralInstance16bit> InsertCoin<'a, T> {
|
|||
}
|
||||
}
|
||||
|
||||
/// takes self reference and runs
|
||||
pub fn service(&mut self) {
|
||||
|
||||
if self.is_active() {
|
||||
self.led0.tick();
|
||||
self.led1.tick();
|
||||
self.dac.tick();
|
||||
|
||||
|
||||
if self.led0.need_service() {
|
||||
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.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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// consumes self and runs
|
||||
pub fn run(mut self) -> ! {
|
||||
let mut delay = Delay;
|
||||
|
|
@ -162,4 +197,12 @@ impl<'a, T: GeneralInstance16bit> InsertCoin<'a, T> {
|
|||
delay.delay_us(tick_interval_us as u32);
|
||||
}
|
||||
}
|
||||
|
||||
pub fn is_active(&self) -> bool {
|
||||
self.core.active
|
||||
}
|
||||
|
||||
pub fn set_active(&mut self, active: bool) {
|
||||
self.core.active = active;
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue