move synthesizer into app struct
This commit is contained in:
parent
b786bf174a
commit
d3ccc70782
4 changed files with 87 additions and 26 deletions
|
|
@ -75,6 +75,8 @@ pub mod sequencer {
|
||||||
use crate::insert_coin::{
|
use crate::insert_coin::{
|
||||||
LedService, Service, SimplePwmCore, TickService, TickServiceData, TickTimerService,
|
LedService, Service, SimplePwmCore, TickService, TickServiceData, TickTimerService,
|
||||||
};
|
};
|
||||||
|
use crate::synthesizer::SynthesizerService;
|
||||||
|
|
||||||
pub use settings::Settings;
|
pub use settings::Settings;
|
||||||
|
|
||||||
#[cfg(feature = "enable_print")]
|
#[cfg(feature = "enable_print")]
|
||||||
|
|
@ -157,10 +159,23 @@ impl Timers {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// pub struct ServiceConfigs {
|
||||||
|
|
||||||
|
// }
|
||||||
|
// things that sort of don't touch hardware but also do?
|
||||||
|
// TODO: make this merged with the interfaces maybe
|
||||||
|
// but also maybe not, since these are things that require servicing
|
||||||
pub struct Services {
|
pub struct Services {
|
||||||
pub led0: LedService,
|
pub led0: LedService,
|
||||||
pub led1: LedService,
|
pub led1: LedService,
|
||||||
pub led2: LedService,
|
pub led2: LedService,
|
||||||
|
pub synth0: SynthesizerService,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Services {
|
||||||
|
pub fn tick(&mut self) {
|
||||||
|
self.synth0.tick();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct Config {
|
pub struct Config {
|
||||||
|
|
@ -174,6 +189,7 @@ pub struct Sequences {
|
||||||
pub led2: sequencer::BasicSequence<'static>,
|
pub led2: sequencer::BasicSequence<'static>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// things that touch hardware
|
||||||
pub struct Interfaces {
|
pub struct Interfaces {
|
||||||
pub pwm_core: SimplePwmCore<'static, ch32_hal::peripherals::TIM1>,
|
pub pwm_core: SimplePwmCore<'static, ch32_hal::peripherals::TIM1>,
|
||||||
}
|
}
|
||||||
|
|
@ -185,8 +201,6 @@ pub struct App {
|
||||||
services: Services,
|
services: Services,
|
||||||
sequences: Sequences,
|
sequences: Sequences,
|
||||||
interfaces: Interfaces,
|
interfaces: Interfaces,
|
||||||
// TODO: make this the "sound module" or whatever.
|
|
||||||
// synthesizers: AppSynthesizers,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl App {
|
impl App {
|
||||||
|
|
@ -222,6 +236,8 @@ impl App {
|
||||||
|
|
||||||
self.timers.led2_timer.reset();
|
self.timers.led2_timer.reset();
|
||||||
self.timers.led2_timer.enable(true);
|
self.timers.led2_timer.enable(true);
|
||||||
|
|
||||||
|
self.services.synth0.set_freq(440);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_state(&mut self, state: State) {
|
pub fn set_state(&mut self, state: State) {
|
||||||
|
|
@ -238,6 +254,7 @@ impl App {
|
||||||
|
|
||||||
pub fn tick(&mut self) {
|
pub fn tick(&mut self) {
|
||||||
self.timers.tick();
|
self.timers.tick();
|
||||||
|
self.services.tick();
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn service(&mut self) {
|
pub fn service(&mut self) {
|
||||||
|
|
@ -309,5 +326,32 @@ impl App {
|
||||||
.write_amplitude(self.services.led2.channel, self.services.led2.amplitude);
|
.write_amplitude(self.services.led2.channel, self.services.led2.amplitude);
|
||||||
self.services.led2.service();
|
self.services.led2.service();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if self.services.synth0.need_service() {
|
||||||
|
let out = self.services.synth0.service();
|
||||||
|
self.interfaces
|
||||||
|
.pwm_core
|
||||||
|
.write_amplitude(ch32_hal::timer::Channel::Ch4, out);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO LIST
|
||||||
|
//
|
||||||
|
// AUDIO:
|
||||||
|
// 1. volume control
|
||||||
|
// 2. dac switching
|
||||||
|
//
|
||||||
|
// LED:
|
||||||
|
// 1. brightness control
|
||||||
|
//
|
||||||
|
// INTERFACE:
|
||||||
|
// 1. short press handling
|
||||||
|
// 2. long press handling
|
||||||
|
// 3. volume press handling
|
||||||
|
// 4. brightness press handling
|
||||||
|
//
|
||||||
|
// SYSTEM:
|
||||||
|
// 1. deep sleep
|
||||||
|
// 2. battery voltage monitoring
|
||||||
|
// 3. battery voltage cutoff
|
||||||
|
|
|
||||||
|
|
@ -42,6 +42,15 @@ impl<'d, T: GeneralInstance16bit> SimplePwmCore<'d, T> {
|
||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// pub struct SimplePwmHandle<T: GeneralInstance16Bit> {
|
||||||
|
// core: &'static SimplePwmCore<'_, T: GeneralInstance16Bit>,
|
||||||
|
// channel: Channel,
|
||||||
|
// }
|
||||||
|
|
||||||
|
// impl<T: GeneralInstance16Bit> SimplePwmHandle<T> {
|
||||||
|
// pub fn set_amplitude(&self, amplitude: u8) {}
|
||||||
|
// }
|
||||||
|
|
||||||
pub struct CoreConfig {
|
pub struct CoreConfig {
|
||||||
pub tick_rate_hz: usize,
|
pub tick_rate_hz: usize,
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ use debounced_gpio::DebouncedGPIO;
|
||||||
|
|
||||||
// synthesizer :3
|
// synthesizer :3
|
||||||
mod synthesizer;
|
mod synthesizer;
|
||||||
use synthesizer::AppSynthesizers;
|
use synthesizer::SynthesizerService;
|
||||||
|
|
||||||
mod app;
|
mod app;
|
||||||
use app::{
|
use app::{
|
||||||
|
|
@ -262,10 +262,14 @@ fn app_main(mut p: hal::Peripherals) -> ! {
|
||||||
timers: timer_config,
|
timers: timer_config,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// let square_wt = SimpleWavetable::new(&SQUARE_WAVETABLE);
|
||||||
|
// let square = SimpleWavetableSynthesizer::new(square_wt, tick_rate_hz);
|
||||||
|
|
||||||
let app_services = Services {
|
let app_services = Services {
|
||||||
led0: LedService::new(led0_ch),
|
led0: LedService::new(led0_ch),
|
||||||
led1: LedService::new(led1_ch),
|
led1: LedService::new(led1_ch),
|
||||||
led2: LedService::new(led2_ch),
|
led2: LedService::new(led2_ch),
|
||||||
|
synth0: SynthesizerService::new(tick_rate_hz),
|
||||||
};
|
};
|
||||||
|
|
||||||
let app_sequences = Sequences {
|
let app_sequences = Sequences {
|
||||||
|
|
|
||||||
|
|
@ -9,37 +9,41 @@ const SQUARE_WAVETABLE: [u8; 2] = [0, 100];
|
||||||
// 100, 100, 100, 100, 100, 100, 100,
|
// 100, 100, 100, 100, 100, 100, 100,
|
||||||
// ];
|
// ];
|
||||||
|
|
||||||
pub struct AppSynthesizers<'a, T: GeneralInstance16bit> {
|
pub struct SynthesizerService {
|
||||||
pub square: SimpleWavetableSynthesizer<SimpleWavetable<'static, u8>>,
|
pub synth: SimpleWavetableSynthesizer<SimpleWavetable<'static, u8>>,
|
||||||
output: SimplePwmCore<'a, T>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, T: GeneralInstance16bit> AppSynthesizers<'a, T> {
|
impl SynthesizerService {
|
||||||
pub fn new(clock_freq_hz: usize, output: SimplePwmCore<'a, T>) -> Self {
|
pub fn new(clock_freq_hz: usize) -> Self {
|
||||||
let square_wt = SimpleWavetable::new(&SQUARE_WAVETABLE);
|
let square_wt = SimpleWavetable::new(&SQUARE_WAVETABLE);
|
||||||
let square = SimpleWavetableSynthesizer::new(square_wt, clock_freq_hz);
|
let synth = SimpleWavetableSynthesizer::new(square_wt, clock_freq_hz);
|
||||||
|
|
||||||
Self { square, output }
|
Self { synth }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn tick(&mut self) {
|
pub fn tick(&mut self) {
|
||||||
self.square.tick();
|
self.synth.tick();
|
||||||
if self.square.has_new_output() {
|
}
|
||||||
let out = self.square.get_output();
|
|
||||||
self.output.write_amplitude(
|
pub fn need_service(&self) -> bool {
|
||||||
ch32_hal::timer::Channel::Ch4,
|
self.synth.has_new_output()
|
||||||
// TODO: set level here. or maybe use dac?
|
}
|
||||||
out / 2,
|
|
||||||
);
|
pub fn service(&mut self) -> u8 {
|
||||||
|
self.synth.get_output()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn service(&mut self) {
|
impl SynthesizerService {
|
||||||
// println!("HERE");
|
pub fn set_freq(&mut self, freq_hz: usize) {
|
||||||
if self.square.has_new_output() {
|
self.synth.set_freq(freq_hz);
|
||||||
let out = self.square.get_output();
|
}
|
||||||
self.output
|
|
||||||
.write_amplitude(ch32_hal::timer::Channel::Ch4, out / 2);
|
pub fn enable(&mut self) {
|
||||||
}
|
// TODO: write the enable function
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn disable(&mut self) {
|
||||||
|
// TODO: write the disable function
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue