コンテンツにスキップ

WritePatternBuffer

WritePatternBuffer は, 指定したバンクの start_index から連続するインデックスへ Pattern (各振動子の位相と振幅) を書き込む低レベルコマンド. 1 フレームに書ける Pattern は WritePatternBuffer::MAX_LEN (2). それより多く書くときは分けて送る.

WritePatternBuffer::new(bank, start_index, patterns, intensities);
フィールド 型 説明
bank PatternBank 書き込み先バンク
start_index usize バンク内の書き込み先の先頭インデックス
patterns &[Vec<Vec<Phase>>] インデックスごとの, デバイスごとの位相
intensities StmIntensity 振幅 (PatternStm と同じ.)

以下は WritePatternBuffer → ConfigPattern → ActivatePatternBank で 1 つの Pattern を再生する例 (高レベルの Pattern と等価).

use core::num::NonZeroU16;
use autd3_rs::commands::{
ActivatePatternBank, Clear, ConfigPattern, Synchronize, 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;
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 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;
client
.send(WritePatternBuffer::new(bank, 0, &[phases], Intensity::MAX))
.await?;
client.send(ConfigPattern {
bank,
config: SamplingConfig::new(NonZeroU16::MAX),
size: 1,
loop_behavior: LoopBehavior::Infinite,
}).await?;
client.send(ActivatePatternBank {
bank,
transition_mode: TransitionMode::Immediate,
}).await?;