use crate::{Command, SerializationError};
pub const ADDRESS: u8 = 0x20;
#[derive(Debug, Clone, Copy)]
pub enum Commands {
SetCv { port: u8, value: i16 },
SetCvSlew { port: u8, ms: u16 },
SetCvFromFader { device_port: u8, value: u16 },
SetTrState { port: u8, state: bool },
SetTrToggle { port: u8 },
SetTrPulse { port: u8 },
SetTrPulseDuration { port: u8, ms: u16 },
LoadPreset { preset: u8 },
SavePreset { preset: u8 },
KriaSetStep { track: u8, step: u8, state: u8 },
}
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::SetCv { port, value } => {
let value_bytes = value.to_be_bytes();
buffer[0] = 0x01;
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] = 0x02;
buffer[1] = port;
buffer[2] = ms_bytes[0];
buffer[3] = ms_bytes[1];
Ok(&buffer[..4])
}
Self::SetCvFromFader { device_port, value } => {
let value_bytes = value.to_be_bytes();
buffer[0] = 0x06;
buffer[1] = device_port;
buffer[2] = value_bytes[0];
buffer[3] = value_bytes[1];
Ok(&buffer[..4])
}
Self::SetTrState { port, state } => {
buffer[0] = 0x10;
buffer[1] = port;
buffer[2] = state as u8;
Ok(&buffer[..3])
}
Self::SetTrToggle { port } => {
buffer[0] = 0x11;
buffer[1] = port;
Ok(&buffer[..2])
}
Self::SetTrPulse { port } => {
buffer[0] = 0x12;
buffer[1] = port;
Ok(&buffer[..2])
}
Self::SetTrPulseDuration { port, ms } => {
let ms_bytes = ms.to_be_bytes();
buffer[0] = 0x13;
buffer[1] = port;
buffer[2] = ms_bytes[0];
buffer[3] = ms_bytes[1];
Ok(&buffer[..4])
}
Self::LoadPreset { preset } => {
buffer[0] = 0x20;
buffer[1] = preset;
Ok(&buffer[..2])
}
Self::SavePreset { preset } => {
buffer[0] = 0x21;
buffer[1] = preset;
Ok(&buffer[..2])
}
Self::KriaSetStep { track, step, state } => {
buffer[0] = 0x30;
buffer[1] = track;
buffer[2] = step;
buffer[3] = state;
Ok(&buffer[..4])
}
}
}
}