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

@@ -4,7 +4,7 @@ use futures::TryFutureExt;
use futures::future::join_all;
use log::{error, trace};
use nautilus_common::on_drop::on_drop;
use nautilus_common::telemetry::{SwitchBank, Telemetry, TelemetryMessage};
use nautilus_common::telemetry::{CommsState, SwitchBank, Telemetry, TelemetryMessage};
use nautilus_common::udp::UdpRecvPostcardError;
use nautilus_common::udp::tokio::AsyncUdpSocketExt;
use std::net::SocketAddr;
@@ -12,7 +12,7 @@ use std::sync::Arc;
use tokio::net::UdpSocket;
use tokio::sync::{RwLock, RwLockWriteGuard};
use tokio::task::yield_now;
use tokio::{join, pin, select};
use tokio::{join, pin, select, try_join};
use tokio_util::sync::CancellationToken;
pub struct TelemetryHandler<'a> {
@@ -61,7 +61,7 @@ impl<'a> TelemetryHandler<'a> {
() = self.cancel.cancelled() => {},
incoming = self.udp.recv_postcard::<Telemetry>(&mut buffer) => {
match incoming {
Ok((tlm, addr)) => {
Ok((tlm, addr, _)) => {
trace!("{tlm:?}");
let flight_addr_update = async {
@@ -107,16 +107,38 @@ impl<'a> TelemetryHandler<'a> {
struct TelemetryContext {
bank_a: Vec<TelemetryHandle<bool>>,
bank_b: Vec<TelemetryHandle<bool>>,
tx_packets: TelemetryHandle<u32>,
rx_packets: TelemetryHandle<u32>,
tx_bytes: TelemetryHandle<u32>,
rx_bytes: TelemetryHandle<u32>,
tx_errors: TelemetryHandle<u32>,
rx_errors: TelemetryHandle<u32>,
}
impl TelemetryContext {
async fn new(tlm: &TelemetryHandler<'_>) -> Self {
let bank_a =
join_all((0..16).map(|i| tlm.tlm.register::<bool>(format!("switch.bank_a.{i}")))).await;
join_all((0..16).map(|i| tlm.tlm.register(format!("switch.bank_a.{i}")))).await;
let bank_b =
join_all((0..16).map(|i| tlm.tlm.register::<bool>(format!("switch.bank_b.{i}")))).await;
join_all((0..16).map(|i| tlm.tlm.register(format!("switch.bank_b.{i}")))).await;
Self { bank_a, bank_b }
let tx_packets = tlm.tlm.register("comms.tx_packets").await;
let rx_packets = tlm.tlm.register("comms.rx_packets").await;
let tx_bytes = tlm.tlm.register("comms.tx_bytes").await;
let rx_bytes = tlm.tlm.register("comms.rx_bytes").await;
let tx_errors = tlm.tlm.register("comms.tx_errors").await;
let rx_errors = tlm.tlm.register("comms.rx_errors").await;
Self {
bank_a,
bank_b,
tx_packets,
rx_packets,
tx_bytes,
rx_bytes,
tx_errors,
rx_errors,
}
}
async fn step(&mut self, tlm: Telemetry) {
@@ -137,6 +159,25 @@ impl TelemetryContext {
}))
.await;
}
TelemetryMessage::CommsState(CommsState {
tx_packets,
rx_packets,
tx_bytes,
rx_bytes,
tx_errors,
rx_errors,
}) => {
if let Err(e) = try_join!(
self.tx_packets.publish(tx_packets, tlm.timestamp),
self.rx_packets.publish(rx_packets, tlm.timestamp),
self.tx_bytes.publish(tx_bytes, tlm.timestamp),
self.rx_bytes.publish(rx_bytes, tlm.timestamp),
self.tx_errors.publish(tx_errors, tlm.timestamp),
self.rx_errors.publish(rx_errors, tlm.timestamp),
) {
error!("Failed to publish comms telemetry: {e}");
}
}
}
}
}