use core::panic;
pub use crate::protocols::query::*;
use super::{Button, Layout, SleepMode};
#[derive(Debug, Eq, PartialEq, Hash, Clone)]
pub enum Message {
Press { button: Button },
Release { button: Button },
ApplicationVersion(Version),
BootloaderVersion(Version),
ChangeLayout(Layout),
SleepMode(SleepMode),
Brightness(u8),
}
#[derive(Debug, Eq, PartialEq, Hash, Clone)]
pub struct Version {
pub bytes: [u8; 4],
}
pub struct Input;
fn decode_grid_button(btn: u8) -> Button {
let x = (btn % 10) - 1;
let y = 8 - (btn / 10);
Button::GridButton { x, y }
}
fn decode_control_button(btn: u8) -> Button {
match btn {
91..=98 => Button::ControlButton { index: btn - 91 },
19..=89 if btn % 10 == 9 => decode_grid_button(btn),
_ => panic!("Unexpected control button value {}", btn),
}
}
impl crate::InputDevice for Input {
const MIDI_DEVICE_KEYWORD: &'static str = "Launchpad Mini MK3 LPMiniMK3 MI";
const MIDI_CONNECTION_NAME: &'static str = "Launchy Mini Mk3 Input";
type Message = Message;
fn decode_message(_timestamp: u64, data: &[u8]) -> Message {
match data {
&[0x90, button, velocity] => {
let button = decode_grid_button(button);
match velocity {
0 => Message::Release { button },
127 => Message::Press { button },
other => panic!("Unexpected grid note-on velocity {}", other),
}
}
&[0xB0, number, velocity] => {
let button = decode_control_button(number);
match velocity {
0 => Message::Release { button },
127 => Message::Press { button },
other => panic!("Unexpected grid note-on velocity {}", other),
}
}
&[0x80, button, extra] => {
if extra != 0x40 {
panic!("Unexpected grid note-off extra byte {}", extra);
}
let button = decode_grid_button(button);
Message::Release { button }
}
&[240, 126, 0, 6, 2, 0, 32, 41, 19, 1, 0, 0, v1, v2, v3, v4, 247] => {
Message::ApplicationVersion(Version {
bytes: [v1, v2, v3, v4],
})
}
&[240, 126, 0, 6, 2, 0, 32, 41, 19, 17, 0, 0, v1, v2, v3, v4, 247] => {
Message::BootloaderVersion(Version {
bytes: [v1, v2, v3, v4],
})
}
&[240, 0, 32, 41, 2, 13, 9, sleep, 247] => Message::SleepMode(match sleep {
0 => SleepMode::Sleep,
_ => SleepMode::Wake,
}),
&[240, 0, 32, 41, 2, 13, 14, layout, 247] => Message::ChangeLayout(layout.into()),
&[240, 0, 32, 41, 2, 13, 8, brightness, 247] => Message::Brightness(brightness),
other => panic!("Unexpected midi message: {:?}", other),
}
}
}