Compare commits

..

2 Commits

Author SHA1 Message Date
devdesk
2347158093 add command line options and temperature calibration
without temperature calibration 0.3%
with ~5%

model name	: Intel(R) Core(TM) i7-3615QM CPU @ 2.30GHz
2024-02-19 21:53:25 +02:00
devdesk
faccc3d20b add clap dep 2024-02-19 21:52:49 +02:00
5 changed files with 151 additions and 6 deletions

107
Cargo.lock generated
View File

@ -168,6 +168,54 @@ dependencies = [
"libc", "libc",
] ]
[[package]]
name = "anstream"
version = "0.6.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "96b09b5178381e0874812a9b157f7fe84982617e48f71f4e3235482775e5b540"
dependencies = [
"anstyle",
"anstyle-parse",
"anstyle-query",
"anstyle-wincon",
"colorchoice",
"utf8parse",
]
[[package]]
name = "anstyle"
version = "1.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc"
[[package]]
name = "anstyle-parse"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c"
dependencies = [
"utf8parse",
]
[[package]]
name = "anstyle-query"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648"
dependencies = [
"windows-sys 0.52.0",
]
[[package]]
name = "anstyle-wincon"
version = "3.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7"
dependencies = [
"anstyle",
"windows-sys 0.52.0",
]
[[package]] [[package]]
name = "anyhow" name = "anyhow"
version = "1.0.77" version = "1.0.77"
@ -715,6 +763,46 @@ dependencies = [
"libloading 0.8.1", "libloading 0.8.1",
] ]
[[package]]
name = "clap"
version = "4.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c918d541ef2913577a0f9566e9ce27cb35b6df072075769e0b26cb5a554520da"
dependencies = [
"clap_builder",
"clap_derive",
]
[[package]]
name = "clap_builder"
version = "4.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9f3e7391dad68afb0c2ede1bf619f579a3dc9c2ec67f089baa397123a2f3d1eb"
dependencies = [
"anstream",
"anstyle",
"clap_lex",
"strsim",
]
[[package]]
name = "clap_derive"
version = "4.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "307bc0538d5f0f83b8248db3087aa92fe504e4691294d0c96c0eabc33f47ba47"
dependencies = [
"heck",
"proc-macro2",
"quote",
"syn 2.0.48",
]
[[package]]
name = "clap_lex"
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce"
[[package]] [[package]]
name = "clipboard-win" name = "clipboard-win"
version = "5.1.0" version = "5.1.0"
@ -770,6 +858,12 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
[[package]]
name = "colorchoice"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7"
[[package]] [[package]]
name = "com" name = "com"
version = "0.6.0" version = "0.6.0"
@ -2925,6 +3019,12 @@ version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731"
[[package]]
name = "strsim"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01"
[[package]] [[package]]
name = "syn" name = "syn"
version = "1.0.109" version = "1.0.109"
@ -2979,6 +3079,7 @@ name = "thermaldecoder"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"clap",
"crossbeam", "crossbeam",
"crossbeam-channel", "crossbeam-channel",
"dotenv", "dotenv",
@ -3227,6 +3328,12 @@ dependencies = [
"percent-encoding", "percent-encoding",
] ]
[[package]]
name = "utf8parse"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a"
[[package]] [[package]]
name = "v4l" name = "v4l"
version = "0.14.0" version = "0.14.0"

View File

@ -11,6 +11,7 @@ crate-type = ["rlib", "cdylib"]
[dependencies] [dependencies]
anyhow = "1.0.77" anyhow = "1.0.77"
clap = { version = "4.5.1", features = ["derive"] }
crossbeam = "0.8.4" crossbeam = "0.8.4"
crossbeam-channel = "0.5.11" crossbeam-channel = "0.5.11"
dotenv = "0.15.0" dotenv = "0.15.0"

View File

@ -1,9 +1,31 @@
use clap::Parser;
use dotenv::dotenv; use dotenv::dotenv;
use std::io::Write; use std::io::Write;
use thermaldecoder::{Header, HDR_SIZE}; use thermaldecoder::{Header, HDR_SIZE};
use v4l::video::Output; use v4l::video::Output;
#[derive(Parser, Debug)]
#[command(version, about, long_about = None)]
struct Args {
#[arg(short, long, default_value_t = false)]
temperature: bool,
#[arg(short, long, default_value = "/dev/video0")]
device: String,
}
fn pixel_to_celcius(x: u16) -> u16 {
let x: f64 = x.into();
let x = x / 256.0;
let t = (-1.665884e-08) * x.powf(4.)
+ (1.347094e-05) * x.powf(3.)
+ (-4.396264e-03) * x.powf(2.)
+ (9.506939e-01) * x
+ (-6.353247e+01);
(t * 256.0) as u16
}
fn main() -> anyhow::Result<()> { fn main() -> anyhow::Result<()> {
let args = Args::parse();
dotenv().ok(); dotenv().ok();
let device = match std::env::var("THERMALCAM_IFACE=enp1s0f0") { let device = match std::env::var("THERMALCAM_IFACE=enp1s0f0") {
Ok(d) => { Ok(d) => {
@ -21,9 +43,7 @@ fn main() -> anyhow::Result<()> {
// get the default Device // get the default Device
println!("Using device {}", device.name); println!("Using device {}", device.name);
let output = std::env::args() let output = args.device;
.nth(1)
.expect("required output file argument");
println!("Using output v4l2loopback device {}", output); println!("Using output v4l2loopback device {}", output);
const WIDTH: usize = 288; const WIDTH: usize = 288;
@ -73,8 +93,12 @@ fn main() -> anyhow::Result<()> {
// possibly limitation of current v4l2loopback or v4l rust wrapper or libv4l2 // possibly limitation of current v4l2loopback or v4l rust wrapper or libv4l2
let mut swapped = [0u8; FRAME_LEN]; let mut swapped = [0u8; FRAME_LEN];
for i in 0..FRAME_LEN / 2 { for i in 0..FRAME_LEN / 2 {
swapped[i * 2] = frame[i * 2 + 1]; let mut pixel = u16::from_be_bytes([frame[i * 2], frame[i * 2 + 1]]);
swapped[i * 2 + 1] = frame[i * 2]; if args.temperature {
pixel = pixel_to_celcius(pixel);
}
let pixel_swapped = pixel.to_le_bytes();
swapped[i * 2..i * 2 + 2].copy_from_slice(&pixel_swapped);
} }
out.write_all(&swapped[..])?; out.write_all(&swapped[..])?;
} }

View File

@ -10,4 +10,4 @@ TARGET=./target/release/examples/live
# setcap does not work yet (EPERM on socket AF_PACKET) # setcap does not work yet (EPERM on socket AF_PACKET)
# sudo setcap cap_net_raw,cap_net_admin=eip $TARGET # sudo setcap cap_net_raw,cap_net_admin=eip $TARGET
#sudo strace -f -o live.strace $TARGET /dev/video0 #sudo strace -f -o live.strace $TARGET /dev/video0
sudo $TARGET /dev/video0 sudo RUST_BACKTRACE=full $TARGET "$@"

13
run_live_debug.sh Executable file
View File

@ -0,0 +1,13 @@
#!/bin/bash
cd $(dirname $0)
set -e
# Python works but stutters
#sudo ./venv/bin/python ./decode.py --live
cargo build --example live
TARGET=./target/debug/examples/live
# setcap does not work yet (EPERM on socket AF_PACKET)
# sudo setcap cap_net_raw,cap_net_admin=eip $TARGET
#sudo strace -f -o live.strace $TARGET /dev/video0
sudo RUST_BACKTRACE=full $TARGET "$@"