コンテンツにスキップ

ループと遷移

FociStm / PatternStm は, デフォルトでは同じパターン列を無限に繰り返し再生する. 再生回数を有限にする場合は以下の通り.

再生回数は FociStmOption などの loop_behavior で指定する. LoopBehavior::Infinite (デフォルト) は無限ループ, LoopBehavior::Finite(n)n 回 (最大65535回) 再生して停止する. なお, 停止時は最後のパターンが出力され続ける.

重要な点として, 有限ループは現在と異なるバンクへ切り替えたときに初めて機能する.

// Play the circular motion only 3 times, then stop.
// A finite loop (and non-immediate transition) only fires when switching to a
// different bank, so write to bank B1 instead of the current B0.
let mut builder = client.datagram_builder();
builder.push(FociStm::new(
50.0 * Hz,
&foci,
FociStmOption {
loop_behavior: LoopBehavior::Finite(NonZeroU16::new(3).unwrap()),
bank: PatternBank::B1,
transition_mode: TransitionMode::SyncIdx,
..Default::default()
},
));
for frame in &builder.build()? {
client.send_checked(frame).await?;
}

再生対象のバンクへ切り替えるタイミングは transition_mode で指定する. 使用できるモードは, 遷移先バンクのループ設定 (loop_behavior) によって制限される.

遷移先が無限ループのとき使用できるモード.

  • Immediate (デフォルト): 書き込み後, 直ちにバンクを切り替える.
  • Ext: 拡張モード. バンク内の再生が終わると次のバンクへ自動で切り替わる.

遷移先が有限ループのとき使用できるモード.

  • SyncIdx: 切り替え対象バンクの再生インデックスが 0 に戻ったタイミングで切り替える.
  • SysTime(DcSysTime): 指定した DC システム時刻に切り替える.
  • Gpio(GpioIn): 指定した GPIO 入力ピンのトリガで切り替える.

ループ設定と同様, 遷移タイミングもバンクを切り替えたときにのみ作用する.

あらかじめ別バンクへ次の出力を仕込んでおき, 任意のタイミングで切り替える, などの細かい制御を行う場合は, API リファレンスの 低レベルコマンド を参照されたい.