1
Fork 0

Compare commits

...

2 commits

Author SHA1 Message Date
b50bc79a25
receive control data 2025-01-05 18:00:59 -05:00
170a32d483
sending telemetry 2025-01-05 17:32:12 -05:00
3 changed files with 163 additions and 3 deletions

103
encoder/Cargo.lock generated
View file

@ -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"

View file

@ -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"
tokio = { version = "1.42.0", features = ["full"] }
serde = { version = "1.0.217", features = ["derive"] }
serde_json = "1.0.134"
tokio = { version = "1.42.0", features = ["full", "io-util"] }
zune-jpeg = "0.4.14"

View file

@ -1,9 +1,11 @@
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 tokio::{io::AsyncWriteExt, net::{TcpListener, TcpStream}, runtime::Runtime, sync::{Notify, RwLock}, task::LocalSet};
use serde::{Deserialize, Serialize};
use tokio::{io::{AsyncBufReadExt, AsyncWriteExt, BufReader}, net::{TcpListener, TcpStream}, runtime::Runtime, sync::{Notify, RwLock}, task::{JoinHandle, LocalSet}};
fn main() -> Result<()>{
let await_frame = Arc::new(Notify::new());
@ -29,8 +31,60 @@ fn main() -> Result<()>{
});
}
let runtime = Runtime::new()?;
loop {}
runtime.block_on(telemetry_server()).unwrap();
Ok(())
}
#[derive(Serialize)]
struct Telemetry {
battery_level: f32,
}
#[derive(Deserialize, Debug)]
struct Control {
#[serde(rename = "Data")]
data: f32,
}
async fn telemetry_server() -> Result<()>{
let port = 2994;
let listener = TcpListener::bind(format!("0.0.0.0:{port}")).await?;
while let result::Result::Ok((connection, addr)) = listener.accept().await {
println!("telemetry connection from {:?}", addr);
let (receiver, mut sender) = connection.into_split();
tokio::spawn(async move {
let mut reader = BufReader::new(receiver).lines();
while let Some(line) = reader.next_line().await? {
println!("recv: {line}");
if let result::Result::Ok(control) = serde_json::from_str::<Control>(&line) {
println!("deserialized: data is {}", control.data);
}
}
Ok(())
});
tokio::spawn(async move {
let battery = Manager::new()?.batteries()?.nth(0).context("no battery")??;
let full = battery.energy_full();
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.unwrap();
Ok(())
});
}
Ok(())
}
async fn camera_manager(await_frame: Arc<Notify>, latest_frame: Arc<RwLock<Vec<u8>>>) -> Result<()>{