Allowing pounder to not be present

This commit is contained in:
Ryan Summers 2020-06-20 16:43:07 +02:00
parent a3f5dbeae7
commit c6859d956e
2 changed files with 75 additions and 36 deletions

View File

@ -180,7 +180,7 @@ const APP: () = {
eth_mac: ethernet::EthernetMAC, eth_mac: ethernet::EthernetMAC,
mac_addr: net::wire::EthernetAddress, mac_addr: net::wire::EthernetAddress,
pounder: pounder::PounderDevices<asm_delay::AsmDelay>, pounder: Option<pounder::PounderDevices<asm_delay::AsmDelay>>,
#[init([[0.; 5]; 2])] #[init([[0.; 5]; 2])]
iir_state: [iir::IIRState; 2], iir_state: [iir::IIRState; 2],
@ -376,7 +376,18 @@ const APP: () = {
fp_led_2.set_low().unwrap(); fp_led_2.set_low().unwrap();
fp_led_3.set_low().unwrap(); fp_led_3.set_low().unwrap();
let pounder_devices = { // Attempt to instantiate the I2C GPIO expander on pounder.
let pounder_gpio_expander = {
let sda = gpiob.pb7.into_alternate_af4().set_open_drain();
let scl = gpiob.pb8.into_alternate_af4().set_open_drain();
let i2c1 = dp.I2C1.i2c((scl, sda), 100.khz(), &clocks);
mcp23017::MCP23017::default(i2c1)
};
// If instantiating the GPIO expander was successful, we were able to communicate with the
// IO expander and pounder is available. If the GPIO expander did not communicate with I2C,
// we will assume that pounder is not available.
let pounder_devices = if let Ok(io_expander) = pounder_gpio_expander {
let ad9959 = { let ad9959 = {
let qspi_interface = { let qspi_interface = {
// Instantiate the QUADSPI pins and peripheral interface. // Instantiate the QUADSPI pins and peripheral interface.
@ -435,13 +446,6 @@ const APP: () = {
.unwrap() .unwrap()
}; };
let io_expander = {
let sda = gpiob.pb7.into_alternate_af4().set_open_drain();
let scl = gpiob.pb8.into_alternate_af4().set_open_drain();
let i2c1 = dp.I2C1.i2c((scl, sda), 100.khz(), &clocks);
mcp23017::MCP23017::default(i2c1).unwrap()
};
let spi = { let spi = {
let spi_mosi = gpiod let spi_mosi = gpiod
.pd7 .pd7
@ -489,16 +493,20 @@ const APP: () = {
let adc1_in_p = gpiof.pf11.into_analog(); let adc1_in_p = gpiof.pf11.into_analog();
let adc2_in_p = gpiof.pf14.into_analog(); let adc2_in_p = gpiof.pf14.into_analog();
pounder::PounderDevices::new( Some(
io_expander, pounder::PounderDevices::new(
ad9959, io_expander,
spi, ad9959,
adc1, spi,
adc2, adc1,
adc1_in_p, adc2,
adc2_in_p, adc1_in_p,
adc2_in_p,
)
.unwrap(),
) )
.unwrap() } else {
None
}; };
let mut eeprom_i2c = { let mut eeprom_i2c = {
@ -746,23 +754,38 @@ const APP: () = {
"stabilizer/afe1/gain": (|| c.resources.afe1.get_gain()), "stabilizer/afe1/gain": (|| c.resources.afe1.get_gain()),
"stabilizer/afe2/gain": (|| c.resources.afe2.get_gain()), "stabilizer/afe2/gain": (|| c.resources.afe2.get_gain()),
"pounder/in0": (|| { "pounder/in0": (|| {
c.resources.pounder.get_input_channel_state( match c.resources.pounder {
pounder::Channel::In0) Some(pounder) =>
pounder.get_input_channel_state(pounder::Channel::In0),
_ => Err(pounder::Error::Access),
}
}), }),
"pounder/in1": (|| { "pounder/in1": (|| {
c.resources.pounder.get_input_channel_state( match c.resources.pounder {
pounder::Channel::In1) Some(pounder) =>
pounder.get_input_channel_state(pounder::Channel::In1),
_ => Err(pounder::Error::Access),
}
}), }),
"pounder/out0": (|| { "pounder/out0": (|| {
c.resources.pounder.get_output_channel_state( match c.resources.pounder {
pounder::Channel::Out0) Some(pounder) =>
pounder.get_output_channel_state(pounder::Channel::Out0),
_ => Err(pounder::Error::Access),
}
}), }),
"pounder/out1": (|| { "pounder/out1": (|| {
c.resources.pounder.get_output_channel_state( match c.resources.pounder {
pounder::Channel::Out1) Some(pounder) =>
pounder.get_output_channel_state(pounder::Channel::Out1),
_ => Err(pounder::Error::Access),
}
}), }),
"pounder/dds/clock": (|| { "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 +813,38 @@ const APP: () = {
}) })
}), }),
"pounder/in0": pounder::ChannelState, (|state| { "pounder/in0": pounder::ChannelState, (|state| {
c.resources.pounder.set_channel_state(pounder::Channel::In0, match c.resources.pounder {
state) Some(pounder) =>
pounder.set_channel_state(pounder::Channel::In0, state),
_ => Err(pounder::Error::Access),
}
}), }),
"pounder/in1": pounder::ChannelState, (|state| { "pounder/in1": pounder::ChannelState, (|state| {
c.resources.pounder.set_channel_state(pounder::Channel::In1, match c.resources.pounder {
state) Some(pounder) =>
pounder.set_channel_state(pounder::Channel::In1, state),
_ => Err(pounder::Error::Access),
}
}), }),
"pounder/out0": pounder::ChannelState, (|state| { "pounder/out0": pounder::ChannelState, (|state| {
c.resources.pounder.set_channel_state(pounder::Channel::Out0, match c.resources.pounder {
state) Some(pounder) =>
pounder.set_channel_state(pounder::Channel::Out0, state),
_ => Err(pounder::Error::Access),
}
}), }),
"pounder/out1": pounder::ChannelState, (|state| { "pounder/out1": pounder::ChannelState, (|state| {
c.resources.pounder.set_channel_state(pounder::Channel::Out1, match c.resources.pounder {
state) Some(pounder) =>
pounder.set_channel_state(pounder::Channel::Out1, state),
_ => Err(pounder::Error::Access),
}
}), }),
"pounder/dds/clock": pounder::DdsClockConfig, (|config| { "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| { "stabilizer/afe1/gain": afe::Gain, (|gain| {
Ok::<(), ()>(c.resources.afe1.set_gain(gain)) Ok::<(), ()>(c.resources.afe1.set_gain(gain))

View File

@ -29,6 +29,7 @@ pub enum Error {
InvalidAddress, InvalidAddress,
InvalidChannel, InvalidChannel,
Adc, Adc,
Access,
} }
#[derive(Debug, Copy, Clone)] #[derive(Debug, Copy, Clone)]