autd3_driver/firmware/cpu/
mod.rs

1mod gain_stm_mode;
2
3pub use autd3_core::link::{Header, RxMessage, TxMessage};
4pub use gain_stm_mode::*;
5
6use crate::error::AUTDDriverError;
7
8pub(crate) const MSG_ID_MAX: u8 = 0x7F;
9
10#[doc(hidden)]
11pub fn check_firmware_err(msg: &RxMessage) -> Result<(), AUTDDriverError> {
12    if msg.ack() & 0x80 != 0 {
13        return Err(AUTDDriverError::firmware_err(msg.ack()));
14    }
15    Ok(())
16}
17
18#[doc(hidden)]
19pub fn check_if_msg_is_processed<'a>(
20    tx: &'a [TxMessage],
21    rx: &'a [RxMessage],
22) -> impl Iterator<Item = bool> + 'a {
23    tx.iter()
24        .zip(rx.iter())
25        .map(|(tx, r)| tx.header.msg_id == r.ack())
26}
27
28#[cfg(test)]
29mod tests {
30    use itertools::Itertools;
31    use zerocopy::FromZeros;
32
33    use super::*;
34
35    #[rstest::fixture]
36    fn tx() -> Vec<TxMessage> {
37        let mut tx = vec![TxMessage::new_zeroed(); 3];
38        tx[0].header.msg_id = 0;
39        tx[1].header.msg_id = 1;
40        tx[2].header.msg_id = 2;
41        tx
42    }
43
44    #[rstest::rstest]
45    #[test]
46    #[case::success(vec![
47        RxMessage::new(0,0),
48        RxMessage::new(0,1),
49        RxMessage::new(0,2),
50    ], vec![true, true, true])]
51    #[case::success(vec![
52        RxMessage::new(0, 1),
53        RxMessage::new(0, 1),
54        RxMessage::new(0, 1),
55    ], vec![false, true, false])]
56    fn test_check_if_msg_is_processed(
57        #[case] rx: Vec<RxMessage>,
58        #[case] expect: Vec<bool>,
59        tx: Vec<TxMessage>,
60    ) {
61        assert_eq!(expect, check_if_msg_is_processed(&tx, &rx).collect_vec());
62    }
63}