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.

WritePatternCompressed

WritePatternCompressed is the compressed version of WritePatternBuffer. It is a low-level command that writes multiple Patterns into a single frame by sending only the phase information. The intensity is a single intensity value shared by every transducer and every Pattern.

WritePatternCompressed {
bank,
index,
format,
intensity,
patterns,
};
Field Type Description
bank PatternBank Destination bank
index usize Start index for writing within the bank
format PatternCompression Compression format (see below)
intensity Intensity Intensity shared by every transducer and Pattern
patterns [Option<&[Vec<Phase>]>; 4] Sequence of phases to write
Variant Patterns per frame Description
PhaseFull 2 Sends the phase at full resolution (8 bit)
PhaseHalf 4 Sends the phase at half resolution (4 bit)

An example of compressing 4 Patterns into a single command with PhaseHalf and playing them as STM with ConfigPattern + ChangePatternBank.

use autd3_rs::commands::{
ChangePatternBank, ConfigPattern, PatternCompression, StmConfig, WritePatternCompressed,
};
use autd3_rs::geometry::{Autd3, Geometry, offset};
use autd3_rs::units::{Hz, m, mm, s};
use autd3_rs::value::{Intensity, LoopBehavior, PatternBank, 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 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;
let mut builder = client.datagram_builder();
builder.push(WritePatternCompressed {
bank,
index: 0,
format: PatternCompression::PhaseHalf,
intensity: Intensity::MAX,
patterns: [
Some(&patterns[0][..]),
Some(&patterns[1][..]),
Some(&patterns[2][..]),
Some(&patterns[3][..]),
],
});
builder.push(ConfigPattern {
bank,
config: StmConfig::new(1.0 * Hz).into_sampling_config(patterns.len()),
size: patterns.len(),
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?;