From 2ca077e178147159f41c3342fb86393199335045 Mon Sep 17 00:00:00 2001 From: Sachymetsu Date: Wed, 15 Jul 2026 08:42:25 +0200 Subject: [PATCH] Common pod stuff --- Cargo.lock | 29 +++++++++++++++ Cargo.toml | 15 ++++++-- water-pod-common/Cargo.toml | 14 ++++++++ water-pod-common/src/lib.rs | 71 +++++++++++++++++++++++++++++++++++++ 4 files changed, 127 insertions(+), 2 deletions(-) create mode 100644 water-pod-common/Cargo.toml create mode 100644 water-pod-common/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 3c1d1ef..b24d0f7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -132,6 +132,15 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +[[package]] +name = "cobs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" +dependencies = [ + "thiserror", +] + [[package]] name = "colorchoice" version = "1.0.5" @@ -657,6 +666,16 @@ dependencies = [ "portable-atomic", ] +[[package]] +name = "postcard" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24" +dependencies = [ + "cobs", + "serde", +] + [[package]] name = "proc-macro2" version = "1.0.106" @@ -978,9 +997,19 @@ dependencies = [ "jiff", "log", "tokio", + "water-pod-common", "winnow", ] +[[package]] +name = "water-pod-common" +version = "0.1.0" +dependencies = [ + "jiff", + "postcard", + "serde", +] + [[package]] name = "windows-link" version = "0.2.1" diff --git a/Cargo.toml b/Cargo.toml index 8d56b98..230d03d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,9 +1,20 @@ -[package] -name = "water-pod" +[workspace] +resolver = "3" +members = [".", "water-pod-common"] + +[workspace.package] +authors = ["Sachy.dev "] version = "0.1.0" edition = "2024" +[package] +name = "water-pod" +version.workspace = true +authors.workspace = true +edition.workspace = true + [dependencies] +water-pod-common = { path = "./water-pod-common" } tokio = { version = "1", features = ["io-std", "io-util", "net", "rt", "macros", "signal", "sync"] } env_logger = "0.11" log = "0.4" diff --git a/water-pod-common/Cargo.toml b/water-pod-common/Cargo.toml new file mode 100644 index 0000000..69e4869 --- /dev/null +++ b/water-pod-common/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "water-pod-common" +authors.workspace = true +version.workspace = true +edition.workspace = true + +[dependencies] +serde = { version = "1", default-features = false } +jiff = { version = "0.2.32", default-features = false } +postcard = { version = "1", default-features = false } + +[features] +default = ["server"] +server = ["jiff/std"] diff --git a/water-pod-common/src/lib.rs b/water-pod-common/src/lib.rs new file mode 100644 index 0000000..7f5dac2 --- /dev/null +++ b/water-pod-common/src/lib.rs @@ -0,0 +1,71 @@ +#![no_std] + +use jiff::{SignedDuration, Timestamp}; + +#[derive(Debug, serde::Serialize, serde::Deserialize)] +pub enum Request { + TimeSync(TimeSyncMs), +} + +#[derive(Debug, serde::Serialize, serde::Deserialize)] +pub enum Response { + TimeSync(TimeSyncMs), +} + +impl Request { + pub fn to_bytes<'a>(self, buf: &'a mut [u8]) -> Result<&'a mut [u8], postcard::Error> { + postcard::to_slice(&self, buf) + } + + pub fn from_bytes(buf: &[u8]) -> Result { + postcard::from_bytes(buf) + } +} + +impl Response { + pub fn to_bytes<'a>(self, buf: &'a mut [u8]) -> Result<&'a mut [u8], postcard::Error> { + postcard::to_slice(&self, buf) + } + + pub fn from_bytes(buf: &[u8]) -> Result { + postcard::from_bytes(buf) + } +} + +#[derive(Debug, serde::Serialize, serde::Deserialize)] +pub struct TimeSyncMs { + t0: i64, + t1: i64, + t2: i64, +} + +impl TimeSyncMs { + pub fn new(origin: jiff::Timestamp) -> Self { + Self { + t0: origin.as_millisecond(), + t1: jiff::Timestamp::MIN.as_millisecond(), + t2: jiff::Timestamp::MIN.as_millisecond(), + } + } + + #[cfg(feature = "server")] + pub fn set_t1(&mut self) { + self.t1 = Timestamp::now().as_millisecond(); + } + + #[cfg(feature = "server")] + pub fn set_t2(&mut self) { + self.t2 = Timestamp::now().as_millisecond(); + } + + pub fn calc_synced_time(self, t3: Timestamp) -> Result { + let off1 = self.t1.saturating_sub(self.t0); + let off2 = self.t2.saturating_sub(t3.as_millisecond()); + + let offset = off1.saturating_add(off2) / 2; + + let original_ts = Timestamp::from_millisecond(self.t0)?; + + original_ts.saturating_add(SignedDuration::from_millis(offset)) + } +} -- 2.51.2