Allowing target to be runtime configurable

master
Ryan Summers 2021-06-09 15:25:59 +02:00
parent b5fdb31a02
commit 92c84a6bfe
2 changed files with 51 additions and 6 deletions

View File

@ -18,7 +18,7 @@ use stabilizer::{
DigitalInput0, DigitalInput1, AFE0, AFE1, DigitalInput0, DigitalInput1, AFE0, AFE1,
}, },
net::{ net::{
data_stream::BlockGenerator, data_stream::{BlockGenerator, StreamTarget},
miniconf::Miniconf, miniconf::Miniconf,
serde::Deserialize, serde::Deserialize,
telemetry::{Telemetry, TelemetryBuffer}, telemetry::{Telemetry, TelemetryBuffer},
@ -38,6 +38,7 @@ pub struct Settings {
allow_hold: bool, allow_hold: bool,
force_hold: bool, force_hold: bool,
telemetry_period: u16, telemetry_period: u16,
stream_target: StreamTarget,
} }
impl Default for Settings { impl Default for Settings {
@ -57,6 +58,8 @@ impl Default for Settings {
force_hold: false, force_hold: false,
// The default telemetry period in seconds. // The default telemetry period in seconds.
telemetry_period: 10, telemetry_period: 10,
stream_target: StreamTarget::default(),
} }
} }
} }
@ -92,10 +95,12 @@ const APP: () = {
stabilizer.net.mac_address, stabilizer.net.mac_address,
); );
// TODO: Remove unwrap. let generator = {
let remote: smoltcp_nal::embedded_nal::SocketAddr = use smoltcp_nal::embedded_nal::{IpAddr, Ipv4Addr, SocketAddr};
"10.35.16.10:1111".parse().unwrap(); let remote =
let generator = network.enable_streaming(remote.into()); SocketAddr::new(IpAddr::V4(Ipv4Addr::unspecified()), 0);
network.enable_streaming(remote.into())
};
// Spawn a settings update for default settings. // Spawn a settings update for default settings.
c.spawn.settings_update().unwrap(); c.spawn.settings_update().unwrap();
@ -229,6 +234,9 @@ const APP: () = {
// Update AFEs // Update AFEs
c.resources.afes.0.set_gain(settings.afe[0]); c.resources.afes.0.set_gain(settings.afe[0]);
c.resources.afes.1.set_gain(settings.afe[1]); c.resources.afes.1.set_gain(settings.afe[1]);
let target = settings.stream_target.into();
c.resources.network.direct_stream(target);
} }
#[task(priority = 1, resources=[network, settings, telemetry], schedule=[telemetry])] #[task(priority = 1, resources=[network, settings, telemetry], schedule=[telemetry])]

View File

@ -1,6 +1,8 @@
use core::borrow::BorrowMut; use core::borrow::BorrowMut;
use heapless::spsc::{Consumer, Producer, Queue}; use heapless::spsc::{Consumer, Producer, Queue};
use smoltcp_nal::embedded_nal::{SocketAddr, UdpClientStack}; use miniconf::MiniconfAtomic;
use serde::Deserialize;
use smoltcp_nal::embedded_nal::{IpAddr, Ipv4Addr, SocketAddr, UdpClientStack};
use super::NetworkReference; use super::NetworkReference;
use crate::hardware::design_parameters::SAMPLE_BUFFER_SIZE; use crate::hardware::design_parameters::SAMPLE_BUFFER_SIZE;
@ -14,6 +16,32 @@ const BLOCK_BUFFER_SIZE: usize = 30;
const SUBSAMPLE_RATE: usize = 1; const SUBSAMPLE_RATE: usize = 1;
#[derive(Copy, Clone, Debug, MiniconfAtomic, Deserialize)]
pub struct StreamTarget {
pub ip: [u8; 4],
pub port: u16,
}
impl Default for StreamTarget {
fn default() -> Self {
Self {
ip: [0; 4],
port: 0,
}
}
}
impl Into<SocketAddr> for StreamTarget {
fn into(self) -> SocketAddr {
SocketAddr::new(
IpAddr::V4(Ipv4Addr::new(
self.ip[0], self.ip[1], self.ip[2], self.ip[3],
)),
self.port,
)
}
}
pub fn setup_streaming( pub fn setup_streaming(
stack: NetworkReference, stack: NetworkReference,
) -> (BlockGenerator, DataStream) { ) -> (BlockGenerator, DataStream) {
@ -208,6 +236,15 @@ impl DataStream {
self.close(); self.close();
} }
// If the remote address is unspecified, just close the existing socket.
if remote.ip().is_unspecified() {
if self.socket.is_some() {
self.close();
}
return Err(());
}
let mut socket = self.stack.socket().map_err(|err| match err { let mut socket = self.stack.socket().map_err(|err| match err {
<NetworkReference as UdpClientStack>::Error::NoIpAddress => (), <NetworkReference as UdpClientStack>::Error::NoIpAddress => (),
_ => (), _ => (),