これは開発版のドキュメントである. 内容は次のリリースまでに変更される可能性がある. 最新のリリース版は 0.6.x を参照.
Client
Client はコマンドの送信・状態の読み出しを行う中心的なオブジェクト.
Client を含む基礎・コマンドの API は本体パッケージが提供する.
実機等への接続には, これとは別に Link が必要.
Client::open(&geometry, link, option).await?;await Client.open(geometry, link, option)await Client.OpenAsync(geometry, link, option);| 引数 | 型 | 説明 |
|---|---|---|
geometry |
&Geometry |
デバイスの物理配置 |
link |
impl IntoLink |
リンク |
config |
ClientConfig |
下記参照 |
リンクの稼働状態を継続的に監視したい場合は open_with_checker を使い, 返り値の Checker を駆動する (リンクの状態監視 参照).
let num_devices = client.num_devices();
let firmware = client.read_firmware_version().await?;let fpga_state = client.read_fpga_state().await?;let error_detail = client.read_error_detail().await?;
let datagram_builder = client.datagram_builder();let resp = client.send(frame).await?.await?;client.send_checked(frame).await?;
client.stop().await?;client.close().await?;num_devices = client.num_devices()
firmware = await client.read_firmware_version()fpga_state = await client.read_fpga_state()error_detail = await client.read_error_detail()
datagram_builder = client.datagram_builder()resp = await (await client.send(frame))await client.send_checked(frame)
await client.stop()await client.close()var numDevices = client.NumDevices;
var firmware = await client.ReadFirmwareVersionAsync();var fpgaState = await client.ReadFpgaStateAsync();var errorDetail = await client.ReadErrorDetailAsync();
var datagramBuilder = client.DatagramBuilder();var resp = await await client.SendAsync(frame);await client.SendCheckedAsync(frame);
await client.StopAsync();await client.CloseAsync();| メソッド | async | 返り値 | 説明 |
|---|---|---|---|
num_devices() |
— | usize |
接続中のデバイス台数 |
read_firmware_version() |
✓ | Result<Vec<FirmwareVersion>, Error> |
各デバイスの CPU/FPGA ファームウェアバージョン |
read_fpga_state() |
✓ | Result<Vec<FpgaState>, Error> |
各デバイスの FPGA 状態 |
read_error_detail() |
✓ | Result<Vec<u8>, Error> |
各デバイスのエラー詳細 |
datagram_builder() |
— | DatagramBuilder |
DatagramBuilder |
send(frame) |
✓ | Result<ResponseFuture, Error> |
フレームを送信キューにいれる. ResponseFuture を await すると応答 (Response) が得られる |
send_checked(frame) |
✓ | Result<(), Error> |
送信し, 応答確認まで行う |
stop() |
✓ | Result<(), Error> |
全振動子を停止 |
close() |
✓ | Result<(), Error> |
接続を閉じる |
send_checked(frame).await? は, send(frame).await?.await?.check() と等価である.
ClientConfig
Section titled “ClientConfig”ClientConfig { timeout_cycles: NonZeroU32::new(10).unwrap(), max_inflight: NonZeroUsize::new(MAX_INFLIGHT).unwrap(), max_resync_rounds: NonZeroU32::new(8).unwrap(), low_latency: false, reset_resend_cycles: NonZeroU32::new(2).unwrap(), rt_priority: Some(ThreadPriority::Crossplatform( ThreadPriorityValue::try_from(80).unwrap(), )), rt_policy: RtSchedulePolicy::Fifo, rt_affinity: None, validate_state: true, require_supported_firmware: false, ..Default::default()}ClientConfig( timeout_cycles=10, max_inflight=MAX_INFLIGHT, max_resync_rounds=8, low_latency=False, reset_resend_cycles=2, rt_priority=80, disable_rt_priority=False, rt_affinity=None, validate_state=True,)new ClientConfig( timeoutCycles: 10, maxInflight: (uint)Client.MaxInflight, maxResyncRounds: 8, lowLatency: false, resetResendCycles: 2, rtPriority: 80, disableRtPriority: false, rtAffinity: null, validateState: true)| フィールド | 型 | デフォルト | 説明 |
|---|---|---|---|
timeout_cycles |
NonZeroU32 |
10 |
応答待ちのタイムアウト (送信サイクル数) |
max_inflight |
NonZeroUsize |
127 |
送信キューサイズ |
max_resync_rounds |
NonZeroU32 |
8 |
再同期を試みる最大ラウンド数 |
low_latency |
bool |
false |
低レイテンシモード |
reset_resend_cycles |
NonZeroU32 |
2 |
リセット命令の送信サイクル数 |
rt_priority |
Option<ThreadPriority> |
Windows: TimeCritical / その他: 80 |
RT スレッドの優先度. None にすると OS 既定. |
rt_policy |
RtSchedulePolicy |
Fifo |
rt_priority 指定時のスケジューリングポリシー. Normal, Fifo (SCHED_FIFO), RoundRobin (SCHED_RR) |
rt_affinity |
Option<CoreId> |
None |
RT スレッドの CPU affinity (None なら OS 既定) |
validate_state |
bool |
true |
送信前検証を有効にする |
require_supported_firmware |
bool |
false |
trueなら接続時にファームウェアがサポートされているか検査する |
max_inflight は MAX_INFLIGHT (127) を超えるとエラーになる.
low_latency を有効にすると, ファームウェア内部での受信バッファをバイパスするため, レイテンシが改善する. ただし, 動作が不安定になる可能性がある.