improved integration with telem viz
This commit is contained in:
@@ -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 }
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
|
||||
@@ -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];
|
||||
|
||||
Reference in New Issue
Block a user