コンテンツにスキップ

Pattern

Pattern は, 各振動子の Emission をデバイスへ送るコマンド.

Pattern::new(&emissions);
Pattern::with_bank(bank, &emissions);
Pattern {
bank,
emissions: &emissions,
transition_mode,
};

Pattern::new は書き込み先バンクを PatternBank::B0 とする. 別バンクへ書く場合は Pattern::with_bank(bank, emissions) を使う.

フィールド デフォルト 説明
bank PatternBank PatternBank::B0 書き込み先・再生対象のバンク
emissions &[Vec<Emission>] デバイスごとの emission パターン
transition_mode TransitionMode TransitionMode::Immediate バンク切替時の遷移挙動

patternの計算には幾つかのヘルパ関数が用意されている.

PatternWritePatternBuffer + ConfigPattern + ChangePatternBank の 3 つと等価であり, これらは 1 フレームに融合して送られる. 以下は Pattern { bank, emissions } と等価な組み合わせである.

transition_modeTransitionMode::Later を指定した場合は融合せず, WritePatternBuffer + ConfigPattern の 2 フレームに分解して送る (ChangePatternBank を送らない). 詳細は ChangePatternBankTransitionMode を参照.

WritePatternBuffer {
bank,
index: 0,
emissions,
};
ConfigPattern {
bank,
config: SamplingConfig::new(NonZeroU16::MAX),
size: 1,
loop_behavior: LoopBehavior::Infinite,
};
ChangePatternBank {
bank,
transition_mode,
};
use autd3_rs::commands::Pattern;
use autd3_rs::geometry::{Autd3, Geometry, offset};
use autd3_rs::units::{m, mm, s};
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 mut emissions = geometry.pattern_buffer();
focus(
&geometry,
geometry.center() + offset(0.0 * mm, 0.0 * mm, 150.0 * mm),
wavelength(340.0 * m / s),
&FocusOption::default(),
&mut emissions,
);
let mut builder = client.datagram_builder();
builder.push(Pattern::new(&emissions));
let frames = builder.build()?;
for frame in &frames {
client.send_checked(frame).await?;
}
client.close().await?;