From: Scott Worley Date: Tue, 10 Oct 2023 23:12:31 +0000 (-0700) Subject: server: Merge keystroke time ranges X-Git-Tag: v0.1.0~14 X-Git-Url: http://git.scottworley.com/tattlekey/commitdiff_plain/5b8bd04910bea5ce2b70e922b1eb063475d52b5c?hp=f9625e91cfed21a65b720609ed1d8a7e7c0f36bd server: Merge keystroke time ranges --- diff --git a/server/src/main.rs b/server/src/main.rs index c31f873..94a47d8 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -14,12 +14,13 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +use std::collections::HashMap; use std::net::UdpSocket; use std::time::{Duration, SystemTime}; const MESSAGE_SIZE: usize = 12; -#[derive(Debug)] +#[derive(Eq, Debug, Hash, PartialEq)] struct MessageKey { epoch: u32, device: u16, @@ -57,7 +58,30 @@ impl TryFrom<&[u8]> for Message { } } +#[derive(Debug)] +struct Range { + start: SystemTime, + end: SystemTime, +} +impl Range { + fn new(t: &SystemTime) -> Self { + Self { start: *t, end: *t } + } + fn contains(&self, t: &SystemTime) -> bool { + t > &self.start && t < &self.end + } + fn extend(&mut self, t: &SystemTime) { + if t < &self.start { + self.start = *t; + } + if t > &self.end { + self.end = *t; + } + } +} + fn main() { + let mut presses = HashMap::::new(); let socket = UdpSocket::bind("0.0.0.0:29803").expect("couldn't bind to address"); loop { let mut buf = [0; MESSAGE_SIZE]; @@ -70,7 +94,15 @@ fn main() { continue; } let message = Message::try_from(filled_buf).expect("I can't count"); - println!("Got packet from {src_addr}: {message:?}"); + if let Some(r) = presses.get_mut(&message.key) { + if !r.contains(&message.t) { + r.extend(&message.t); + println!("Updated press: {:?}: {r:?}", message.key); + } + } else { + println!("Got new press: {:?}: {:?}", message.key, message.t); + presses.insert(message.key, Range::new(&message.t)); + } } } }