1
Fork 0

send telemetry repeatedly

This commit is contained in:
Andy Killorin 2025-01-06 12:37:09 -05:00
parent b50bc79a25
commit 4a7b8b5b45
Signed by: ank
GPG key ID: 23F9463ECB67FE8C

View file

@ -1,11 +1,11 @@
use std::{array::from_ref, net::SocketAddr, result, sync::Arc, thread::{self, sleep}, time::Duration}; use std::{array::from_ref, net::SocketAddr, result, sync::Arc, thread::{self}, time::{Duration, SystemTime, UNIX_EPOCH}};
use battery::Manager; 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::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use tokio::{io::{AsyncBufReadExt, AsyncWriteExt, BufReader}, net::{TcpListener, TcpStream}, runtime::Runtime, sync::{Notify, RwLock}, task::{JoinHandle, LocalSet}}; use tokio::{io::{AsyncBufReadExt, AsyncWriteExt, BufReader}, net::{TcpListener, TcpStream}, runtime::Runtime, sync::{Notify, RwLock}, task::{JoinHandle, LocalSet}, time::sleep};
fn main() -> Result<()>{ fn main() -> Result<()>{
let await_frame = Arc::new(Notify::new()); let await_frame = Arc::new(Notify::new());
@ -41,6 +41,7 @@ fn main() -> Result<()>{
#[derive(Serialize)] #[derive(Serialize)]
struct Telemetry { struct Telemetry {
battery_level: f32, battery_level: f32,
timestamp: u64,
} }
#[derive(Deserialize, Debug)] #[derive(Deserialize, Debug)]
@ -69,18 +70,22 @@ async fn telemetry_server() -> Result<()>{
Ok(()) Ok(())
}); });
tokio::spawn(async move { let _: JoinHandle<Result<()>> = tokio::spawn(async move {
let battery = Manager::new()?.batteries()?.nth(0).context("no battery")??; let battery = Manager::new()?.batteries()?.nth(0).context("no battery")??;
let full = battery.energy_full(); let full = battery.energy_full();
let mock = Telemetry { battery_level: (battery.energy()/full).value * 100. } ; loop {
let time = SystemTime::now().duration_since(UNIX_EPOCH)?.as_millis();
let mock = Telemetry { battery_level: (battery.energy()/full).value * 100., timestamp: time as u64 } ;
let mut send = serde_json::to_vec(&mock).unwrap(); let mut send = serde_json::to_vec(&mock)?;
send.push(b'\r'); send.push(b'\r');
send.push(b'\n'); send.push(b'\n');
sender.write_all(&send).await.unwrap(); sender.write_all(&send).await?;
Ok(())
sleep(Duration::from_millis(20)).await;
}
}); });
} }
@ -106,7 +111,7 @@ async fn camera_manager(await_frame: Arc<Notify>, latest_frame: Arc<RwLock<Vec<u
let mut encoder = JpegEncoder::new_with_quality(&mut output, 30); let mut encoder = JpegEncoder::new_with_quality(&mut output, 30);
encoder.encode_image(&frame).unwrap(); encoder.encode_image(&frame)?;
*latest_frame.write().await = output; *latest_frame.write().await = output;
await_frame.notify_waiters(); await_frame.notify_waiters();