SysTime
SysTime はデバイスの時刻を表す型.
TransitionMode::SysTime や GpioOut::SysTimeEq などで用いる.
各デバイスは自身のクロックを持ち, 出力の切り替えなどはこの時刻で行う.
この時刻は 64 bitの ns 単位のカウンタで, Client を開いたときから数える.
ホストの時計 (日時) とは対応しない.
現在のデバイスの時刻は Client の device_time_now() で取得する.
なお, デバイス時刻を直接取得することはできないので, device_time_now()が返す値は推定値であることに注意する.
この推定は送受信データサンプルが多く, かつ, 直前にデータを送受信していたほうが正確になる.
正確に推定したい場合は, heartbeatを定期的に送りつつ, device_time_nowを呼ぶ直前にも heartbeat を送ると良い.
SysTime は現在のデバイスの時刻, または生の ns から構築する.
let opened = SysTime::ZERO;let now = client.device_time_now()?;let raw = SysTime::from_nanos(1_000_000_000);let ns: u64 = now.sys_time();opened = SysTime.ZEROnow = client.device_time_now()raw = SysTime.from_nanos(1_000_000_000)ns = now.sys_timevar opened = SysTime.Zero;var now = client.DeviceTimeNow();var raw = SysTime.FromNanos(1_000_000_000);ulong ns = now.Nanos;| 操作 | 説明 |
|---|---|
ZERO |
Client を開いた時点 |
Client::device_time_now() |
現在のデバイスの時刻 |
from_nanos(ns) |
開いてからの経過 ns から構築 |
sys_time() |
開いてからの経過 ns |
SysTime には時間差を加減算する演算が定義されている.
let future = client.device_time_now()? + Duration::from_millis(100);let past = future - Duration::from_millis(50);let elapsed: Duration = future - past;let is_after: bool = future > past; // truefuture = client.device_time_now() + Duration.from_millis(100)past = future - Duration.from_millis(50)elapsed = future - pastis_after = future > pastvar future = client.DeviceTimeNow() + TimeSpan.FromMilliseconds(100);var past = future - TimeSpan.FromMilliseconds(50);TimeSpan elapsed = future - past;bool isAfter = future > past; // true| 演算 | 結果 | 説明 |
|---|---|---|
SysTime + Duration |
SysTime |
指定時間の加算 |
SysTime - Duration |
SysTime |
指定時間の減算 |
SysTime - SysTime |
Duration |
2 時刻の差 (負になる場合は 0) |
比較 (< / > / == など) |
bool |
比較 |