minor fixes to sequence support
This commit is contained in:
parent
9e67026345
commit
9328087e23
4 changed files with 38 additions and 14 deletions
|
|
@ -124,7 +124,7 @@ pub mod sequencer {
|
||||||
ticks_remaining: 0,
|
ticks_remaining: 0,
|
||||||
num_loops: 1,
|
num_loops: 1,
|
||||||
loop_count: 0,
|
loop_count: 0,
|
||||||
enabled: true,
|
enabled: false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -132,6 +132,9 @@ pub mod sequencer {
|
||||||
self.sequence = sequence;
|
self.sequence = sequence;
|
||||||
self.num_loops = num_loops;
|
self.num_loops = num_loops;
|
||||||
self.loop_count = 0;
|
self.loop_count = 0;
|
||||||
|
self.enabled = true;
|
||||||
|
self.index = 0;
|
||||||
|
self.ticks_remaining = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn enable(&mut self) {
|
pub fn enable(&mut self) {
|
||||||
|
|
@ -343,6 +346,7 @@ impl App {
|
||||||
self.timers.led2_timer.enable(true);
|
self.timers.led2_timer.enable(true);
|
||||||
|
|
||||||
self.services.synth0.set_freq(440);
|
self.services.synth0.set_freq(440);
|
||||||
|
self.services.synth0.disable();
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_state(&mut self, state: State) {
|
pub fn set_state(&mut self, state: State) {
|
||||||
|
|
@ -455,10 +459,10 @@ impl App {
|
||||||
|
|
||||||
if self.services.sample_player.need_service() {
|
if self.services.sample_player.need_service() {
|
||||||
self.services.sample_player.service();
|
self.services.sample_player.service();
|
||||||
// let out = self.services.sample_player.get_amplitude();
|
let out = self.services.sample_player.get_amplitude();
|
||||||
// self.interfaces
|
self.interfaces
|
||||||
// .pwm_core
|
.pwm_core
|
||||||
// .write_amplitude(ch32_hal::timer::Channel::Ch4, out as u8);
|
.write_amplitude(ch32_hal::timer::Channel::Ch4, out as u8);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -504,7 +508,7 @@ impl App {
|
||||||
self.timers.sp_timer.reset();
|
self.timers.sp_timer.reset();
|
||||||
self.timers.lp_timer.reset();
|
self.timers.lp_timer.reset();
|
||||||
}
|
}
|
||||||
pub fn coin_detect(&self) {
|
pub fn coin_detect(&mut self) {
|
||||||
#[cfg(feature = "enable_print")]
|
#[cfg(feature = "enable_print")]
|
||||||
println!("coin detect");
|
println!("coin detect");
|
||||||
self.services.sample_player.play_sample();
|
self.services.sample_player.play_sample();
|
||||||
|
|
@ -513,10 +517,16 @@ impl App {
|
||||||
|
|
||||||
// Events
|
// Events
|
||||||
impl App {
|
impl App {
|
||||||
fn main_button_click(&self) {
|
fn main_button_click(&mut self) {
|
||||||
// TODO
|
// TODO
|
||||||
#[cfg(feature = "enable_print")]
|
#[cfg(feature = "enable_print")]
|
||||||
println!("click");
|
println!("click");
|
||||||
|
self.services.sequencer.play_sequence(&crate::TEST_SEQ, 1);
|
||||||
|
self.services.synth0.enable();
|
||||||
|
|
||||||
|
// TODO:
|
||||||
|
// this is a hack to stop the coin thing from playing.
|
||||||
|
self.services.sample_player.disable();
|
||||||
}
|
}
|
||||||
fn main_button_short_press(&self) {
|
fn main_button_short_press(&self) {
|
||||||
// TODO
|
// TODO
|
||||||
|
|
@ -543,6 +553,8 @@ impl App {
|
||||||
// AUDIO:
|
// AUDIO:
|
||||||
// 2. dac switching
|
// 2. dac switching
|
||||||
// 3. amp_en control
|
// 3. amp_en control
|
||||||
|
// 4. write sequences
|
||||||
|
// 5. sample player start disabled
|
||||||
//
|
//
|
||||||
// LED:
|
// LED:
|
||||||
//
|
//
|
||||||
|
|
@ -559,3 +571,4 @@ impl App {
|
||||||
// 1. clean up edge detector
|
// 1. clean up edge detector
|
||||||
// 2. better handling for pwm scaling (brightness / volume)
|
// 2. better handling for pwm scaling (brightness / volume)
|
||||||
// 3. better interrupt handling structs
|
// 3. better interrupt handling structs
|
||||||
|
// 4. led DynamicSequence
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@ pub struct DacService<'a> {
|
||||||
dpcm_decoder: core::cell::RefCell<DpcmDecoder<'a>>,
|
dpcm_decoder: core::cell::RefCell<DpcmDecoder<'a>>,
|
||||||
amplitude: core::cell::RefCell<usize>,
|
amplitude: core::cell::RefCell<usize>,
|
||||||
pub channel: Channel,
|
pub channel: Channel,
|
||||||
|
enabled: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> DacService<'a> {
|
impl<'a> DacService<'a> {
|
||||||
|
|
@ -17,11 +18,17 @@ impl<'a> DacService<'a> {
|
||||||
dpcm_decoder: core::cell::RefCell::new(DpcmDecoder::new()),
|
dpcm_decoder: core::cell::RefCell::new(DpcmDecoder::new()),
|
||||||
amplitude: core::cell::RefCell::new(0),
|
amplitude: core::cell::RefCell::new(0),
|
||||||
channel,
|
channel,
|
||||||
|
enabled: false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn play_sample(&self) {
|
pub fn play_sample(&mut self) {
|
||||||
self.dpcm_decoder.borrow_mut().seek_to_sample(0);
|
self.dpcm_decoder.borrow_mut().seek_to_sample(0);
|
||||||
|
self.enabled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn disable(&mut self) {
|
||||||
|
self.enabled = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn load_data(&self, data: &'a [u8]) {
|
pub fn load_data(&self, data: &'a [u8]) {
|
||||||
|
|
@ -39,12 +46,14 @@ impl<'a> DacService<'a> {
|
||||||
|
|
||||||
impl<'a> TickService for DacService<'a> {
|
impl<'a> TickService for DacService<'a> {
|
||||||
fn tick(&self) {
|
fn tick(&self) {
|
||||||
let mut tc = self.service_data.borrow_mut();
|
if self.enabled {
|
||||||
tc.ticks_remaining = tc.ticks_remaining.saturating_sub(1);
|
let mut tc = self.service_data.borrow_mut();
|
||||||
|
tc.ticks_remaining = tc.ticks_remaining.saturating_sub(1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn need_service(&self) -> bool {
|
fn need_service(&self) -> bool {
|
||||||
self.service_data.borrow().ticks_remaining == 0
|
self.enabled && self.service_data.borrow().ticks_remaining == 0
|
||||||
}
|
}
|
||||||
|
|
||||||
fn service(&self) {
|
fn service(&self) {
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,7 @@ use qingke::riscv;
|
||||||
use crate::app::sequencer::{DynamicSequence, SequenceEntry};
|
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];
|
||||||
static TEST_SEQ: [app::sequencer::SequenceEntry; 2] = [
|
pub static TEST_SEQ: [app::sequencer::SequenceEntry; 2] = [
|
||||||
SequenceEntry {
|
SequenceEntry {
|
||||||
frequency_hz: 440,
|
frequency_hz: 440,
|
||||||
duration_ms: 1000,
|
duration_ms: 1000,
|
||||||
|
|
@ -267,7 +267,8 @@ fn app_main(mut p: hal::Peripherals) -> ! {
|
||||||
let dac_tick_per_service = tick_rate_hz / dac_sample_rate_hz;
|
let dac_tick_per_service = tick_rate_hz / dac_sample_rate_hz;
|
||||||
let dac_service_data = TickServiceData::new(dac_tick_per_service);
|
let dac_service_data = TickServiceData::new(dac_tick_per_service);
|
||||||
|
|
||||||
let coin_sound = include_bytes!("../audio/coin2.raw");
|
let coin_sound = include_bytes!("../audio/coin.raw");
|
||||||
|
// let coin_sound = include_bytes!("../audio/coin2.raw");
|
||||||
|
|
||||||
let sample_player = DacService::new(ch32_hal::timer::Channel::Ch4, dac_service_data);
|
let sample_player = DacService::new(ch32_hal::timer::Channel::Ch4, dac_service_data);
|
||||||
sample_player.load_data(coin_sound);
|
sample_player.load_data(coin_sound);
|
||||||
|
|
|
||||||
|
|
@ -34,10 +34,11 @@ impl SynthesizerService {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn need_service(&self) -> bool {
|
pub fn need_service(&self) -> bool {
|
||||||
self.need_service || self.synth.has_new_output()
|
self.need_service || (self.enabled && self.synth.has_new_output())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn service(&mut self) -> Option<u8> {
|
pub fn service(&mut self) -> Option<u8> {
|
||||||
|
self.need_service = false;
|
||||||
if self.enabled {
|
if self.enabled {
|
||||||
Some(self.synth.get_output())
|
Some(self.synth.get_output())
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue