From 170a32d4834254922982c09457f16e64ac329a6f Mon Sep 17 00:00:00 2001 From: Andy Killorin <37423245+Speedy6451@users.noreply.github.com> Date: Sun, 5 Jan 2025 17:32:12 -0500 Subject: [PATCH] sending telemetry --- encoder/Cargo.lock | 103 ++++++++++++++++++++++++++++++++++++++++++++ encoder/Cargo.toml | 3 ++ encoder/src/main.rs | 36 +++++++++++++++- 3 files changed, 141 insertions(+), 1 deletion(-) diff --git a/encoder/Cargo.lock b/encoder/Cargo.lock index 99582bc..7b0dbc4 100644 --- a/encoder/Cargo.lock +++ b/encoder/Cargo.lock @@ -105,6 +105,23 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "battery" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4b624268937c0e0a3edb7c27843f9e547c320d730c610d3b8e6e8e95b2026e4" +dependencies = [ + "cfg-if 1.0.0", + "core-foundation 0.7.0", + "lazycell", + "libc", + "mach", + "nix", + "num-traits", + "uom", + "winapi", +] + [[package]] name = "bindgen" version = "0.65.1" @@ -419,9 +436,12 @@ name = "encoder" version = "0.1.0" dependencies = [ "anyhow", + "battery", "image", "nokhwa", "openh264", + "serde", + "serde_json", "tokio", "zune-jpeg", ] @@ -650,6 +670,12 @@ dependencies = [ "either", ] +[[package]] +name = "itoa" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" + [[package]] name = "jobserver" version = "0.1.32" @@ -750,6 +776,15 @@ dependencies = [ "imgref", ] +[[package]] +name = "mach" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa" +dependencies = [ + "libc", +] + [[package]] name = "malloc_buf" version = "0.0.6" @@ -866,6 +901,18 @@ version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" +[[package]] +name = "nix" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ccba0cfe4fdf15982d1674c69b1fd80bad427d293849982668dfe454bd61f2" +dependencies = [ + "bitflags 1.3.2", + "cc", + "cfg-if 1.0.0", + "libc", +] + [[package]] name = "nokhwa" version = "0.10.7" @@ -1356,6 +1403,12 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + [[package]] name = "safe_arch" version = "0.7.4" @@ -1400,6 +1453,18 @@ dependencies = [ "syn", ] +[[package]] +name = "serde_json" +version = "1.0.134" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d00f4175c42ee48b15416f6193a959ba3a0d67fc699a0db9ad12df9f83991c7d" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + [[package]] name = "serde_spanned" version = "0.6.8" @@ -1608,12 +1673,28 @@ dependencies = [ "winnow", ] +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + [[package]] name = "unicode-ident" version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" +[[package]] +name = "uom" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e76503e636584f1e10b9b3b9498538279561adcef5412927ba00c2b32c4ce5ed" +dependencies = [ + "num-traits", + "typenum", +] + [[package]] name = "v4l" version = "0.14.0" @@ -1749,6 +1830,22 @@ dependencies = [ "safe_arch", ] +[[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-util" version = "0.1.9" @@ -1758,6 +1855,12 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + [[package]] name = "windows" version = "0.43.0" diff --git a/encoder/Cargo.toml b/encoder/Cargo.toml index abf915e..4a11b3a 100644 --- a/encoder/Cargo.toml +++ b/encoder/Cargo.toml @@ -5,8 +5,11 @@ edition = "2021" [dependencies] anyhow = "1.0.95" +battery = "0.7.8" image = "0.25.5" nokhwa = { version = "0.10.7", features = ["input-native"] } openh264 = "0.6.6" +serde = { version = "1.0.217", features = ["derive"] } +serde_json = "1.0.134" tokio = { version = "1.42.0", features = ["full"] } zune-jpeg = "0.4.14" diff --git a/encoder/src/main.rs b/encoder/src/main.rs index a1f1343..7b02654 100644 --- a/encoder/src/main.rs +++ b/encoder/src/main.rs @@ -1,8 +1,10 @@ use std::{array::from_ref, net::SocketAddr, result, sync::Arc, thread::{self, sleep}, time::Duration}; +use battery::Manager; use image::{codecs::jpeg::JpegEncoder, ImageBuffer, Rgb}; use nokhwa::{pixel_format::RgbFormat, utils::{ApiBackend, RequestedFormat, RequestedFormatType, Resolution}, Camera}; use anyhow::{Context, Ok, Result}; +use serde::Serialize; use tokio::{io::AsyncWriteExt, net::{TcpListener, TcpStream}, runtime::Runtime, sync::{Notify, RwLock}, task::LocalSet}; fn main() -> Result<()>{ @@ -29,8 +31,40 @@ fn main() -> Result<()>{ }); } + let runtime = Runtime::new()?; - loop {} + runtime.block_on(telemetry_server()).unwrap(); + + Ok(()) +} + +#[derive(Serialize)] +struct Telemetry { + battery_level: f32, +} + +async fn telemetry_server() -> Result<()>{ + let port = 2994; + let listener = TcpListener::bind(format!("0.0.0.0:{port}")).await?; + + let battery = Manager::new()?.batteries()?.nth(0).context("no battery")??; + let full = battery.energy_full(); + + + while let result::Result::Ok(mut connection) = listener.accept().await { + println!("telemetry connection from {:?}", connection.1); + let (_receiver, mut sender) = connection.0.split(); + + let mock = Telemetry { battery_level: (battery.energy()/full).value * 100. } ; + + let mut send = serde_json::to_vec(&mock).unwrap(); + send.push(b'\r'); + send.push(b'\n'); + + sender.write_all(&send).await?; + } + + Ok(()) } async fn camera_manager(await_frame: Arc, latest_frame: Arc>>) -> Result<()>{