1
Fork 0

receive control data

This commit is contained in:
Andy Killorin 2025-01-05 18:00:59 -05:00
parent 170a32d483
commit b50bc79a25
Signed by: ank
GPG key ID: 23F9463ECB67FE8C
2 changed files with 33 additions and 13 deletions

View file

@ -11,5 +11,5 @@ nokhwa = { version = "0.10.7", features = ["input-native"] }
openh264 = "0.6.6" openh264 = "0.6.6"
serde = { version = "1.0.217", features = ["derive"] } serde = { version = "1.0.217", features = ["derive"] }
serde_json = "1.0.134" 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" zune-jpeg = "0.4.14"

View file

@ -4,8 +4,8 @@ use battery::Manager;
use image::{codecs::jpeg::JpegEncoder, ImageBuffer, Rgb}; use image::{codecs::jpeg::JpegEncoder, ImageBuffer, Rgb};
use nokhwa::{pixel_format::RgbFormat, utils::{ApiBackend, RequestedFormat, RequestedFormatType, Resolution}, Camera}; use nokhwa::{pixel_format::RgbFormat, utils::{ApiBackend, RequestedFormat, RequestedFormatType, Resolution}, Camera};
use anyhow::{Context, Ok, Result}; use anyhow::{Context, Ok, Result};
use serde::Serialize; use serde::{Deserialize, Serialize};
use tokio::{io::AsyncWriteExt, net::{TcpListener, TcpStream}, runtime::Runtime, sync::{Notify, RwLock}, task::LocalSet}; use tokio::{io::{AsyncBufReadExt, AsyncWriteExt, BufReader}, net::{TcpListener, TcpStream}, runtime::Runtime, sync::{Notify, RwLock}, task::{JoinHandle, LocalSet}};
fn main() -> Result<()>{ fn main() -> Result<()>{
let await_frame = Arc::new(Notify::new()); let await_frame = Arc::new(Notify::new());
@ -43,25 +43,45 @@ struct Telemetry {
battery_level: f32, battery_level: f32,
} }
#[derive(Deserialize, Debug)]
struct Control {
#[serde(rename = "Data")]
data: f32,
}
async fn telemetry_server() -> Result<()>{ async fn telemetry_server() -> Result<()>{
let port = 2994; let port = 2994;
let listener = TcpListener::bind(format!("0.0.0.0:{port}")).await?; let listener = TcpListener::bind(format!("0.0.0.0:{port}")).await?;
let battery = Manager::new()?.batteries()?.nth(0).context("no battery")??; while let result::Result::Ok((connection, addr)) = listener.accept().await {
let full = battery.energy_full(); 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);
}
}
while let result::Result::Ok(mut connection) = listener.accept().await { Ok(())
println!("telemetry connection from {:?}", connection.1); });
let (_receiver, mut sender) = connection.0.split();
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(); let mock = Telemetry { battery_level: (battery.energy()/full).value * 100. } ;
send.push(b'\r');
send.push(b'\n');
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(()) Ok(())