旧ファームウェア
この 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 と同じである.
Client を LegacyClient に, ClientConfig を LegacyClientConfig に置き換えるだけでよい.
Link はすべて現行のものをそのまま使える.
let client = LegacyClient::open( &geometry, EchocatLinkOption::default(), LegacyClientConfig::default(),).await?;client = await LegacyClient.open( geometry, echocat.EchocatLinkOption(), LegacyClientConfig(),)using var client = await LegacyClient.OpenAsync( geometry, new EchocatLinkOption(), new LegacyClientConfig());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}");}for i, version in enumerate(await client.read_firmware_version()): print(f"device[{i}] firmware version: {version}")var versions = await client.ReadFirmwareVersionAsync();for (var i = 0; i < versions.Count; i++){ Console.WriteLine($"device[{i}] firmware version: {versions[i]}");}コマンドの組み立ても同じである (型が 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?;}builder = client.datagram_builder()builder.push(SetSilencer())builder.push(Pattern(emissions))builder.push(Modulation(SamplingConfig.FREQ_4K, mod_buf))frames = builder.build()for i in range(len(frames)): await client.send_checked(frames[i])using var builder = client.DatagramBuilder();builder .Push(new SetSilencer()) .Push(new Pattern(emissions)) .Push(new Modulation(SamplingConfig.Freq4k, modulation));using var frames = builder.Build();foreach (var frame in frames){ await client.SendCheckedAsync(frame);}デバイス毎にコマンドを割り当てる push_each も同じように使える.
終了処理も同様である.
client.stop().await?;client.close().await?;await client.stop()await client.close()await client.StopAsync();await client.CloseAsync();現行 Client との違い
Section titled “現行 Client との違い”| 項目 | Client |
LegacyClient |
|---|---|---|
| 送信モデル | パイプライン / stop-and-wait | stop-and-wait のみ |
| エラー詳細の読み出し | read_error_detail() |
非対応 (エラーは ack のコードのみ) |
| Telemetry カウンタの読み出し | read_telemetry() |
非対応 |
旧ファームウェアでは, 現行のパイプライン送信は使えない. したがってスループットは現行より大きく劣る.
対応コマンド
Section titled “対応コマンド”以下のコマンドが使える.
ClearForceFanSetSilencerPatternModulationChangeModulationBankFociStmPatternStmSetOutputMaskSetPhaseCorrectionSetPulseWidthTableSetGpioOutEmulateGpioIn
以下は使用不可.
WritePatternBufferWriteModulationBufferWriteFociBufferWritePatternCompressedConfigPatternConfigModulationConfigFociStmChangePatternBank(下記参照)
パターンバンクの切り替え
Section titled “パターンバンクの切り替え”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?;}builder = client.datagram_builder()builder.push(Pattern(emissions, PatternBank.B1))frames = builder.build()for i in range(len(frames)): await client.send_checked(frames[i])
builder = client.datagram_builder()builder.push(LegacyChangePatternBank.pattern(PatternBank.B0))frames = builder.build()for i in range(len(frames)): await client.send_checked(frames[i])using (var bankBuilder = client.DatagramBuilder()){ bankBuilder.Push(new Pattern(PatternBank.B1, emissions)); using var bankFrames = bankBuilder.Build(); foreach (var frame in bankFrames) { await client.SendCheckedAsync(frame); }}
using (var bankBuilder = client.DatagramBuilder()){ bankBuilder.Push(LegacyChangePatternBank.Pattern(PatternBank.B0)); using var bankFrames = bankBuilder.Build(); foreach (var frame in bankFrames) { await client.SendCheckedAsync(frame); }}