#![cfg(all(feature = "stm32f405", feature = "airb_omnibus_f4"))]
#![allow(unused)]
#![allow(clippy::similar_names)]
use crate::{
barometer_sensors::Barometer,
boards::board::{Board, BoardInit, BoardInitError},
gps::GpsParser,
magnetometer_sensors::Magnetometer,
optical_flow_sensors::OpticalFlow,
rangefinder_sensors::Rangefinder,
};
use imu_sensors::{ImuAxisOrder, ImuSpiBus, Mpu6050}; use motor_mixers::{MotorDriver, MotorDriverQuadDshot, MotorDriverQuadPwm};
use embassy_stm32::{
bind_interrupts, dma,
gpio::{Input, Level, Output, OutputType::PushPull, Pull, Speed},
i2c::{Config as I2cConfig, I2c},
mode::Async,
peripherals,
spi::{Config as SpiConfig, Spi, mode::Master},
time::Hertz,
timer::{
low_level::CountingMode,
simple_pwm::{PwmPin, SimplePwm},
},
usart::{self, Config as UsartConfig, Uart, UartRx},
};
use embassy_time::Delay;
use embedded_hal_bus::spi::ExclusiveDevice;
use radio_controllers::Radio;
type BoardSpi =
ExclusiveDevice<Spi<'static, embassy_stm32::mode::Async, embassy_stm32::spi::mode::Master>, Output<'static>, Delay>;
pub type BoardImu = Mpu6050<ImuSpiBus<BoardSpi>>;
pub fn board_hardware(init: BoardInit) -> Result<Board<BoardImu>, BoardInitError> {
let peripherals = embassy_stm32::init(Default::default());
let spi1_sck = peripherals.PA5;
let spi1_sdi = peripherals.PA6;
let spi1_sdo = peripherals.PA7;
let spi1_tx_dma = peripherals.DMA2_CH3;
let spi1_rx_dma = peripherals.DMA2_CH2;
let gyro1_spi_cs = peripherals.PA4;
let gyro1_exti = peripherals.PC4;
let spi3_sck = peripherals.PC10;
let spi3_sdi = peripherals.PC11;
let spi3_sdo = peripherals.PC12;
let max7456_spi_cs = peripherals.PA15;
let flash_spi_cs = peripherals.PB3;
let i2c1_scl = peripherals.PB8;
let i2c1_sda = peripherals.PB9;
let uart1_tx = peripherals.PA9;
let uart1_rx = peripherals.PA10;
let uart3_tx = peripherals.PB10;
let uart3_rx = peripherals.PB11;
let uart3 = {
let mut config = embassy_stm32::usart::Config::default();
config.baudrate = 115_200;
Uart::new_blocking(peripherals.USART3, uart3_rx, uart3_tx, config)
};
let spi1 = {
let mut config = SpiConfig::default();
config.frequency = embassy_stm32::time::Hertz(10_000_000);
let spi_bus = Spi::new(peripherals.SPI1, spi1_sck, spi1_sdo, spi1_sdi, spi1_tx_dma, spi1_rx_dma, Irqs, config);
let cs_output = Output::new(gyro1_spi_cs, Level::High, Speed::VeryHigh);
ExclusiveDevice::new(spi_bus, cs_output, Delay).unwrap()
};
let mut imu: BoardImu = Mpu6050::new(ImuSpiBus::new(spi1), init.axis_order);
let pwm1 = peripherals.PB14; let pwm2 = peripherals.PB15; let pwm3 = peripherals.PC6; let pwm4 = peripherals.PC7; let pwm5 = peripherals.PC8; let pwm6 = peripherals.PC9;
let pwm_m1_m2 = SimplePwm::new(
peripherals.TIM12,
Some(PwmPin::new(pwm1, PushPull)),
Some(PwmPin::new(pwm2, PushPull)),
None,
None,
Hertz(400),
CountingMode::EdgeAlignedUp,
);
let pwm_m3_m4_m5_m6 = SimplePwm::new(
peripherals.TIM8,
Some(PwmPin::new(pwm3, PushPull)),
Some(PwmPin::new(pwm4, PushPull)),
Some(PwmPin::new(pwm5, PushPull)),
Some(PwmPin::new(pwm6, PushPull)),
Hertz(400),
CountingMode::EdgeAlignedUp,
);
let motor_driver_quad_pwm = MotorDriverQuadPwm::new(pwm_m3_m4_m5_m6);
let motor_driver = MotorDriver::QuadPwm(motor_driver_quad_pwm);
let radio = Radio::new(radio_controllers::RadioType::Mock);
let barometer = Barometer::new(init.barometer_type);
let magnetometer = Magnetometer::new(init.magnetometer_type);
let gps_parser = GpsParser::new(init.gps_provider);
let rangefinder = Rangefinder::new(init.rangefinder_type);
let optical_flow = OpticalFlow::new(init.optical_flow_type);
Ok(Board {
imu,
motor_driver,
radio,
sdcard_spi: None,
max7456_spi: None,
msp_uart: None,
esc_sensor_uart: None,
sensors_i2c: None,
barometer,
magnetometer,
gps_parser,
rangefinder,
optical_flow,
})
}
bind_interrupts!(struct Irqs {
DMA2_STREAM2 => dma::InterruptHandler<peripherals::DMA2_CH2>;
DMA2_STREAM3 => dma::InterruptHandler<peripherals::DMA2_CH3>;
});