diff --git a/src/bin/dual-iir.rs b/src/bin/dual-iir.rs index 3b2b702..84ce8e2 100644 --- a/src/bin/dual-iir.rs +++ b/src/bin/dual-iir.rs @@ -40,7 +40,6 @@ use stabilizer::{ adc::{Adc0Input, Adc1Input, AdcCode}, afe::Gain, dac::{Dac0Output, Dac1Output, DacCode}, - design_parameters::DEFAULT_MQTT_BROKER, embedded_hal::digital::v2::InputPin, hal, signal_generator::{self, SignalGenerator}, @@ -48,6 +47,7 @@ use stabilizer::{ DigitalInput0, DigitalInput1, AFE0, AFE1, }, net::{ + self, data_stream::{FrameGenerator, StreamFormat, StreamTarget}, miniconf::Miniconf, serde::Deserialize, @@ -62,7 +62,7 @@ const SCALE: f32 = i16::MAX as _; const IIR_CASCADE_LENGTH: usize = 1; // The number of samples in each batch process -const SAMPLE_BUFFER_SIZE: usize = 8; +const BATCH_SIZE: usize = 8; // The logarithm of the number of 100MHz timer ticks between each sample. With a value of 2^7 = // 128, there is 1.28uS per sample, corresponding to a sampling frequency of 781.25 KHz. @@ -190,7 +190,7 @@ const APP: () = { let (mut stabilizer, _pounder) = hardware::setup::setup( c.core, c.device, - SAMPLE_BUFFER_SIZE, + BATCH_SIZE, 1 << SAMPLE_TICKS_LOG2, ); @@ -200,27 +200,11 @@ const APP: () = { stabilizer.cycle_counter, env!("CARGO_BIN_NAME"), stabilizer.net.mac_address, - option_env!("BROKER") - .and_then(|data| { - data.parse::().map_or_else( - |err| { - log::error!( - "{:?}: Failed to parse broker IP ({:?}) - Falling back to default", - err, - data - ); - None - }, - |ip| Some(ip), - ) - }) - .unwrap_or(DEFAULT_MQTT_BROKER.into()), + net::parse_or_default_broker(option_env!("BROKER")), ); - let generator = network.configure_streaming( - StreamFormat::AdcDacData, - SAMPLE_BUFFER_SIZE as u8, - ); + let generator = network + .configure_streaming(StreamFormat::AdcDacData, BATCH_SIZE as u8); // Spawn a settings update for default settings. c.spawn.settings_update().unwrap(); @@ -338,7 +322,7 @@ const APP: () = { } // Stream the data. - const N: usize = SAMPLE_BUFFER_SIZE * core::mem::size_of::(); + const N: usize = BATCH_SIZE * core::mem::size_of::(); generator.add::<_, { N * 4 }>(|buf| { for (data, buf) in adc_samples .iter() diff --git a/src/bin/lockin.rs b/src/bin/lockin.rs index 334aeab..5fd66b1 100644 --- a/src/bin/lockin.rs +++ b/src/bin/lockin.rs @@ -42,7 +42,6 @@ use stabilizer::{ adc::{Adc0Input, Adc1Input, AdcCode}, afe::Gain, dac::{Dac0Output, Dac1Output, DacCode}, - design_parameters::DEFAULT_MQTT_BROKER, embedded_hal::digital::v2::InputPin, hal, input_stamper::InputStamper, @@ -51,6 +50,7 @@ use stabilizer::{ DigitalInput0, DigitalInput1, AFE0, AFE1, }, net::{ + self, data_stream::{FrameGenerator, StreamFormat, StreamTarget}, miniconf::Miniconf, serde::Deserialize, @@ -61,7 +61,7 @@ use stabilizer::{ // The logarithm of the number of samples in each batch process. This corresponds with 2^3 samples // per batch = 8 samples -const SAMPLE_BUFFER_SIZE_LOG2: u8 = 3; +const BATCH_SIZE_SIZE_LOG2: u8 = 3; // The logarithm of the number of 100MHz timer ticks between each sample. This corresponds with a // sampling period of 2^7 = 128 ticks. At 100MHz, 10ns per tick, this corresponds to a sampling @@ -231,7 +231,7 @@ const APP: () = { let (mut stabilizer, _pounder) = hardware::setup::setup( c.core, c.device, - 1 << SAMPLE_BUFFER_SIZE_LOG2, + 1 << BATCH_SIZE_SIZE_LOG2, 1 << ADC_SAMPLE_TICKS_LOG2, ); @@ -241,31 +241,17 @@ const APP: () = { stabilizer.cycle_counter, env!("CARGO_BIN_NAME"), stabilizer.net.mac_address, - option_env!("BROKER") - .and_then(|data| { - data.parse::().map_or_else( - |err| { - log::error!( - "{:?}: Failed to parse broker IP ({:?}) - Falling back to default", - err, - data - ); - None - }, - |ip| Some(ip), - ) - }) - .unwrap_or(DEFAULT_MQTT_BROKER.into()), + net::parse_or_default_broker(option_env!("BROKER")), ); let generator = network.configure_streaming( StreamFormat::AdcDacData, - 1u8 << SAMPLE_BUFFER_SIZE_LOG2, + 1u8 << BATCH_SIZE_SIZE_LOG2, ); let settings = Settings::default(); - let pll = RPLL::new(ADC_SAMPLE_TICKS_LOG2 + SAMPLE_BUFFER_SIZE_LOG2); + let pll = RPLL::new(ADC_SAMPLE_TICKS_LOG2 + BATCH_SIZE_SIZE_LOG2); // Spawn a settings and telemetry update for default settings. c.spawn.settings_update().unwrap(); @@ -291,7 +277,7 @@ const APP: () = { let signal_config = { let frequency_tuning_word = - (1u64 << (32 - SAMPLE_BUFFER_SIZE_LOG2)) as u32; + (1u64 << (32 - BATCH_SIZE_SIZE_LOG2)) as u32; signal_generator::Config { // Same frequency as batch size. @@ -358,11 +344,11 @@ const APP: () = { settings.pll_tc[0], settings.pll_tc[1], ); - (pll_phase, (pll_frequency >> SAMPLE_BUFFER_SIZE_LOG2) as i32) + (pll_phase, (pll_frequency >> BATCH_SIZE_SIZE_LOG2) as i32) } LockinMode::Internal => { // Reference phase and frequency are known. - (1i32 << 30, 1i32 << (32 - SAMPLE_BUFFER_SIZE_LOG2)) + (1i32 << 30, 1i32 << (32 - BATCH_SIZE_SIZE_LOG2)) } }; @@ -417,7 +403,7 @@ const APP: () = { // Stream the data. const N: usize = - (1 << SAMPLE_BUFFER_SIZE_LOG2) * core::mem::size_of::(); + (1 << BATCH_SIZE_SIZE_LOG2) * core::mem::size_of::(); generator.add::<_, { N * 4 }>(|buf| { for (data, buf) in adc_samples .iter() diff --git a/src/hardware/design_parameters.rs b/src/hardware/design_parameters.rs index 2597d87..4884ed5 100644 --- a/src/hardware/design_parameters.rs +++ b/src/hardware/design_parameters.rs @@ -44,6 +44,3 @@ pub const DDS_SYNC_CLK_DIV: u8 = 4; pub const MAX_SAMPLE_BUFFER_SIZE: usize = 32; pub type SampleBuffer = [u16; MAX_SAMPLE_BUFFER_SIZE]; - -/// The default MQTT broker IP address if unspecified. -pub const DEFAULT_MQTT_BROKER: [u8; 4] = [10, 34, 16, 10]; diff --git a/src/net/mod.rs b/src/net/mod.rs index 2ca3b10..2e41695 100644 --- a/src/net/mod.rs +++ b/src/net/mod.rs @@ -33,6 +33,9 @@ use smoltcp_nal::embedded_nal::SocketAddr; pub type NetworkReference = shared::NetworkStackProxy<'static, NetworkStack>; +/// The default MQTT broker IP address if unspecified. +pub const DEFAULT_MQTT_BROKER: [u8; 4] = [10, 34, 16, 10]; + #[derive(Copy, Clone, PartialEq)] pub enum UpdateState { NoChange, @@ -205,3 +208,30 @@ pub fn get_device_prefix( prefix } + +/// Determine the broker IP address +/// +/// # Note +/// If the broker IP is unspecified or unparseable, the default IP is returned. +/// +/// # Args +/// * `input` - The optionally-specified command-line broker IP address as a string. +/// +/// # Returns +/// The broker IP address. +pub fn parse_or_default_broker(input: Option<&str>) -> IpAddr { + input.and_then(|data| { + data.parse::().map_or_else( + |err| { + log::error!( + "{:?}: Failed to parse broker IP ({:?}) - Falling back to default", + err, + data + ); + None + }, + Some, + ) + }) + .unwrap_or_else(|| DEFAULT_MQTT_BROKER.into()) +}