Skip to content
This is the development version of the documentation. It may change before the next release. See 0.6.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 fixed at the maximum (255).

WritePatternCompressed {
bank,
index,
format,
patterns,
};
Field Type Description
bank PatternBank Destination bank
index usize Start index for writing within the bank
format PatternCompression Compression format (see below)
patterns [Option<&[Vec<Emission>]>; 4] Sequence of Patterns 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::{LoopBehavior, PatternBank, TransitionMode};
use autd3_rs::{Client, ClientConfig};
use autd3_rs_link_nop::Nop;
use autd3_rs_pattern::{FocusOption, 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.pattern_buffer();
focus(
&geometry,
geometry.center() + offset(x * mm, 0.0 * mm, 150.0 * mm),
wavelength,
&FocusOption::default(),
&mut buffer,
);
buffer
})
.collect::<Vec<_>>();
let bank = PatternBank::B0;
let mut builder = client.datagram_builder();
builder.push(WritePatternCompressed {
bank,
index: 0,
format: PatternCompression::PhaseHalf,
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?;