improved integration with telem viz

This commit is contained in:
2026-01-03 21:26:46 -05:00
parent 275cb07c4c
commit 252db5993d
12 changed files with 216 additions and 91 deletions

View File

@@ -7,7 +7,7 @@ edition = "2024"
anyhow = { workspace = true }
chrono = { workspace = true }
ctrlc = { workspace = true }
derive_more = {workspace = true, features = ["display"]}
derive_more = {workspace = true, features = ["display", "from"]}
fern = { workspace = true }
log = { workspace = true }
postcard = { workspace = true }

View File

@@ -1,6 +1,6 @@
use chrono::serde::ts_nanoseconds;
use chrono::{DateTime, Utc};
use derive_more::Display;
use derive_more::{Display, From};
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Serialize, Deserialize)]
@@ -16,10 +16,21 @@ pub enum SwitchBank {
B,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
#[derive(Clone, Debug, Serialize, Deserialize, From)]
pub enum TelemetryMessage {
SwitchState {
bank: SwitchBank,
switches: [bool; 16],
},
CommsState(CommsState),
}
#[derive(Clone, Debug, Default, Serialize, Deserialize)]
pub struct CommsState {
pub tx_packets: u32,
pub rx_packets: u32,
pub tx_bytes: u32,
pub rx_bytes: u32,
pub tx_errors: u32,
pub rx_errors: u32,
}

View File

@@ -8,11 +8,11 @@ use thiserror::Error;
#[derive(Error, Debug)]
pub enum UdpRecvPostcardError {
#[error("IO Error")]
#[error("IO Error: {0}")]
Io(#[from] std::io::Error),
#[error("Deserialization Error")]
#[error("Deserialization Error: {0}")]
Deserialization(#[from] postcard::Error),
#[error("Extra Data")]
#[error("Extra Data: {amount}")]
ExtraData { amount: usize },
#[error("No Data")]
NoData,
@@ -20,11 +20,11 @@ pub enum UdpRecvPostcardError {
#[derive(Error, Debug)]
pub enum UdpSendPostcardError {
#[error("IO Error")]
#[error("IO Error: {0}")]
Io(#[from] std::io::Error),
#[error("Serialization Error")]
#[error("Serialization Error: {0}")]
Serialization(#[from] postcard::Error),
#[error("Length Mismatch")]
#[error("Length Mismatch: {expected} expected. {actual} actual")]
LengthMismatch { expected: usize, actual: usize },
}
@@ -37,7 +37,7 @@ pub trait UdpSocketExt {
fn recv_postcard<'de, T: Deserialize<'de>>(
&self,
buffer: &'de mut [u8],
) -> Result<(T, SocketAddr), UdpRecvPostcardError>;
) -> Result<(T, SocketAddr, usize), UdpRecvPostcardError>;
/// Send a CBOR encoded message to an address using this socket
///
@@ -48,7 +48,7 @@ pub trait UdpSocketExt {
data: &T,
buffer: &mut [u8],
addr: A,
) -> Result<(), UdpSendPostcardError>;
) -> Result<usize, UdpSendPostcardError>;
/// Send a command message to an address using this socket
///
@@ -59,20 +59,20 @@ pub trait UdpSocketExt {
name: &str,
data: &T,
addr: A,
) -> Result<(), UdpSendPostcardError>;
) -> Result<usize, UdpSendPostcardError>;
}
fn recv_postcard_inner<'de, T: Deserialize<'de>>(
result: std::io::Result<(usize, SocketAddr)>,
buffer: &'de mut [u8],
) -> Result<(T, SocketAddr), UdpRecvPostcardError> {
) -> Result<(T, SocketAddr, usize), UdpRecvPostcardError> {
match result {
Ok((size, addr)) => match postcard::take_from_bytes::<T>(&buffer[..size]) {
Ok((res, rem)) => {
if !rem.is_empty() {
return Err(ExtraData { amount: rem.len() });
}
Ok((res, addr))
Ok((res, addr, size))
}
Err(err) => Err(err.into()),
},
@@ -86,7 +86,7 @@ fn recv_postcard_inner<'de, T: Deserialize<'de>>(
fn send_inner(
send_result: Result<usize, std::io::Error>,
expected_size: usize,
) -> Result<(), UdpSendPostcardError> {
) -> Result<usize, UdpSendPostcardError> {
match send_result {
Ok(size_sent) => {
if expected_size != size_sent {
@@ -95,7 +95,7 @@ fn send_inner(
actual: size_sent,
});
}
Ok(())
Ok(size_sent)
}
Err(e) => Err(e.into()),
}
@@ -105,7 +105,7 @@ impl UdpSocketExt for UdpSocket {
fn recv_postcard<'de, T: Deserialize<'de>>(
&self,
buffer: &'de mut [u8],
) -> Result<(T, SocketAddr), UdpRecvPostcardError> {
) -> Result<(T, SocketAddr, usize), UdpRecvPostcardError> {
recv_postcard_inner(self.recv_from(buffer), buffer)
}
@@ -114,7 +114,7 @@ impl UdpSocketExt for UdpSocket {
data: &T,
buffer: &mut [u8],
addr: A,
) -> Result<(), UdpSendPostcardError> {
) -> Result<usize, UdpSendPostcardError> {
let result = postcard::to_slice(data, buffer)?;
let size_encoded = result.len();
send_inner(self.send_to(result, addr), size_encoded)
@@ -125,7 +125,7 @@ impl UdpSocketExt for UdpSocket {
name: &str,
data: &T,
addr: A,
) -> Result<(), UdpSendPostcardError> {
) -> Result<usize, UdpSendPostcardError> {
let mut inner_buffer = [0u8; 512];
let inner_buffer = postcard::to_slice(data, &mut inner_buffer)?;
let mut buffer = [0u8; 512];
@@ -158,7 +158,7 @@ pub mod tokio {
fn recv_postcard<'de, T: Deserialize<'de>>(
&self,
buffer: &'de mut [u8],
) -> impl Future<Output = Result<(T, SocketAddr), UdpRecvPostcardError>>;
) -> impl Future<Output = Result<(T, SocketAddr, usize), UdpRecvPostcardError>>;
/// Send a CBOR encoded message to an address using this socket
///
@@ -169,7 +169,7 @@ pub mod tokio {
data: &T,
buffer: &mut [u8],
addr: A,
) -> impl Future<Output = Result<(), UdpSendPostcardError>>;
) -> impl Future<Output = Result<usize, UdpSendPostcardError>>;
/// Send a command message to an address using this socket
///
@@ -180,14 +180,14 @@ pub mod tokio {
name: &str,
data: &T,
addr: A,
) -> impl Future<Output = Result<(), UdpSendPostcardError>>;
) -> impl Future<Output = Result<usize, UdpSendPostcardError>>;
}
impl AsyncUdpSocketExt for UdpSocket {
async fn recv_postcard<'de, T: Deserialize<'de>>(
&self,
buffer: &'de mut [u8],
) -> Result<(T, SocketAddr), UdpRecvPostcardError> {
) -> Result<(T, SocketAddr, usize), UdpRecvPostcardError> {
recv_postcard_inner(self.recv_from(buffer).await, buffer)
}
@@ -196,7 +196,7 @@ pub mod tokio {
data: &T,
buffer: &mut [u8],
addr: A,
) -> Result<(), UdpSendPostcardError> {
) -> Result<usize, UdpSendPostcardError> {
let result = postcard::to_slice(data, buffer)?;
let size_encoded = result.len();
send_inner(self.send_to(result, addr).await, size_encoded)
@@ -207,7 +207,7 @@ pub mod tokio {
name: &str,
data: &T,
addr: A,
) -> Result<(), UdpSendPostcardError> {
) -> Result<usize, UdpSendPostcardError> {
let mut inner_buffer = [0u8; 512];
let inner_buffer = postcard::to_slice(data, &mut inner_buffer)?;
let mut buffer = [0u8; 512];