これは開発版のドキュメントである. 内容は次のリリースまでに変更される可能性がある. 最新のリリース版は 0.6.x を参照.
ChangePatternBank
ChangePatternBank は, 再生対象の Pattern バンクを切り替える低レベルコマンド.
ChangePatternBank { bank, transition_mode,};ChangePatternBank( bank=bank, transition_mode=transition_mode,)new ChangePatternBank( bank: bank, transitionMode: transitionMode);| フィールド | 型 | 説明 |
|---|---|---|
bank |
PatternBank |
切り替え先バンク |
transition_mode |
TransitionMode |
切り替え時の挙動 |
TransitionMode
Section titled “TransitionMode”Immediate |
即時 |
SyncIdx |
次に再生インデックスが0になった時 |
SysTime(DcSysTime, margin) |
指定した DC システム時刻 (margin は後述. 省略可) |
Gpio(GpioIn) |
指定 GPIO 入力ピンのトリガ |
Ext |
拡張モード (バンク内の再生が終わると次のバンクに自動で切り替え) |
Later |
遷移しない (バンクへの書き込みだけを行う) |
SysTime は指定時刻が近すぎると FPGA が遷移を取りこぼす可能性があるため, 「現在時刻 + マージン」より前の指定を MISS_TRANSITION_TIME エラーで拒否する.
マージンはデフォルトで 10 ms である.
Later は「バンクへ書き込むだけで遷移しない」ことを表す.
Modulation / FociStm / PatternStm の transition_mode に指定すると, 末尾のバンク切り替えを送らず書き込みと設定だけを行う.
遷移コマンドである ChangeModulationBank / ChangePatternBank 自身に指定した場合はビルド時エラーになる.
また Later は遷移しないため, LoopBehavior との組み合わせ制約の対象外である.
Gpio(GpioIn) の詳細は GPIO ピン を参照.
同一バンクへの切り替えでは, TransitionMode や LoopBehavior の設定は機能しない.
バンク運用の詳細は バンクの切り替え チュートリアル を参照.
Example
Section titled “Example”ChangePatternBank は WritePatternBuffer + ConfigPattern でバンクを準備した後に送り, 再生対象を切り替える.
use core::num::NonZeroU16;
use autd3_rs::commands::{ChangePatternBank, ConfigPattern, WritePatternBuffer};use autd3_rs::geometry::{Autd3, Geometry, offset};use autd3_rs::units::{m, mm, s};use autd3_rs::value::{LoopBehavior, PatternBank, SamplingConfig, TransitionMode};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 bank = PatternBank::B0;
let mut builder = client.datagram_builder();builder.push(WritePatternBuffer { bank, index: 0, emissions: &emissions,});builder.push(ConfigPattern { bank, config: SamplingConfig::new(NonZeroU16::MAX), size: 1, loop_behavior: LoopBehavior::Infinite,});builder.push(ChangePatternBank { bank, transition_mode: TransitionMode::Immediate,});let frames = builder.build()?;for frame in &frames { client.send_checked(frame).await?;}
client.close().await?;import asyncio
import numpy as np
from autd3 import Client, ClientConfigfrom autd3.commands import ChangePatternBank, ConfigPattern, WritePatternBufferfrom autd3.geometry import Autd3, Geometryfrom autd3.units import m, sfrom autd3.value import LoopBehavior, PatternBank, SamplingConfig, TransitionModefrom autd3_link_nop import Nopfrom autd3_pattern import FocusOption, focus, wavelength
async def main() -> None: geometry = Geometry([Autd3([0.0, 0.0, 0.0], [1.0, 0.0, 0.0, 0.0])]) client = await Client.open(geometry, Nop(), ClientConfig())
emissions = geometry.pattern_buffer() focus( geometry, geometry.center() + np.array([0.0, 0.0, 150.0]), wavelength(340 * m / s), FocusOption(), emissions, )
bank = PatternBank.B0
builder = client.datagram_builder() builder.push( WritePatternBuffer( bank=bank, index=0, emissions=emissions, ) ) builder.push( ConfigPattern( bank=bank, config=SamplingConfig(0xFFFF), size=1, loop_behavior=LoopBehavior.Infinite, ) ) builder.push( ChangePatternBank( bank=bank, transition_mode=TransitionMode.Immediate, ) ) frames = builder.build() for frame in frames: await client.send_checked(frame)
await client.close()
asyncio.run(main())using System.Numerics;using System.Threading.Tasks;using AUTD3;using AUTD3.Link;using Nop = AUTD3.Link.Nop;using static AUTD3.Units;
var geometry = new Geometry(new[] { new Autd3(Vector3.Zero) });var client = await Client.OpenAsync(geometry, new Nop(), new ClientConfig());
var emissions = geometry.PatternBuffer();Pattern.Focus( geometry, geometry.Center + new Vector3(0.0f, 0.0f, 150.0f), Pattern.Wavelength(340.0f * m / s), new FocusOption(), emissions);
var bank = PatternBank.B0;
var builder = client.DatagramBuilder();builder.Push(new WritePatternBuffer( bank: bank, index: 0, emissions: emissions));builder.Push(new ConfigPattern( bank: bank, config: new SamplingConfig(ushort.MaxValue), size: 1, loopBehavior: LoopBehavior.Infinite));builder.Push(new ChangePatternBank( bank: bank, transitionMode: TransitionMode.Immediate));var frames = builder.Build();foreach (var frame in frames){ await client.SendCheckedAsync(frame);}
await client.CloseAsync();