diff --git a/encoder/Cargo.toml b/encoder/Cargo.toml index 4a11b3a..910b1f3 100644 --- a/encoder/Cargo.toml +++ b/encoder/Cargo.toml @@ -11,5 +11,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"] } +tokio = { version = "1.42.0", features = ["full", "io-util"] } zune-jpeg = "0.4.14" diff --git a/encoder/src/main.rs b/encoder/src/main.rs index 7b02654..6947e86 100644 --- a/encoder/src/main.rs +++ b/encoder/src/main.rs @@ -4,8 +4,8 @@ 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}; +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()); @@ -43,25 +43,45 @@ 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?; - let battery = Manager::new()?.batteries()?.nth(0).context("no battery")??; - let full = battery.energy_full(); + 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::(&line) { + println!("deserialized: data is {}", control.data); + } + } - while let result::Result::Ok(mut connection) = listener.accept().await { - println!("telemetry connection from {:?}", connection.1); - let (_receiver, mut sender) = connection.0.split(); + Ok(()) + }); - let mock = Telemetry { battery_level: (battery.energy()/full).value * 100. } ; + tokio::spawn(async move { + let battery = Manager::new()?.batteries()?.nth(0).context("no battery")??; + let full = battery.energy_full(); - let mut send = serde_json::to_vec(&mock).unwrap(); - send.push(b'\r'); - send.push(b'\n'); + let mock = Telemetry { battery_level: (battery.energy()/full).value * 100. } ; - sender.write_all(&send).await?; + 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(())