autd3_driver/firmware/cpu/
mod.rs1mod 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}