Skip to content

Commit

Permalink
Subtract 1 from data clocking lengths in mpsse macro
Browse files Browse the repository at this point in the history
  • Loading branch information
CirrusNeptune authored and newAM committed Jun 19, 2021
1 parent 8f39643 commit 3d4cfa3
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 36 deletions.
30 changes: 15 additions & 15 deletions src/mpsse.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1589,48 +1589,48 @@ macro_rules! mpsse {
mpsse!($passthru {$($tail)*} -> [$($out)* $crate::MpsseCmd::WaitOnIOLow as u8,]);
};
($passthru:tt {clock_data_out($mode:expr, [$($data:expr),* $(,)*]); $($tail:tt)*} -> [$($out:tt)*]) => {
mpsse!(@assert $passthru, mpsse!(@count_elements $($data,)*) as usize <= 65536_usize, "data length cannot exceed u16::MAX + 1");
mpsse!(@assert $passthru, (mpsse!(@count_elements $($data,)*) as usize > 0_usize && mpsse!(@count_elements $($data,)*) as usize <= 65536_usize), "data length must be in 1..=(u16::MAX + 1)");
mpsse!($passthru {$($tail)*} -> [$($out)* $mode as $crate::ClockDataOut as u8,
(mpsse!(@count_elements $($data,)*) & 0xFF_usize) as u8,
((mpsse!(@count_elements $($data,)*) >> 8) & 0xFF_usize) as u8,
((mpsse!(@count_elements $($data,)*) - 1) & 0xFF_usize) as u8,
(((mpsse!(@count_elements $($data,)*) - 1) >> 8) & 0xFF_usize) as u8,
$($data as u8,)*]);
};
(($passthru:tt, $read_len:tt) {clock_data_in($mode:expr, $len:expr); $($tail:tt)*} -> [$($out:tt)*]) => {
mpsse!(@assert ($passthru, $read_len), ($len) as usize <= 65536_usize, "data length cannot exceed u16::MAX + 1");
mpsse!(@assert ($passthru, $read_len), (($len) as usize > 0_usize && ($len) as usize <= 65536_usize), "data length must be in 1..=(u16::MAX + 1)");
mpsse!(($passthru, ($read_len + ($len))) {$($tail)*} -> [$($out)* $mode as $crate::ClockDataIn as u8,
(($len) & 0xFF_usize) as u8,
((($len) >> 8) & 0xFF_usize) as u8,]);
((($len) - 1) & 0xFF_usize) as u8,
(((($len) - 1) >> 8) & 0xFF_usize) as u8,]);
};
(($passthru:tt, $read_len:tt) {const $range_id:ident = clock_data_in($mode:expr, $len:expr); $($tail:tt)*} -> [$($out:tt)*]) => {
const $range_id: ::std::ops::Range<usize> = $read_len..$read_len + ($len);
mpsse!(($passthru, $read_len) {clock_data_in($mode, $len); $($tail)*} -> [$($out)*]);
};
(($passthru:tt, $read_len:tt) {clock_data($mode:expr, [$($data:expr),* $(,)*]); $($tail:tt)*} -> [$($out:tt)*]) => {
mpsse!(@assert ($passthru, $read_len), mpsse!(@count_elements $($data,)*) as usize <= 65536_usize, "data length cannot exceed u16::MAX + 1");
mpsse!(@assert ($passthru, $read_len), (mpsse!(@count_elements $($data,)*) as usize > 0_usize && mpsse!(@count_elements $($data,)*) as usize <= 65536_usize), "data length must be in 1..=(u16::MAX + 1)");
mpsse!(($passthru, ($read_len + mpsse!(@count_elements $($data,)*))) {$($tail)*} -> [$($out)* $mode as $crate::ClockData as u8,
(mpsse!(@count_elements $($data,)*) & 0xFF_usize) as u8,
((mpsse!(@count_elements $($data,)*) >> 8) & 0xFF_usize) as u8,
((mpsse!(@count_elements $($data,)*) - 1) & 0xFF_usize) as u8,
(((mpsse!(@count_elements $($data,)*) - 1) >> 8) & 0xFF_usize) as u8,
$($data as u8,)*]);
};
(($passthru:tt, $read_len:tt) {const $range_id:ident = clock_data($mode:expr, [$($data:expr),* $(,)*]); $($tail:tt)*} -> [$($out:tt)*]) => {
const $range_id: ::std::ops::Range<usize> = $read_len..$read_len + mpsse!(@count_elements $($data,)*);
mpsse!(($passthru, $read_len) {clock_data($mode, [$($data,)*]); $($tail)*} -> [$($out)*]);
};
($passthru:tt {clock_bits_out($mode:expr, $data:expr, $len:expr); $($tail:tt)*} -> [$($out:tt)*]) => {
mpsse!(@assert $passthru, $len as u8 <= 8_u8, "data length cannot exceed 8");
mpsse!($passthru {$($tail)*} -> [$($out)* $mode as $crate::ClockBitsOut as u8, $len as u8, $data as u8,]);
mpsse!(@assert $passthru, ($len as u8 > 0_u8 && $len as u8 <= 8_u8), "data length must be in 1..=8");
mpsse!($passthru {$($tail)*} -> [$($out)* $mode as $crate::ClockBitsOut as u8, (($len) - 1) as u8, $data as u8,]);
};
(($passthru:tt, $read_len:tt) {clock_bits_in($mode:expr, $len:expr); $($tail:tt)*} -> [$($out:tt)*]) => {
mpsse!(@assert ($passthru, $read_len), $len as u8 <= 8_u8, "data length cannot exceed 8");
mpsse!(($passthru, ($read_len + 1)) {$($tail)*} -> [$($out)* $mode as $crate::ClockBitsIn as u8, $len as u8,]);
mpsse!(@assert ($passthru, $read_len), ($len as u8 > 0_u8 && $len as u8 <= 8_u8), "data length must be in 1..=8");
mpsse!(($passthru, ($read_len + 1)) {$($tail)*} -> [$($out)* $mode as $crate::ClockBitsIn as u8, (($len) - 1) as u8,]);
};
(($passthru:tt, $read_len:tt) {const $idx_id:ident = clock_bits_in($mode:expr, $len:expr); $($tail:tt)*} -> [$($out:tt)*]) => {
const $idx_id: usize = $read_len;
mpsse!(($passthru, $read_len) {clock_bits_in($mode, $len); $($tail)*} -> [$($out)*]);
};
(($passthru:tt, $read_len:tt) {clock_bits($mode:expr, $data:expr, $len:expr); $($tail:tt)*} -> [$($out:tt)*]) => {
mpsse!(@assert ($passthru, $read_len), $len as u8 <= 8_u8, "data length cannot exceed 8");
mpsse!(($passthru, ($read_len + 1)) {$($tail)*} -> [$($out)* $mode as $crate::ClockBits as u8, $len as u8, $data as u8,]);
mpsse!(@assert ($passthru, $read_len), ($len as u8 > 0_u8 && $len as u8 <= 8_u8), "data length must be in 1..=8");
mpsse!(($passthru, ($read_len + 1)) {$($tail)*} -> [$($out)* $mode as $crate::ClockBits as u8, (($len) - 1) as u8, $data as u8,]);
};
(($passthru:tt, $read_len:tt) {const $idx_id:ident = clock_bits($mode:expr, $data:expr, $len:expr); $($tail:tt)*} -> [$($out:tt)*]) => {
const $idx_id: usize = $read_len;
Expand Down
82 changes: 61 additions & 21 deletions tests/mpsse-macro.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,29 +48,29 @@ fn all_commands() {
MpsseCmd::WaitOnIOHigh as u8,
MpsseCmd::WaitOnIOLow as u8,
ClockDataOut::MsbPos as u8,
4 as u8,
3 as u8,
0 as u8,
11 as u8,
22 as u8,
33 as u8,
44 as u8,
ClockDataIn::MsbPos as u8,
4 as u8,
3 as u8,
0 as u8,
ClockData::MsbPosIn as u8,
4 as u8,
3 as u8,
0 as u8,
12 as u8,
22 as u8,
32 as u8,
42 as u8,
ClockBitsOut::MsbPos as u8,
8 as u8,
7 as u8,
42 as u8,
ClockBitsIn::MsbPos as u8,
8 as u8,
7 as u8,
ClockBits::MsbPosIn as u8,
8 as u8,
7 as u8,
42 as u8,
]
);
Expand Down Expand Up @@ -126,29 +126,29 @@ fn all_commands_const() {
MpsseCmd::WaitOnIOHigh as u8,
MpsseCmd::WaitOnIOLow as u8,
ClockDataOut::MsbPos as u8,
4 as u8,
3 as u8,
0 as u8,
11 as u8,
22 as u8,
33 as u8,
44 as u8,
ClockDataIn::MsbPos as u8,
4 as u8,
3 as u8,
0 as u8,
ClockData::MsbPosIn as u8,
4 as u8,
3 as u8,
0 as u8,
12 as u8,
22 as u8,
32 as u8,
42 as u8,
ClockBitsOut::MsbPos as u8,
8 as u8,
7 as u8,
42 as u8,
ClockBitsIn::MsbPos as u8,
8 as u8,
7 as u8,
ClockBits::MsbPosIn as u8,
8 as u8,
7 as u8,
42 as u8,
]
);
Expand All @@ -162,8 +162,18 @@ fn all_commands_const() {
}

#[test]
#[should_panic(expected = "data length cannot exceed u16::MAX + 1")]
fn clock_data_assert() {
#[should_panic(expected = "data length must be in 1..=(u16::MAX + 1)")]
fn clock_data_assert_lower() {
mpsse! {
let (_data, DATA_READ_LEN) = {
clock_data_in(ClockDataIn::MsbPos, 0);
};
}
}

#[test]
#[should_panic(expected = "data length must be in 1..=(u16::MAX + 1)")]
fn clock_data_assert_upper() {
mpsse! {
let (_data, DATA_READ_LEN) = {
clock_data_in(ClockDataIn::MsbPos, (u16::MAX as usize) + 2);
Expand All @@ -172,8 +182,18 @@ fn clock_data_assert() {
}

#[test]
#[should_panic(expected = "data length cannot exceed 8")]
fn clock_bits_out_assert() {
#[should_panic(expected = "data length must be in 1..=8")]
fn clock_bits_out_assert_lower() {
mpsse! {
let (_data, DATA_READ_LEN) = {
clock_bits_out(ClockBitsOut::MsbPos, 42, 0);
};
}
}

#[test]
#[should_panic(expected = "data length must be in 1..=8")]
fn clock_bits_out_assert_upper() {
mpsse! {
let (_data, DATA_READ_LEN) = {
clock_bits_out(ClockBitsOut::MsbPos, 42, 9);
Expand All @@ -182,8 +202,18 @@ fn clock_bits_out_assert() {
}

#[test]
#[should_panic(expected = "data length cannot exceed 8")]
fn clock_bits_in_assert() {
#[should_panic(expected = "data length must be in 1..=8")]
fn clock_bits_in_assert_lower() {
mpsse! {
let (_data, DATA_READ_LEN) = {
clock_bits_in(ClockBitsIn::MsbPos, 0);
};
}
}

#[test]
#[should_panic(expected = "data length must be in 1..=8")]
fn clock_bits_in_assert_upper() {
mpsse! {
let (_data, DATA_READ_LEN) = {
clock_bits_in(ClockBitsIn::MsbPos, 9);
Expand All @@ -192,8 +222,18 @@ fn clock_bits_in_assert() {
}

#[test]
#[should_panic(expected = "data length cannot exceed 8")]
fn clock_bits_assert() {
#[should_panic(expected = "data length must be in 1..=8")]
fn clock_bits_assert_lower() {
mpsse! {
let (_data, DATA_READ_LEN) = {
clock_bits(ClockBits::MsbPosIn, 42, 0);
};
}
}

#[test]
#[should_panic(expected = "data length must be in 1..=8")]
fn clock_bits_assert_upper() {
mpsse! {
let (_data, DATA_READ_LEN) = {
clock_bits(ClockBits::MsbPosIn, 42, 9);
Expand Down Expand Up @@ -252,7 +292,7 @@ fn user_abstracted_macro() {
0x0,
0xb,
ClockData::MsbPosIn as u8,
4 as u8,
3 as u8,
0 as u8,
0x42 as u8,
11 as u8,
Expand Down

0 comments on commit 3d4cfa3

Please sign in to comment.