autd3_firmware_emulator/fpga/emulator/
output_mask.rs1use 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}