commit a1dcd606d9d2c2545d726f1f25a7336a4c50504e Author: finga Date: Thu Apr 21 20:40:52 2022 +0200 Read from hardcoded serial port diff --git a/.cargo/config b/.cargo/config new file mode 100644 index 0000000..199c867 --- /dev/null +++ b/.cargo/config @@ -0,0 +1,13 @@ +[target.'cfg(feature = "cargo-clippy")'] +rustflags = [ + "-Dwarnings", + "-Dclippy::pedantic", + "-Dclippy::nursery", + "-Dclippy::cargo", +] + +[target.armv7-unknown-linux-gnueabihf] +linker = "arm-linux-gnueabihf-gcc" + +[target.aarch64-unknown-linux-gnu] +linker = "aarch64-linux-gnu-gcc" diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/.woodpecker.yml b/.woodpecker.yml new file mode 100644 index 0000000..c037259 --- /dev/null +++ b/.woodpecker.yml @@ -0,0 +1,30 @@ +pipeline: + fmt: + group: default + image: rust_full + commands: + - cargo fmt --all -- --check + + clippy: + group: default + image: rust_full + commands: + - cargo clippy --all-features + + doc: + group: default + image: rust_full + commands: + - cargo doc --all-features + + build: + group: default + image: rust_full + commands: + - cargo build --all-features + + build_release: + group: release + image: rust_full + commands: + - cargo build --all-features --release diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..ab9d474 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,198 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "CoreFoundation-sys" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0e9889e6db118d49d88d84728d0e964d973a5680befb5f85f55141beea5c20b" +dependencies = [ + "libc", + "mach 0.1.2", +] + +[[package]] +name = "IOKit-sys" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99696c398cbaf669d2368076bdb3d627fb0ce51a26899d7c61228c5c0af3bf4a" +dependencies = [ + "CoreFoundation-sys", + "libc", + "mach 0.1.2", +] + +[[package]] +name = "aho-corasick" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" +dependencies = [ + "memchr", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "cc" +version = "1.0.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "libc" +version = "0.2.124" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21a41fed9d98f27ab1c6d161da622a4fa35e8a54a8adc24bbf3ddd0ef70b0e50" + +[[package]] +name = "libudev" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b324152da65df7bb95acfcaab55e3097ceaab02fb19b228a9eb74d55f135e0" +dependencies = [ + "libc", + "libudev-sys", +] + +[[package]] +name = "libudev-sys" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c8469b4a23b962c1396b9b451dda50ef5b283e8dd309d69033475fa9b334324" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "mach" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fd13ee2dd61cc82833ba05ade5a30bb3d63f7ced605ef827063c63078302de9" +dependencies = [ + "libc", +] + +[[package]] +name = "mach" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa" +dependencies = [ + "libc", +] + +[[package]] +name = "memchr" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" + +[[package]] +name = "memoffset" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mightyohm-gc-exporter" +version = "0.1.0-dev" +dependencies = [ + "serialport", +] + +[[package]] +name = "nix" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f866317acbd3a240710c63f065ffb1e4fd466259045ccb504130b7f668f35c6" +dependencies = [ + "bitflags", + "cc", + "cfg-if", + "libc", + "memoffset", +] + +[[package]] +name = "pkg-config" +version = "0.3.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" + +[[package]] +name = "regex" +version = "1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a11647b6b25ff05a515cb92c365cec08801e83423a235b51e231e1808747286" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" + +[[package]] +name = "serialport" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fc52fd78198e211d0e39928cbca339da52f679f4a964cdf335b33fc1855f63f" +dependencies = [ + "CoreFoundation-sys", + "IOKit-sys", + "bitflags", + "cfg-if", + "libudev", + "mach 0.3.2", + "nix", + "regex", + "winapi", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..d46d6a9 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "mightyohm-gc-exporter" +version = "0.1.0-dev" +edition = "2021" +description = "Prometheus exporter for the MightyOhm Geiger Counter" +license = "GPL-3.0-or-later" +repository = "https://git.onders.org/finga/mightyohm-gc-exporter" +keywords = ["prometheus", "metrics"] +categories = ["api-bindings", "command-line-utilities", "visualization"] + +[dependencies] +serialport = "4.1" diff --git a/README.md b/README.md new file mode 100644 index 0000000..35264c1 --- /dev/null +++ b/README.md @@ -0,0 +1,15 @@ +# Exporter for the MightyOhm Geiger Counter [![status-badge](https://ci.onders.org/api/badges/finga/mightyohm-gc-exporter/status.svg)](https://ci.onders.org/finga/mightyohm-gc-exporter) +A Prometheus exporter for the [MightyOhm Geiger Counter](https://mightyohm.com/blog/products/geiger-counter/). + +## Build +### Same architecture as system +To compile it for the same architecture as the build system: +```sh +cargo build --release +``` + +### Cross-compile for aarch64 (recent RaspberryPi) +To cross-compile it for RaspberryPi: +```sh +PKG_CONFIG_SYSROOT_DIR=/usr/aarch64-linux-gnu cargo build --target aarch64-unknown-linux-gnu --release +``` diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..fdcda0a --- /dev/null +++ b/src/main.rs @@ -0,0 +1,34 @@ +use std::{ + io::{self, Write}, + time::Duration, +}; + +fn main() { + let port_name = "/dev/serial0"; + let baud_rate = 9600; + + let port = serialport::new(port_name, baud_rate) + .timeout(Duration::from_millis(100)) + .open(); + + match port { + Ok(mut port) => { + let mut serial_buf: Vec = vec![0; 1000]; + println!("Receiving data on {} at {} baud:", &port_name, &baud_rate); + loop { + match port.read(serial_buf.as_mut_slice()) { + Ok(t) => io::stdout().write_all(&serial_buf[..t]).unwrap(), + Err(ref e) if e.kind() == io::ErrorKind::TimedOut => (), + Err(e) => { + eprintln!("Failed to read \"{}\". Error: {}", port_name, e); + ::std::process::exit(1); + } + } + } + } + Err(e) => { + eprintln!("Failed to open \"{}\". Error: {}", port_name, e); + ::std::process::exit(1); + } + } +}