Skip to content

WritePatternPhase

WritePatternPhase is a lightweight version of WritePatternBuffer for Patterns whose intensity is shared by every transducer and every Pattern.

WritePatternPhase {
bank,
start_index,
depth,
intensity,
patterns,
};
Field Type Description
bank PatternBank Destination bank
start_index usize Start index for writing within the bank
depth PhaseDepth Bit depth of the phase (see below)
intensity Intensity Intensity shared by every transducer and Pattern
patterns &[Vec<Vec<Phase>>] Sequence of phases to write (1 to depth.max_count() items)
Variant Patterns per frame (max_count()) Description
Bits8 5 Sends the phase at full resolution (8 bit) (default)
Bits4 11 Sends the phase quantized to its upper 4 bits

An example of writing 4 Patterns in a single command with Bits4 and playing them as STM with ConfigPattern + ActivatePatternBank.

use autd3_rs::commands::{
ActivatePatternBank, Clear, ConfigPattern, PhaseDepth, Synchronize, WritePatternPhase,
};
use autd3_rs::geometry::{Autd3, Geometry, offset};
use autd3_rs::units::{Hz, m, mm, s};
use autd3_rs::value::{Intensity, LoopBehavior, PatternBank, SamplingConfig, TransitionMode};
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 wavelength = wavelength(340.0 * m / s);
let patterns = [-30.0f32, -10.0, 10.0, 30.0]
.iter()
.map(|&x| {
let mut buffer = geometry.phase_buffer();
focus(
&geometry,
geometry.center() + offset(x * mm, 0.0 * mm, 150.0 * mm),
wavelength,
&mut buffer,
);
buffer
})
.collect::<Vec<_>>();
let bank = PatternBank::B0;
client.send(WritePatternPhase {
bank,
start_index: 0,
depth: PhaseDepth::Bits4,
intensity: Intensity::MAX,
patterns: &patterns,
}).await?;
client.send(ConfigPattern {
bank,
config: SamplingConfig::from_freq(1.0 * Hz * patterns.len() as f32)?,
size: patterns.len(),
loop_behavior: LoopBehavior::Infinite,
}).await?;
client.send(ActivatePatternBank {
bank,
transition_mode: TransitionMode::Immediate,
}).await?;