コンテンツにスキップ

状態監視

Client の read_state の返り値を見ることで, デバイスとの通信が正常に動いているかどうかを監視できる.

Response の device_status は, その返信の時点の各デバイスの状態 DeviceStatus の配列を返す.

DeviceStatus は以下を持つ.

  • state: デバイスの状態 (DeviceState).
  • ptp_locked: PTP がロックしているか.
  • failsafe_active: フェイルセーフで出力を止めていて, まだ解除されていないか

全デバイスが Ready か, といった集約は返り値から作る (下の例を参照). ptp_locked と failsafe_active はその返信の値である.

DeviceStateの意味は以下の通り.

状態 意味
Ready 返信があり, 時刻が同期されている
Syncing 返信はあるが, 時刻を合わせている途中

以下は, 一定間隔で生存確認を送って device_status を見て, 状態が変化したときだけ出力する例.

let mut last: Vec<DeviceStatus> = Vec::new();
loop {
let Ok(response) = tokio::time::timeout(CHECK_INTERVAL, client.read_state()).await else {
println!("not every device replied within {CHECK_INTERVAL:?}");
continue;
};
let status = response?.device_status();
if last != status {
for (i, s) in status.iter().enumerate() {
println!("device[{i}]: {}", s.state);
}
println!(
"all ready: {}",
status.iter().all(|s| s.state == DeviceState::Ready)
);
last = status;
}
tokio::time::sleep(CHECK_INTERVAL).await;
}