Skip to content

Pattern

Pattern is a command that sends the phase and intensity of each transducer to the device. The phases and intensities are passed as separate buffers.

Pattern::new(&phases, intensities);
Pattern::with_bank(bank, &phases, intensities);
Pattern {
bank,
phases: &phases,
intensities: intensities.into(),
transition_mode,
};

Pattern::new sets the destination bank to PatternBank::B0. To write to another bank, use Pattern::with_bank(bank, phases, intensities).

Field Type Default Description
bank PatternBank PatternBank::B0 Bank to write to / play back
phases &[Vec<Phase>] — Phases per device
intensities PatternIntensity — Intensity (a uniform Intensity, or a per-device &[Vec<Intensity>] buffer)
transition_mode TransitionMode TransitionMode::Immediate Behavior when switching the bank

Several helper functions are provided for computing patterns.

Pattern is equivalent to the three commands WritePatternBuffer + ConfigPattern + ActivatePatternBank. However, Pattern itself is sent as a single frame that fuses the three. The following is equivalent to Pattern { bank, phases, intensities }.

To write a bank without switching to it (and send ActivatePatternBank later), send WritePatternBuffer + ConfigPattern directly instead of Pattern.

WritePatternBuffer::new(bank, 0, patterns, intensities);
ConfigPattern {
bank,
config: SamplingConfig::new(NonZeroU16::MAX),
size: 1,
loop_behavior: LoopBehavior::Infinite,
};
ActivatePatternBank {
bank,
transition_mode,
};
use autd3_rs::commands::{Clear, Pattern, Synchronize};
use autd3_rs::geometry::{Autd3, Geometry, offset};
use autd3_rs::units::{m, mm, s};
use autd3_rs::value::Intensity;
use autd3_rs::Client;
use autd3_rs::udp::TransportOption;
use autd3_rs_pattern::{focus, wavelength};
let geometry = Geometry::new(vec![Autd3::default()]);
let option = TransportOption::default();
let mut client = Client::open(&geometry, &option).await?;
client.send(Clear).await?;
client.send(Synchronize).await?;
let mut phases = geometry.phase_buffer();
focus(
&geometry,
geometry.center() + offset(0.0 * mm, 0.0 * mm, 150.0 * mm),
wavelength(340.0 * m / s),
&mut phases,
);
client.send(Pattern::new(&phases, Intensity::MAX)).await?;