add interrupts for most handlers
This commit is contained in:
parent
e3235b34a4
commit
a71c7986e6
15 changed files with 1028 additions and 280 deletions
|
|
@ -1,8 +1,6 @@
|
|||
use adpcm_pwm_dac::dac;
|
||||
use ch32_hal::timer::GeneralInstance16bit;
|
||||
use ch32_hal::timer::simple_pwm::SimplePwm;
|
||||
use ch32_hal::timer::Channel;
|
||||
use ch32_hal::delay::Delay;
|
||||
|
||||
use crate::insert_coin::services::{DacService, LedService, TickService, TickServiceData, Service};
|
||||
|
||||
|
|
@ -40,9 +38,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);
|
||||
// }
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -61,7 +59,7 @@ impl CoreConfig {
|
|||
|
||||
#[derive(Default)]
|
||||
struct Core {
|
||||
tick: usize,
|
||||
_tick: usize,
|
||||
active: bool,
|
||||
}
|
||||
|
||||
|
|
@ -73,7 +71,7 @@ pub struct InsertCoin<'a, T: GeneralInstance16bit> {
|
|||
pub led1: LedService,
|
||||
// led2: LedService,
|
||||
|
||||
dac: DacService<'a>,
|
||||
pub dac: DacService<'a>,
|
||||
}
|
||||
|
||||
impl<'a, T: GeneralInstance16bit> InsertCoin<'a, T> {
|
||||
|
|
@ -82,25 +80,17 @@ 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 = TickServiceData::new(led0_tick_per_service);
|
||||
let led0 = LedService::new(ch32_hal::timer::Channel::Ch3, led0_service_data);
|
||||
let led0 = LedService::new(ch32_hal::timer::Channel::Ch3);
|
||||
|
||||
// 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 = TickServiceData::new(led1_tick_per_service);
|
||||
let led1 = LedService::new(ch32_hal::timer::Channel::Ch1, led1_service_data);
|
||||
let led1 = LedService::new(ch32_hal::timer::Channel::Ch1);
|
||||
|
||||
|
||||
// DAC servicer setup
|
||||
let dac_sample_rate_hz = 16000;
|
||||
let dac_tick_per_service = (config.tick_rate_hz/(dac_sample_rate_hz));
|
||||
let dac_tick_per_service = config.tick_rate_hz/(dac_sample_rate_hz);
|
||||
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);
|
||||
|
||||
Self {
|
||||
config,
|
||||
|
|
@ -110,11 +100,6 @@ impl<'a, T: GeneralInstance16bit> InsertCoin<'a, T> {
|
|||
led1,
|
||||
// led2,
|
||||
dac,
|
||||
// led1: Led {
|
||||
// channel: hal::timer::Channel::Ch1,
|
||||
// amplitude: 0,
|
||||
// need_service: false,
|
||||
// },
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -144,55 +129,53 @@ impl<'a, T: GeneralInstance16bit> InsertCoin<'a, T> {
|
|||
|
||||
}
|
||||
|
||||
/// consumes self and runs
|
||||
pub fn run(mut self) -> ! {
|
||||
let mut delay = Delay;
|
||||
let tick_interval_us = 1000000/self.config.tick_rate_hz;
|
||||
// /// consumes self and runs
|
||||
// pub fn run(mut self) -> ! {
|
||||
// let mut delay = Delay;
|
||||
// let tick_interval_us = 1000000/self.config.tick_rate_hz;
|
||||
|
||||
|
||||
let mut led0_index = 0;
|
||||
let led0_dcs = [0u8, 25u8, 50u8, 75u8, 100u8, 75u8, 50u8, 25u8];
|
||||
// let mut led0_index = 0;
|
||||
// let led0_dcs = [0u8, 25u8, 50u8, 75u8, 100u8, 75u8, 50u8, 25u8];
|
||||
|
||||
let mut led1_index = 0;
|
||||
let led1_dcs = [0u8, 25u8, 50u8, 75u8, 100u8];
|
||||
// let mut led1_index = 0;
|
||||
// let led1_dcs = [0u8, 25u8, 50u8, 75u8, 100u8];
|
||||
|
||||
loop {
|
||||
self.dac.tick();
|
||||
// loop {
|
||||
// self.dac.tick();
|
||||
|
||||
|
||||
if(self.led0.need_service()) {
|
||||
self.led0.set_amplitude(led0_dcs[led0_index]);
|
||||
self.pwm_core.write_amplitude(self.led0.channel, self.led0.amplitude);
|
||||
// if(self.led0.need_service()) {
|
||||
// self.led0.set_amplitude(led0_dcs[led0_index]);
|
||||
// self.pwm_core.write_amplitude(self.led0.channel, self.led0.amplitude);
|
||||
|
||||
led0_index += 1;
|
||||
if led0_index > led0_dcs.len() - 1 {
|
||||
led0_index = 0;
|
||||
}
|
||||
self.led0.service();
|
||||
}
|
||||
// led0_index += 1;
|
||||
// if led0_index > led0_dcs.len() - 1 {
|
||||
// led0_index = 0;
|
||||
// }
|
||||
// self.led0.service();
|
||||
// }
|
||||
|
||||
if(self.led1.need_service()) {
|
||||
self.led1.set_amplitude(led1_dcs[led1_index]);
|
||||
self.pwm_core.write_amplitude(self.led1.channel, self.led1.amplitude);
|
||||
// if(self.led1.need_service()) {
|
||||
// self.led1.set_amplitude(led1_dcs[led1_index]);
|
||||
// self.pwm_core.write_amplitude(self.led1.channel, self.led1.amplitude);
|
||||
|
||||
led1_index += 1;
|
||||
if led1_index > led1_dcs.len() - 1 {
|
||||
led1_index = 0;
|
||||
}
|
||||
self.led1.service();
|
||||
}
|
||||
// led1_index += 1;
|
||||
// if led1_index > led1_dcs.len() - 1 {
|
||||
// led1_index = 0;
|
||||
// }
|
||||
// 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);
|
||||
}
|
||||
// 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);
|
||||
// }
|
||||
|
||||
|
||||
|
||||
delay.delay_us(tick_interval_us as u32);
|
||||
}
|
||||
}
|
||||
// delay.delay_us(tick_interval_us as u32);
|
||||
// }
|
||||
// }
|
||||
|
||||
pub fn is_active(&self) -> bool {
|
||||
self.core.active
|
||||
|
|
|
|||
|
|
@ -1,8 +1,7 @@
|
|||
mod insert_coin;
|
||||
mod services;
|
||||
use services::LedService;
|
||||
|
||||
pub use services::TickTimerService;
|
||||
|
||||
pub use services::{TickService, TickServiceData, Service};
|
||||
pub use services::{TickService, TickServiceData};
|
||||
pub use insert_coin::{InsertCoin, CoreConfig, SimplePwmCore};
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
use crate::insert_coin::services::{TickServiceData, TickService};
|
||||
|
||||
|
||||
use adpcm_pwm_dac::{dac::{DpcmDac, DpcmDecoder}, interface::DacInterface};
|
||||
use adpcm_pwm_dac::dac::DpcmDecoder;
|
||||
use ch32_hal::timer::Channel;
|
||||
|
||||
pub struct DacService<'a> {
|
||||
|
|
@ -23,6 +23,7 @@ impl<'a> DacService<'a> {
|
|||
|
||||
pub fn load_data(&self, data: &'a [u8]) {
|
||||
self.dpcm_decoder.borrow_mut().load_data(data);
|
||||
self.dpcm_decoder.borrow_mut().seek_to_sample(0);
|
||||
}
|
||||
|
||||
pub fn set_amplitude(&self, amplitude: usize) {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
use ch32_hal::timer::Channel;
|
||||
|
||||
use crate::insert_coin::services::{Service, TickService, TickServiceData};
|
||||
use crate::insert_coin::services::{Service};
|
||||
|
||||
pub struct LedService {
|
||||
// need_service: core::cell::RefCell<bool>,
|
||||
|
|
@ -10,7 +10,7 @@ pub struct LedService {
|
|||
}
|
||||
|
||||
impl LedService {
|
||||
pub fn new(channel: Channel, service_data: TickServiceData) -> Self {
|
||||
pub fn new(channel: Channel) -> Self {
|
||||
Self {
|
||||
// service_data: core::cell::RefCell::new(service_data),
|
||||
need_service: false,
|
||||
|
|
|
|||
|
|
@ -1,10 +1,8 @@
|
|||
use ch32_hal::timer::Channel;
|
||||
|
||||
use crate::insert_coin::services::{TickServiceData, TickService};
|
||||
|
||||
pub struct TickTimerService {
|
||||
service_data: core::cell::RefCell<TickServiceData>,
|
||||
auto_reset: bool,
|
||||
_auto_reset: bool,
|
||||
enabled: bool,
|
||||
}
|
||||
|
||||
|
|
@ -12,18 +10,18 @@ impl TickTimerService {
|
|||
pub fn new(service_data: TickServiceData, auto_reset: bool) -> Self {
|
||||
Self {
|
||||
service_data: core::cell::RefCell::new(service_data),
|
||||
auto_reset,
|
||||
_auto_reset: auto_reset,
|
||||
enabled: false,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn is_enabled(&self) -> bool {
|
||||
self.enabled
|
||||
}
|
||||
// pub fn is_enabled(&self) -> bool {
|
||||
// self.enabled
|
||||
// }
|
||||
|
||||
pub fn reset(&mut self) {
|
||||
let mut sd = self.service_data.borrow_mut();
|
||||
sd.ticks_per_service = sd.ticks_remaining;
|
||||
sd.ticks_remaining = sd.ticks_per_service;
|
||||
self.enabled = false;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue