From 32f3124374eefc49723856fde86a65a50f6be976 Mon Sep 17 00:00:00 2001 From: Niklas Kapelle Date: Sat, 12 Apr 2025 13:01:03 +0200 Subject: [PATCH] initial commit --- .gitignore | 1 + Cargo.lock | 54 +++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 7 +++++++ src/id_store.rs | 1 + src/main.rs | 7 +++++++ src/parser.rs | 8 ++++++++ src/pm3.rs | 34 +++++++++++++++++++++++++++++++ 7 files changed, 112 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 src/id_store.rs create mode 100644 src/main.rs create mode 100644 src/parser.rs create mode 100644 src/pm3.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..ca78754 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,54 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "fw-anwesenheit" +version = "0.1.0" +dependencies = [ + "regex", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..d66b2ad --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "fw-anwesenheit" +version = "0.1.0" +edition = "2024" + +[dependencies] +regex = "1.11.1" diff --git a/src/id_store.rs b/src/id_store.rs new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/id_store.rs @@ -0,0 +1 @@ + diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..313293f --- /dev/null +++ b/src/main.rs @@ -0,0 +1,7 @@ +mod parser; +mod pm3; +mod id_store; + +fn main() { + pm3::RunPm3().unwrap(); +} diff --git a/src/parser.rs b/src/parser.rs new file mode 100644 index 0000000..4c65019 --- /dev/null +++ b/src/parser.rs @@ -0,0 +1,8 @@ +use regex::Regex; + +pub fn ParseLine(line: &str) -> Option { + let regex = Regex::new(r"(?m)^\[\+\] UID.... (.*)$").unwrap(); + let result = regex.captures(line); + + result.map(|c| c.get(1).unwrap().as_str().to_owned()) +} diff --git a/src/pm3.rs b/src/pm3.rs new file mode 100644 index 0000000..e0fa943 --- /dev/null +++ b/src/pm3.rs @@ -0,0 +1,34 @@ +use std::error::Error; +use std::process::{Command, Stdio}; +use std::io::{self, BufRead}; + +pub fn RunPm3() -> Result<(), Box> { + let mut cmd = Command::new("stdbuf") + .arg("-oL") + .arg("pm3") + .arg("-c") + .arg("lf hitag reader -@") + .stdout(Stdio::piped()) + .spawn()?; + + let stdout = cmd.stdout.take().ok_or("Failed to get stdout")?; + let reader = io::BufReader::new(stdout); + + for line_result in reader.lines() { + match line_result { + Ok(line) => { + let parse_result = super::parser::ParseLine(&line); + if let Some(uid) = parse_result { + println!("UID: {}",uid); + } + } + Err(e) => { + eprintln!("{}",e); + } + } + } + + let status = cmd.wait().expect("Failed to wait on child"); + + Ok(()) +}