diff --git a/thermalcamdecoder/src/main.rs b/thermalcamdecoder/src/main.rs index 20e6a82..4aae5b0 100644 --- a/thermalcamdecoder/src/main.rs +++ b/thermalcamdecoder/src/main.rs @@ -20,10 +20,10 @@ fn get_packets_without_udp_header() -> anyhow::Result<(Vec>, usize, usiz i += 1; size += offset; match packet { - PcapBlockOwned::Legacy(block) => { + PcapBlockOwned::Legacy(_block) => { println!("dunno"); } - PcapBlockOwned::LegacyHeader(block) => { + PcapBlockOwned::LegacyHeader(_block) => { println!("dunnoheader"); } PcapBlockOwned::NG(block) => { @@ -89,6 +89,7 @@ impl Header { }) } + #[allow(dead_code)] fn read_via_cast(data: &[u8]) -> anyhow::Result<&Self> { let size = std::mem::size_of::(); if data.len() < size { @@ -110,7 +111,7 @@ fn main() -> anyhow::Result<()> { let mut parts = vec![]; for packet in data.iter() { if let Ok(ref mut dump) = dump { - dump.write_all(&packet); + dump.write_all(&packet)?; } let hdr = Header::read(packet)?; let data = packet[HDR_SIZE..].to_vec(); @@ -121,6 +122,7 @@ fn main() -> anyhow::Result<()> { parts.push(data); } println!("found {} frames", frames.len()); + println!("writing raw pngs"); let pb = ProgressBar::new(frames.len() as u64); for (i, frame) in frames.iter().enumerate().progress_with(pb) { let name = format!("{:03}.png", i); @@ -131,7 +133,35 @@ fn main() -> anyhow::Result<()> { encoder.set_color(png::ColorType::Grayscale); encoder.set_depth(png::BitDepth::Sixteen); let mut writer = encoder.write_header()?; - writer.write_image_data(&frame); + writer.write_image_data(&frame)?; + } + + println!("writing calibrated (value is temperature)"); + let pb = ProgressBar::new(frames.len() as u64); + for (i, frame) in frames.iter().enumerate().progress_with(pb) { + let name = format!("temp_{:03}.png", i); + let path = Path::new(&name); + let file = File::create(path).unwrap(); + let ref mut w = BufWriter::new(file); + let mut encoder = png::Encoder::new(w, 288, 384); + encoder.set_color(png::ColorType::Grayscale); + encoder.set_depth(png::BitDepth::Eight); + let mut writer = encoder.write_header()?; + let p = frame.as_ptr(); + let samples: &[u16] = unsafe { std::slice::from_raw_parts(p.cast(), frame.len() / 2) }; + let frame = samples + .iter() + .copied() + .map(|x| { + let x: f64 = x.into(); + ((-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)) as u8 + }) + .collect::>(); + writer.write_image_data(&frame)?; } Ok(())