use crate::{Command, SerializationError};
pub const BASE_ADDRESS: u8 = 0x60;
#[derive(Debug, Clone, Copy)]
pub enum Commands {
SetGate { port: u8, state: bool },
SetCv { port: u8, value: i16 },
SetCvSlew { port: u8, ms: u16 },
SetOscPitch { port: u8, pitch: i16 },
SetOscWaveform { port: u8, waveform: u16 },
SetEnvelopeMode { port: u8, enabled: bool },
SetEnvelopeState { port: u8, on: bool },
}
impl Command for Commands {
const MAX_LENGTH: usize = 4;
fn to_bytes<'a>(&self, buffer: &'a mut [u8]) -> Result<&'a [u8], SerializationError> {
if buffer.len() < Self::MAX_LENGTH {
return Err(SerializationError::BufferTooSmall);
}
match *self {
Self::SetGate { port, state } => {
buffer[0] = 0x00;
buffer[1] = port;
buffer[2] = state as u8;
Ok(&buffer[..3])
}
Self::SetCv { port, value } => {
let value_bytes = value.to_be_bytes();
buffer[0] = 0x11;
buffer[1] = port;
buffer[2] = value_bytes[0];
buffer[3] = value_bytes[1];
Ok(&buffer[..4])
}
Self::SetCvSlew { port, ms } => {
let ms_bytes = ms.to_be_bytes();
buffer[0] = 0x12;
buffer[1] = port;
buffer[2] = ms_bytes[0];
buffer[3] = ms_bytes[1];
Ok(&buffer[..4])
}
Self::SetOscPitch { port, pitch } => {
let pitch_bytes = pitch.to_be_bytes();
buffer[0] = 0x41;
buffer[1] = port;
buffer[2] = pitch_bytes[0];
buffer[3] = pitch_bytes[1];
Ok(&buffer[..4])
}
Self::SetOscWaveform { port, waveform } => {
let wf_bytes = waveform.to_be_bytes();
buffer[0] = 0x4A;
buffer[1] = port;
buffer[2] = wf_bytes[0];
buffer[3] = wf_bytes[1];
Ok(&buffer[..4])
}
Self::SetEnvelopeMode { port, enabled } => {
buffer[0] = 0x60;
buffer[1] = port;
buffer[2] = enabled as u8;
Ok(&buffer[..3])
}
Self::SetEnvelopeState { port, on } => {
buffer[0] = 0x6D;
buffer[1] = port;
buffer[2] = on as u8;
Ok(&buffer[..3])
}
}
}
}