コンテンツにスキップ

旧ファームウェア

この SDK は旧 autd3 SDK とは非互換であり, 通信プロトコルも新規に設計されている. そのため, 通常の Client は旧世代ファームウェアを積んだデバイスを駆動できない.

LegacyClient は, 旧世代ファームウェア v12.1.0 の実機を駆動するための互換クライアントである.

Rust では, autd3-rs の feature legacy で有効になる (既定では無効).

autd3-rs = { version = "0.4", features = ["legacy"] }

Python と C# のバインディングは追加の設定は不要である. それぞれ autd3.LegacyClient, AUTD3.Legacy 名前空間として利用できる.

ユーザーコードの形は現行 SDK と同じである. ClientLegacyClient に, ClientConfigLegacyClientConfig に置き換えるだけでよい. Link はすべて現行のものをそのまま使える.

let client = LegacyClient::open(
&geometry,
EchocatLinkOption::default(),
LegacyClientConfig::default(),
)
.await?;

LegacyClientConfig が持つのは timeout_cycles (既定 2000) と RT スレッドのチューニング (rt_priority / rt_policy / rt_affinity) のみ. 後者は現行 ClientConfig と同じ型・同じ既定値である (Windows は TimeCritical, それ以外は無指定).

ファームウェアバージョンの読み出しも現行と同じ.

for (i, version) in client.read_firmware_version().await?.iter().enumerate() {
println!("device[{i}] firmware version: {version}");
}

コマンドの組み立ても同じである (型が DatagramBuilder ではなく LegacyDatagramBuilder になる). Emission パターンAM 波形の計算ヘルパも共通である.

let mut builder = client.datagram_builder();
builder
.push(SetSilencer::default())
.push(Pattern::new(&emissions))
.push(Modulation::new(SamplingConfig::FREQ_4K, &modulation));
let frames = builder.build()?;
for frame in &frames {
client.send_checked(frame).await?;
}

デバイス毎にコマンドを割り当てる push_each も同じように使える.

終了処理も同様である.

client.stop().await?;
client.close().await?;
項目 Client LegacyClient
送信モデル パイプライン / stop-and-wait stop-and-wait のみ
エラー詳細の読み出し read_error_detail() 非対応 (エラーは ack のコードのみ)
Telemetry カウンタの読み出し read_telemetry() 非対応

旧ファームウェアでは, 現行のパイプライン送信は使えない. したがってスループットは現行より大きく劣る.

以下のコマンドが使える.

以下は使用不可.

ChangePatternBank の代わりに, レガシー固有の LegacyChangePatternBank を使う. 切り替え先の内容に応じて pattern / foci_stm / pattern_stm を選ぶ.

let mut builder = client.datagram_builder();
builder.push(Pattern::with_bank(PatternBank::B1, &emissions));
for frame in &builder.build()? {
client.send_checked(frame).await?;
}
let mut builder = client.datagram_builder();
builder.push(LegacyChangePatternBank::pattern(PatternBank::B0));
for frame in &builder.build()? {
client.send_checked(frame).await?;
}