コンテンツにスキップ

ChangeModulationBank

ChangeModulationBank は, 再生対象の Modulation バンクを切り替える低レベルコマンド.

ChangeModulationBank {
bank,
transition_mode,
};
フィールド 説明
bank ModulationBank 切り替え先バンク
transition_mode TransitionMode 切り替え時の挙動
Immediate 即時
SyncIdx 次に再生インデックスが0になった時
SysTime(DcSysTime, margin) 指定した DC システム時刻 (margin は後述. 省略可)
Gpio(GpioIn) 指定 GPIO 入力ピンのトリガ
Ext 拡張モード (バンク内の再生が終わると次のバンクに自動で切り替え)
Later 遷移しない (バンクへの書き込みだけを行う)

SysTime は指定時刻が近すぎると FPGA が遷移を取りこぼす可能性がある, 「現在時刻 + マージン」より前の指定を MISS_TRANSITION_TIME エラーで拒否する. マージンはデフォルトで 10 ms である.

Later は「バンクへ書き込むだけで遷移しない」ことを表す. Modulation / FociStm / PatternStmtransition_mode に指定すると, 末尾のバンク切り替えを送らず書き込みと設定だけを行う. 遷移コマンドである ChangeModulationBank / ChangePatternBank 自身に指定した場合はビルド時エラーになる. また Later は遷移しないため, LoopBehavior との組み合わせ制約の対象外である.

Gpio(GpioIn) の詳細は GPIO ピン を参照.

同一バンクへの切り替えでは, TransitionModeLoopBehavior の設定は機能しない. バンク運用の詳細は バンクの切り替え チュートリアル を参照.

ChangeModulationBankWriteModulationBuffer + ConfigModulation でバンクを準備した後に送り, 再生対象を切り替える.

use autd3_rs::commands::{ChangeModulationBank, ConfigModulation, WriteModulationBuffer};
use autd3_rs::geometry::{Autd3, Geometry};
use autd3_rs::units::Hz;
use autd3_rs::value::{LoopBehavior, ModulationBank, SamplingConfig, TransitionMode};
use autd3_rs::{Client, ClientConfig};
use autd3_rs_link_nop::Nop;
use autd3_rs_modulation::{SineOption, modulation_buffer, sine};
let geometry = Geometry::new(vec![Autd3::default()]);
let client = Client::open(&geometry, Nop, ClientConfig::default()).await?;
let mut data = modulation_buffer();
sine(150 * Hz, &SineOption::default(), &mut data)?;
let bank = ModulationBank::B0;
let mut builder = client.datagram_builder();
builder.push(WriteModulationBuffer {
bank,
offset: 0,
data: &data,
});
builder.push(ConfigModulation {
bank,
config: SamplingConfig::FREQ_4K,
size: data.len(),
loop_behavior: LoopBehavior::Infinite,
});
builder.push(ChangeModulationBank {
bank,
transition_mode: TransitionMode::Immediate,
});
let frames = builder.build()?;
for frame in &frames {
client.send_checked(frame).await?;
}
client.close().await?;