コンテンツにスキップ

WriteFociBuffer

WriteFociBuffer は, Foci STM 用の焦点列をバンクへ書き込む低レベルコマンド.

WriteFociBuffer {
bank,
start_index,
points,
};
フィールド 型 説明
bank PatternBank 書き込み先バンク
start_index usize バンク内の書き込み開始インデックス
points &[ControlPoints] 焦点サンプルの列

ControlPoints は焦点 (ControlPoint) の列と振幅を持つ 1 サンプル. 焦点数は全サンプルで揃える. 詳細は FociStm を参照.

WriteFociBuffer は1 フレームに収まる分しか書けない. 上限 (ControlPoints の数) は焦点数で変わり, WriteFociBuffer::max_len(num_foci)で, 超えると送信時にエラーになる.

WriteFociBuffer → ConfigFociStm → ActivatePatternBank で焦点列を Foci STM として再生する例 (高レベルの FociStm と等価). 200 点は 1 フレームに収まらないので分割して書き込む.

use std::f32::consts::PI;
use autd3_rs::commands::{
ActivatePatternBank, Clear, ConfigFociStm, Synchronize, WriteFociBuffer,
};
use autd3_rs::geometry::{Autd3, Geometry, offset};
use autd3_rs::units::{Hz, m, mm, s};
use autd3_rs::value::{ControlPoints, LoopBehavior, PatternBank, SamplingConfig, TransitionMode};
use autd3_rs::Client;
use autd3_rs::udp::TransportOption;
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 center = geometry.center() + offset(0.0 * mm, 0.0 * mm, 150.0 * mm);
let points: Vec<ControlPoints> = (0..200)
.map(|i| {
let theta = 2.0 * PI * i as f32 / 200.0;
ControlPoints::from(center + offset(30.0 * mm * theta.cos(), 30.0 * mm * theta.sin(), 0.0 * mm))
})
.collect();
let bank = PatternBank::B0;
let max_len = WriteFociBuffer::max_len(1);
for (i, chunk) in points.chunks(max_len).enumerate() {
client.send(WriteFociBuffer {
bank,
start_index: i * max_len,
points: chunk,
}).await?;
}
client.send(ConfigFociStm {
bank,
config: SamplingConfig::from_freq(1.0 * Hz * points.len() as f32)?,
size: points.len(),
num_foci: 1,
sound_speed: 340.0 * m / s,
loop_behavior: LoopBehavior::Infinite,
}).await?;
client.send(ActivatePatternBank {
bank,
transition_mode: TransitionMode::Immediate,
}).await?;