Skip to content
This is the development version of the documentation. It may change before the next release. See 0.9.x for the latest release.

WritePatternBuffer

WritePatternBuffer is a low-level command that writes a Pattern (the phase and intensity of each transducer) to the specified bank and index. On the wire the phases are sent first, followed by the intensities, and the device CPU interleaves them per transducer when writing the FPGA memory.

WritePatternBuffer::new(bank, index, phases, intensities);
Field Type Description
bank PatternBank Destination bank
index u16 Destination index for writing within the bank
phases &[Vec<Phase>] Per-device phases
intensities PatternIntensity Intensity (a uniform Intensity, or a per-device &[Vec<Intensity>] buffer)

Multiple low-level commands are sent together in a single datagram. The following is an example of playing a single Pattern via WritePatternBuffer → ConfigPattern → ChangePatternBank (equivalent to the high-level Pattern).

use core::num::NonZeroU16;
use autd3_rs::commands::{ChangePatternBank, ConfigPattern, WritePatternBuffer};
use autd3_rs::geometry::{Autd3, Geometry, offset};
use autd3_rs::units::{m, mm, s};
use autd3_rs::value::{Intensity, LoopBehavior, PatternBank, SamplingConfig, TransitionMode};
use autd3_rs::{Client, ClientConfig};
use autd3_rs_link_nop::Nop;
use autd3_rs_pattern::{focus, wavelength};
let geometry = Geometry::new(vec![Autd3::default()]);
let client = Client::open(&geometry, Nop, ClientConfig::default()).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,
);
let bank = PatternBank::B0;
let mut builder = client.datagram_builder();
builder.push(WritePatternBuffer::new(bank, 0, &phases, Intensity::MAX));
builder.push(ConfigPattern {
bank,
config: SamplingConfig::new(NonZeroU16::MAX),
size: 1,
loop_behavior: LoopBehavior::Infinite,
});
builder.push(ChangePatternBank {
bank,
transition_mode: TransitionMode::Immediate,
});
let frames = builder.build()?;
for frame in &frames {
client.send_checked(frame).await?;
}
client.close().await?;