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 mut dst = vec![false; self.mem.num_transducers];
17        self.output_mask_inplace(segment, &mut dst);
18        dst
19    }
20
21    pub fn output_mask_inplace(&self, segment: Segment, dst: &mut [bool]) {
22        (0..self.mem.num_transducers)
23            .for_each(|i| dst[i] = self._output_mask(i | (segment as usize) << 8));
24    }
25}
26
27#[cfg(test)]
28mod tests {
29    use super::*;
30
31    #[test]
32    fn output_mask() {
33        let fpga = FPGAEmulator::new(249);
34        fpga.mem.output_mask_bram.write(0, 0b1111_1111_1111_0000);
35        fpga.mem.output_mask_bram.write(31, 0b1111_1110_0001_1111);
36        assert_eq!(
37            [vec![false; 4], vec![true; 245]].concat(),
38            fpga.output_mask(Segment::S0)
39        );
40        assert_eq!(
41            [vec![true; 245], vec![false; 4],].concat(),
42            fpga.output_mask(Segment::S1)
43        );
44    }
45}