autd3_firmware_emulator/fpga/emulator/
output_mask.rs

1use autd3_core::firmware::Segment;
2
3use super::FPGAEmulator;
4
5impl FPGAEmulator {
6    #[must_use]
7    fn _output_mask(&self, idx: usize) -> bool {
8        let chunk = idx >> 4;
9        let idx = idx & 0x0F;
10        let p = &self.mem.output_mask_bram.read(chunk);
11        *p & (1 << idx) != 0
12    }
13
14    #[must_use]
15    pub fn output_mask(&self, segment: Segment) -> Vec<bool> {
16        let len = self.mem.num_transducers;
17        let mut buffer = Vec::with_capacity(len);
18        unsafe {
19            self.output_mask_inplace(segment, buffer.as_mut_ptr());
20            buffer.set_len(len);
21        }
22        buffer
23    }
24
25    pub unsafe fn output_mask_inplace(&self, segment: Segment, dst: *mut bool) {
26        (0..self.mem.num_transducers).for_each(|i| {
27            unsafe {
28                dst.add(i)
29                    .write(self._output_mask(i | (segment as usize) << 8))
30            };
31        });
32    }
33}
34
35#[cfg(test)]
36mod tests {
37    use super::*;
38
39    #[test]
40    fn output_mask() {
41        let fpga = FPGAEmulator::new(249);
42        fpga.mem.output_mask_bram.write(0, 0b1111_1111_1111_0000);
43        fpga.mem.output_mask_bram.write(31, 0b1111_1110_0001_1111);
44        assert_eq!(
45            [vec![false; 4], vec![true; 245]].concat(),
46            fpga.output_mask(Segment::S0)
47        );
48        assert_eq!(
49            [vec![true; 245], vec![false; 4],].concat(),
50            fpga.output_mask(Segment::S1)
51        );
52    }
53}