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 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}