use crate::reader::*;
use crate::version::*;
#[derive(PartialEq, Debug, Clone, Copy, Default)]
pub struct FX {
pub command: u8,
pub value: u8,
}
impl FX {
pub(crate) fn from_reader(reader: &Reader) -> Result<Self> {
Ok(Self {
command: reader.read(),
value: reader.read(),
})
}
pub fn print(&self, version: Version) -> String {
if self.command == 255 {
format!("---00")
} else {
let c = if version.at_least(3, 0) {
self.format_command3()
} else {
self.format_command2()
};
format!("{}{:02x}", c, self.value)
}
}
pub fn command_eq(&self, s: &str, version: Version) -> bool {
let c = if version.at_least(3, 0) {
Self::str_to_command3(s)
} else {
Self::str_to_command2(s)
};
c == self.command
}
fn format_command2(&self) -> String {
match self.command {
0x00 => format!("ARP"),
0x01 => format!("CHA"),
0x02 => format!("DEL"),
0x03 => format!("GRV"),
0x04 => format!("HOP"),
0x05 => format!("KIL"),
0x06 => format!("RAN"),
0x07 => format!("RET"),
0x08 => format!("REP"),
0x09 => format!("NTH"),
0x0A => format!("PSL"),
0x0B => format!("PSN"),
0x0C => format!("PVB"),
0x0D => format!("PVX"),
0x0E => format!("SCA"),
0x0F => format!("SCG"),
0x10 => format!("SED"),
0x11 => format!("SNG"),
0x12 => format!("TBL"),
0x13 => format!("THO"),
0x14 => format!("TIC"),
0x15 => format!("TPO"),
0x16 => format!("TSP"),
0x17 => format!("VMV"),
0x18 => format!("XCM"),
0x19 => format!("XCF"),
0x1A => format!("XCW"),
0x1B => format!("XCR"),
0x1C => format!("XDT"),
0x1D => format!("XDF"),
0x1E => format!("XDW"),
0x1F => format!("XDR"),
0x20 => format!("XRS"),
0x21 => format!("XRD"),
0x22 => format!("XRM"),
0x23 => format!("XRF"),
0x24 => format!("XRW"),
0x25 => format!("XRZ"),
0x26 => format!("VCH"),
0x27 => format!("VCD"),
0x28 => format!("VRE"),
0x29 => format!("VT1"),
0x2A => format!("VT2"),
0x2B => format!("VT3"),
0x2C => format!("VT4"),
0x2D => format!("VT5"),
0x2E => format!("VT6"),
0x2F => format!("VT7"),
0x30 => format!("VT8"),
0x31 => format!("DJF"),
0x32 => format!("IVO"),
0x33 => format!("ICH"),
0x34 => format!("IDE"),
0x35 => format!("IRE"),
0x36 => format!("IV2"),
0x37 => format!("IC2"),
0x38 => format!("ID2"),
0x39 => format!("IR2"),
0x3A => format!("USB"),
0x80 => format!("I00"),
0x81 => format!("I01"),
0x82 => format!("I02"),
0x83 => format!("I03"),
0x84 => format!("I04"),
0x85 => format!("I05"),
0x86 => format!("I06"),
0x87 => format!("I07"),
0x88 => format!("I08"),
0x89 => format!("I09"),
0x8A => format!("I0A"),
0x8B => format!("I0B"),
0x8C => format!("I0C"),
0x8D => format!("I0D"),
0x8E => format!("I0E"),
0x8F => format!("I8F"),
0x90 => format!("I90"),
0x91 => format!("I91"),
0x92 => format!("I92"),
0x93 => format!("I93"),
0x94 => format!("I94"),
0x95 => format!("I95"),
0x96 => format!("I96"),
0x97 => format!("I97"),
0x98 => format!("I98"),
0x99 => format!("I99"),
0x9A => format!("I9A"),
0x9B => format!("I9B"),
0x9C => format!("I9C"),
0x9D => format!("I9D"),
0x9E => format!("I9E"),
0x9F => format!("I9F"),
0xA0 => format!("IA0"),
0xA1 => format!("IA1"),
0xA2 => format!("IA2"),
x => format!("{:02x} ", x),
}
}
fn str_to_command2(s: &str) -> u8 {
match s {
"ARP" => 0x00,
"CHA" => 0x01,
"DEL" => 0x02,
"GRV" => 0x03,
"HOP" => 0x04,
"KIL" => 0x05,
"RAN" => 0x06,
"RET" => 0x07,
"REP" => 0x08,
"NTH" => 0x09,
"PSL" => 0x0A,
"PSN" => 0x0B,
"PVB" => 0x0C,
"PVX" => 0x0D,
"SCA" => 0x0E,
"SCG" => 0x0F,
"SED" => 0x10,
"SNG" => 0x11,
"TBL" => 0x12,
"THO" => 0x13,
"TIC" => 0x14,
"TPO" => 0x15,
"TSP" => 0x16,
"VMV" => 0x17,
"XCM" => 0x18,
"XCF" => 0x19,
"XCW" => 0x1A,
"XCR" => 0x1B,
"XDT" => 0x1C,
"XDF" => 0x1D,
"XDW" => 0x1E,
"XDR" => 0x1F,
"XRS" => 0x20,
"XRD" => 0x21,
"XRM" => 0x22,
"XRF" => 0x23,
"XRW" => 0x24,
"XRZ" => 0x25,
"VCH" => 0x26,
"VCD" => 0x27,
"VRE" => 0x28,
"VT1" => 0x29,
"VT2" => 0x2A,
"VT3" => 0x2B,
"VT4" => 0x2C,
"VT5" => 0x2D,
"VT6" => 0x2E,
"VT7" => 0x2F,
"VT8" => 0x30,
"DJF" => 0x31,
"IVO" => 0x32,
"ICH" => 0x33,
"IDE" => 0x34,
"IRE" => 0x35,
"IV2" => 0x36,
"IC2" => 0x37,
"ID2" => 0x38,
"IR2" => 0x39,
"USB" => 0x3A,
"I00" => 0x80,
"I01" => 0x81,
"I02" => 0x82,
"I03" => 0x83,
"I04" => 0x84,
"I05" => 0x85,
"I06" => 0x86,
"I07" => 0x87,
"I08" => 0x88,
"I09" => 0x89,
"I0A" => 0x8A,
"I0B" => 0x8B,
"I0C" => 0x8C,
"I0D" => 0x8D,
"I0E" => 0x8E,
"I8F" => 0x8F,
"I90" => 0x90,
"I91" => 0x91,
"I92" => 0x92,
"I93" => 0x93,
"I94" => 0x94,
"I95" => 0x95,
"I96" => 0x96,
"I97" => 0x97,
"I98" => 0x98,
"I99" => 0x99,
"I9A" => 0x9A,
"I9B" => 0x9B,
"I9C" => 0x9C,
"I9D" => 0x9D,
"I9E" => 0x9E,
"I9F" => 0x9F,
"IA0" => 0xA0,
"IA1" => 0xA1,
"IA2" => 0xA2,
_ => 0xFF,
}
}
fn format_command3(&self) -> String {
match self.command {
0x00 => format!("ARP"),
0x01 => format!("CHA"),
0x02 => format!("DEL"),
0x03 => format!("GRV"),
0x04 => format!("HOP"),
0x05 => format!("KIL"),
0x06 => format!("RND"),
0x07 => format!("RNL"),
0x08 => format!("RET"),
0x09 => format!("REP"),
0x0A => format!("RMX"),
0x0B => format!("NTH"),
0x0C => format!("PSL"),
0x0D => format!("PBN"),
0x0E => format!("PVB"),
0x0F => format!("PVX"),
0x10 => format!("SCA"),
0x11 => format!("SCG"),
0x12 => format!("SED"),
0x13 => format!("SNG"),
0x14 => format!("TBL"),
0x15 => format!("THO"),
0x16 => format!("TIC"),
0x17 => format!("TBX"),
0x18 => format!("TPO"),
0x19 => format!("TSP"),
0x1A => format!("OFF"),
0x1B => format!("VMV"),
0x1C => format!("XCM"),
0x1D => format!("XCF"),
0x1E => format!("XCW"),
0x1F => format!("XCR"),
0x20 => format!("XDT"),
0x21 => format!("XDF"),
0x22 => format!("XDW"),
0x23 => format!("XDR"),
0x24 => format!("XRS"),
0x25 => format!("XRD"),
0x26 => format!("XRM"),
0x27 => format!("XRF"),
0x28 => format!("XRW"),
0x29 => format!("XRZ"),
0x2A => format!("VCH"),
0x2B => format!("VCD"),
0x2C => format!("VRE"),
0x2D => format!("VT1"),
0x2E => format!("VT2"),
0x2F => format!("VT3"),
0x30 => format!("VT4"),
0x31 => format!("VT5"),
0x32 => format!("VT6"),
0x33 => format!("VT7"),
0x34 => format!("VT8"),
0x35 => format!("DJF"),
0x36 => format!("IVO"),
0x37 => format!("ICH"),
0x38 => format!("IDE"),
0x39 => format!("IRE"),
0x3A => format!("IV2"),
0x3B => format!("IC2"),
0x3C => format!("ID2"),
0x3D => format!("IR2"),
0x3E => format!("USB"),
0x80 => format!("I00"),
0x81 => format!("I01"),
0x82 => format!("I02"),
0x83 => format!("I03"),
0x84 => format!("I04"),
0x85 => format!("I05"),
0x86 => format!("I06"),
0x87 => format!("I07"),
0x88 => format!("I08"),
0x89 => format!("I09"),
0x8A => format!("I0A"),
0x8B => format!("I0B"),
0x8C => format!("I0C"),
0x8D => format!("I0D"),
0x8E => format!("I0E"),
0x8F => format!("I8F"),
0x90 => format!("I90"),
0x91 => format!("I91"),
0x92 => format!("I92"),
0x93 => format!("I93"),
0x94 => format!("I94"),
0x95 => format!("I95"),
0x96 => format!("I96"),
0x97 => format!("I97"),
0x98 => format!("I98"),
0x99 => format!("I99"),
0x9A => format!("I9A"),
0x9B => format!("I9B"),
0x9C => format!("I9C"),
0x9D => format!("I9D"),
0x9E => format!("I9E"),
0x9F => format!("I9F"),
0xA0 => format!("IA0"),
0xA1 => format!("IA1"),
0xA2 => format!("IA2"),
0xA3 => format!("IA3"),
0xA4 => format!("IA4"),
0xA5 => format!("IA5"),
0xA6 => format!("IA6"),
0xA7 => format!("IA7"),
x => format!("{:02x} ", x),
}
}
fn str_to_command3(s: &str) -> u8 {
match s {
"ARP" => 0x00,
"CHA" => 0x01,
"DEL" => 0x02,
"GRV" => 0x03,
"HOP" => 0x04,
"KIL" => 0x05,
"RND" => 0x06,
"RNL" => 0x07,
"RET" => 0x08,
"REP" => 0x09,
"RMX" => 0x0A,
"NTH" => 0x0B,
"PSL" => 0x0C,
"PBN" => 0x0D,
"PVB" => 0x0E,
"PVX" => 0x0F,
"SCA" => 0x10,
"SCG" => 0x11,
"SED" => 0x12,
"SNG" => 0x13,
"TBL" => 0x14,
"THO" => 0x15,
"TIC" => 0x16,
"TBX" => 0x17,
"TPO" => 0x18,
"TSP" => 0x19,
"OFF" => 0x1A,
"VMV" => 0x1B,
"XCM" => 0x1C,
"XCF" => 0x1D,
"XCW" => 0x1E,
"XCR" => 0x1F,
"XDT" => 0x20,
"XDF" => 0x21,
"XDW" => 0x22,
"XDR" => 0x23,
"XRS" => 0x24,
"XRD" => 0x25,
"XRM" => 0x26,
"XRF" => 0x27,
"XRW" => 0x28,
"XRZ" => 0x29,
"VCH" => 0x2A,
"VCD" => 0x2B,
"VRE" => 0x2C,
"VT1" => 0x2D,
"VT2" => 0x2E,
"VT3" => 0x2F,
"VT4" => 0x30,
"VT5" => 0x31,
"VT6" => 0x32,
"VT7" => 0x33,
"VT8" => 0x34,
"DJF" => 0x35,
"IVO" => 0x36,
"ICH" => 0x37,
"IDE" => 0x38,
"IRE" => 0x39,
"IV2" => 0x3A,
"IC2" => 0x3B,
"ID2" => 0x3C,
"IR2" => 0x3D,
"USB" => 0x3E,
"I00" => 0x80,
"I01" => 0x81,
"I02" => 0x82,
"I03" => 0x83,
"I04" => 0x84,
"I05" => 0x85,
"I06" => 0x86,
"I07" => 0x87,
"I08" => 0x88,
"I09" => 0x89,
"I0A" => 0x8A,
"I0B" => 0x8B,
"I0C" => 0x8C,
"I0D" => 0x8D,
"I0E" => 0x8E,
"I8F" => 0x8F,
"I90" => 0x90,
"I91" => 0x91,
"I92" => 0x92,
"I93" => 0x93,
"I94" => 0x94,
"I95" => 0x95,
"I96" => 0x96,
"I97" => 0x97,
"I98" => 0x98,
"I99" => 0x99,
"I9A" => 0x9A,
"I9B" => 0x9B,
"I9C" => 0x9C,
"I9D" => 0x9D,
"I9E" => 0x9E,
"I9F" => 0x9F,
"IA0" => 0xA0,
"IA1" => 0xA1,
"IA2" => 0xA2,
"IA3" => 0xA3,
"IA4" => 0xA4,
"IA5" => 0xA5,
"IA6" => 0xA6,
"IA7" => 0xA7,
_ => 255,
}
}
}