diff --git a/src/main.rs b/src/main.rs index 722f554..3af98f5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -33,7 +33,7 @@ use rtic::cyccnt::{Instant, U32Ext}; use stm32h7xx_hal as hal; use stm32h7xx_hal::prelude::*; -use embedded_hal::digital::v2::OutputPin; +use embedded_hal::digital::v2::{InputPin, OutputPin}; use smoltcp as net; use stm32h7_ethernet as ethernet; @@ -171,6 +171,18 @@ const APP: () = { eeprom_i2c: hal::i2c::I2c, timer: hal::timer::Timer, + + // Note: It appears that rustfmt generates a format that GDB cannot recognize, which + // results in GDB breakpoints being set improperly. To debug, redefine the following + // definition to: + // + // ```rust + // net_interface: net::iface::EthernetInterface< + // 'static, + // 'static, + // 'static, + // ethernet::EthernetDMA<'static>>, + // ``` net_interface: net::iface::EthernetInterface< 'static, 'static, @@ -180,7 +192,7 @@ const APP: () = { eth_mac: ethernet::EthernetMAC, mac_addr: net::wire::EthernetAddress, - pounder: pounder::PounderDevices, + pounder: Option>, #[init([[0.; 5]; 2])] iir_state: [iir::IIRState; 2], @@ -198,8 +210,7 @@ const APP: () = { let rcc = dp.RCC.constrain(); let mut clocks = rcc - //TODO: Re-enable HSE for Stabilizer platform. - // .use_hse(8.mhz()) + .use_hse(8.mhz()) .sysclk(400.mhz()) .hclk(200.mhz()) .per_ck(100.mhz()) @@ -376,7 +387,10 @@ const APP: () = { fp_led_2.set_low().unwrap(); fp_led_3.set_low().unwrap(); - let pounder_devices = { + // Measure the Pounder PGOOD output to detect if pounder is present on Stabilizer. + let pounder_pgood = gpiob.pb13.into_pull_down_input(); + delay.delay_ms(2u8); + let pounder_devices = if pounder_pgood.is_high().unwrap() { let ad9959 = { let qspi_interface = { // Instantiate the QUADSPI pins and peripheral interface. @@ -489,16 +503,20 @@ const APP: () = { let adc1_in_p = gpiof.pf11.into_analog(); let adc2_in_p = gpiof.pf14.into_analog(); - pounder::PounderDevices::new( - io_expander, - ad9959, - spi, - adc1, - adc2, - adc1_in_p, - adc2_in_p, + Some( + pounder::PounderDevices::new( + io_expander, + ad9959, + spi, + adc1, + adc2, + adc1_in_p, + adc2_in_p, + ) + .unwrap(), ) - .unwrap() + } else { + None }; let mut eeprom_i2c = { @@ -746,23 +764,38 @@ const APP: () = { "stabilizer/afe1/gain": (|| c.resources.afe1.get_gain()), "stabilizer/afe2/gain": (|| c.resources.afe2.get_gain()), "pounder/in0": (|| { - c.resources.pounder.get_input_channel_state( - pounder::Channel::In0) + match c.resources.pounder { + Some(pounder) => + pounder.get_input_channel_state(pounder::Channel::In0), + _ => Err(pounder::Error::Access), + } }), "pounder/in1": (|| { - c.resources.pounder.get_input_channel_state( - pounder::Channel::In1) + match c.resources.pounder { + Some(pounder) => + pounder.get_input_channel_state(pounder::Channel::In1), + _ => Err(pounder::Error::Access), + } }), "pounder/out0": (|| { - c.resources.pounder.get_output_channel_state( - pounder::Channel::Out0) + match c.resources.pounder { + Some(pounder) => + pounder.get_output_channel_state(pounder::Channel::Out0), + _ => Err(pounder::Error::Access), + } }), "pounder/out1": (|| { - c.resources.pounder.get_output_channel_state( - pounder::Channel::Out1) + match c.resources.pounder { + Some(pounder) => + pounder.get_output_channel_state(pounder::Channel::Out1), + _ => Err(pounder::Error::Access), + } }), "pounder/dds/clock": (|| { - c.resources.pounder.get_dds_clock_config() + match c.resources.pounder { + Some(pounder) => pounder.get_dds_clock_config(), + _ => Err(pounder::Error::Access), + } }) ], @@ -790,23 +823,38 @@ const APP: () = { }) }), "pounder/in0": pounder::ChannelState, (|state| { - c.resources.pounder.set_channel_state(pounder::Channel::In0, - state) + match c.resources.pounder { + Some(pounder) => + pounder.set_channel_state(pounder::Channel::In0, state), + _ => Err(pounder::Error::Access), + } }), "pounder/in1": pounder::ChannelState, (|state| { - c.resources.pounder.set_channel_state(pounder::Channel::In1, - state) + match c.resources.pounder { + Some(pounder) => + pounder.set_channel_state(pounder::Channel::In1, state), + _ => Err(pounder::Error::Access), + } }), "pounder/out0": pounder::ChannelState, (|state| { - c.resources.pounder.set_channel_state(pounder::Channel::Out0, - state) + match c.resources.pounder { + Some(pounder) => + pounder.set_channel_state(pounder::Channel::Out0, state), + _ => Err(pounder::Error::Access), + } }), "pounder/out1": pounder::ChannelState, (|state| { - c.resources.pounder.set_channel_state(pounder::Channel::Out1, - state) + match c.resources.pounder { + Some(pounder) => + pounder.set_channel_state(pounder::Channel::Out1, state), + _ => Err(pounder::Error::Access), + } }), "pounder/dds/clock": pounder::DdsClockConfig, (|config| { - c.resources.pounder.configure_dds_clock(config) + match c.resources.pounder { + Some(pounder) => pounder.configure_dds_clock(config), + _ => Err(pounder::Error::Access), + } }), "stabilizer/afe1/gain": afe::Gain, (|gain| { Ok::<(), ()>(c.resources.afe1.set_gain(gain)) diff --git a/src/pounder/mod.rs b/src/pounder/mod.rs index c89c6cc..1288765 100644 --- a/src/pounder/mod.rs +++ b/src/pounder/mod.rs @@ -29,6 +29,7 @@ pub enum Error { InvalidAddress, InvalidChannel, Adc, + Access, } #[derive(Debug, Copy, Clone)]