initial comms
This commit is contained in:
50
ground/src/lib.rs
Normal file
50
ground/src/lib.rs
Normal file
@@ -0,0 +1,50 @@
|
||||
use anyhow::Result;
|
||||
use log::{error, info};
|
||||
use nautilus_common::add_ctrlc_handler;
|
||||
use nautilus_common::command::Command;
|
||||
use nautilus_common::telemetry::Telemetry;
|
||||
use nautilus_common::udp::{UdpRecvCborError, UdpSocketExt};
|
||||
use std::io::Cursor;
|
||||
use std::net::{IpAddr, Ipv4Addr, SocketAddr, UdpSocket};
|
||||
use std::sync::atomic::{AtomicBool, Ordering};
|
||||
use std::sync::Arc;
|
||||
use std::time::Duration;
|
||||
|
||||
pub fn run() -> Result<()> {
|
||||
info!(
|
||||
"Project Nautilus Ground Software {}",
|
||||
env!("CARGO_PKG_VERSION")
|
||||
);
|
||||
|
||||
let running = Arc::new(AtomicBool::new(true));
|
||||
|
||||
add_ctrlc_handler(running.clone())?;
|
||||
|
||||
let mut flight_addr = None;
|
||||
let bind_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::UNSPECIFIED), 14000);
|
||||
let udp = UdpSocket::bind(bind_addr)?;
|
||||
udp.set_read_timeout(Some(Duration::from_millis(100)))?;
|
||||
|
||||
let mut buffer = Cursor::new([0u8; 512]);
|
||||
while running.load(Ordering::Relaxed) {
|
||||
match udp.recv_cbor::<Telemetry, _>(&mut buffer) {
|
||||
Ok((tlm, addr)) => {
|
||||
flight_addr = Some(addr);
|
||||
info!("{tlm:?}");
|
||||
}
|
||||
Err(UdpRecvCborError::NoData) => {
|
||||
// NoOp
|
||||
}
|
||||
Err(err) => {
|
||||
error!("Rx error: {err}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if let Some(flight_addr) = flight_addr {
|
||||
let cmd = Command::Shutdown;
|
||||
udp.send_cbor(&cmd, &mut buffer, &flight_addr)?;
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
Reference in New Issue
Block a user