X-Git-Url: http://git.scottworley.com/tattlekey/blobdiff_plain/5b8bd04910bea5ce2b70e922b1eb063475d52b5c..5f5768318f897a20464ca177b5de64157afe0938:/server/src/main.rs diff --git a/server/src/main.rs b/server/src/main.rs index 94a47d8..e7351db 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -14,13 +14,15 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +use serde::Serialize; use std::collections::HashMap; use std::net::UdpSocket; use std::time::{Duration, SystemTime}; const MESSAGE_SIZE: usize = 12; +const LOGFILENAME: &str = "log.csv"; -#[derive(Eq, Debug, Hash, PartialEq)] +#[derive(Eq, Debug, Hash, PartialEq, Serialize)] struct MessageKey { epoch: u32, device: u16, @@ -30,7 +32,6 @@ struct MessageKey { #[derive(Debug)] struct Message { key: MessageKey, - ago: u32, t: SystemTime, } @@ -43,7 +44,6 @@ impl From<&[u8; MESSAGE_SIZE]> for Message { device: u16::from_be_bytes(value[4..=5].try_into().expect("I can't count")), seq: u16::from_be_bytes(value[6..=7].try_into().expect("I can't count")), }, - ago, t: SystemTime::now() - Duration::new(ago.into(), 0), } } @@ -80,9 +80,22 @@ impl Range { } } +fn open_log_for_writing() -> csv::Writer { + let log_file_exists = std::path::Path::new(LOGFILENAME).exists(); + let logfile = std::fs::OpenOptions::new() + .create_new(!log_file_exists) + .append(true) + .open(LOGFILENAME) + .expect("Coudln't open log file"); + csv::WriterBuilder::new() + .has_headers(!log_file_exists) + .from_writer(logfile) +} + fn main() { - let mut presses = HashMap::::new(); let socket = UdpSocket::bind("0.0.0.0:29803").expect("couldn't bind to address"); + let mut presses = HashMap::::new(); + let mut log = open_log_for_writing(); loop { let mut buf = [0; MESSAGE_SIZE]; match socket.recv_from(&mut buf) { @@ -94,13 +107,14 @@ fn main() { continue; } let message = Message::try_from(filled_buf).expect("I can't count"); + log.serialize((&message.key, message.t)) + .expect("Couldn't write log"); + log.flush().expect("Couldn't flush log"); 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)); } }