use embassy_executor::Spawner;
use crate::{
boards::{BoardInit, board_hardware},
config::GLOBAL_CONFIG,
};
#[allow(unused)]
#[allow(clippy::too_many_lines)]
pub async fn init(spawner: Spawner) {
use crate::tasks;
#[cfg(feature = "std")]
env_logger::init();
#[cfg(feature = "serde")]
crate::non_volatile_storage::load_global_configs().await;
let config = GLOBAL_CONFIG.lock().await;
let board_init = BoardInit {
axis_order: config.imu_device.axis_order,
radio_type: config.rx.serial_rx_provider,
#[cfg(feature = "barometer")]
barometer_type: config.barometer.hardware,
#[cfg(not(feature = "barometer"))]
barometer_type: crate::barometer_sensors::BarometerType::NoBarometer,
#[cfg(feature = "magnetometer")]
magnetometer_type: config.magnetometer.hardware,
#[cfg(not(feature = "magnetometer"))]
magnetometer_type: crate::magnetometer_sensors::MagnetometerType::NoMagnetometer,
#[cfg(feature = "rangefinder")]
rangefinder_type: config.rangefinder.hardware,
#[cfg(not(feature = "rangefinder"))]
rangefinder_type: crate::rangefinder_sensors::RangefinderType::NoRangefinder,
#[cfg(feature = "optical_flow")]
optical_flow_type: config.optical_flow.hardware,
#[cfg(not(feature = "optical_flow"))]
optical_flow_type: crate::optical_flow_sensors::OpticalFlowType::NoOpticalFlow,
};
#[allow(clippy::panic)]
let Ok(hardware) = board_hardware(board_init) else {
panic!("board_init failed");
};
#[cfg(any(feature = "osd", feature = "cms"))]
let display_port_mutex = crate::display::display_port_mutex_init();
#[rustfmt::skip]
let gyro_pid_ctx = tasks::gyro_pid::init(
hardware.imu,
config.imu_filter_bank,
#[cfg(feature = "rpm_filters")] config.rpm_notch_filter_bank,
#[cfg(feature = "rpm_filters")] 0.001,
);
#[rustfmt::skip]
let motor_mixer_ctx = tasks::motor_mixer::init(
config.mixer,
config.motor,
hardware.motor_driver,
#[cfg(feature = "rpm_filters")] config.rpm_notch_filter_bank,
#[cfg(feature = "rpm_filters")] 0.001
);
let rx_ctx = tasks::rx::init(hardware.radio, config.rates);
#[cfg(feature = "msp")]
let msp_ctx = Some(tasks::msp::init());
#[cfg(feature = "blackbox")]
let blackbox_encoder_ctx = tasks::blackbox_encoder::init(config.blackbox);
#[cfg(feature = "blackbox")]
let blackbox_writer_ctx = Some(tasks::blackbox_writer::init());
#[cfg(feature = "autopilot")]
let autopilot_ctx = tasks::autopilot::init();
#[cfg(feature = "barometer")]
let barometer_ctx = hardware.barometer.map(tasks::barometer::init);
#[cfg(feature = "battery")]
let battery_ctx = Some(tasks::battery::init());
#[cfg(feature = "gps")]
let gps_ctx = hardware.gps.map(|gps| tasks::gps::init(gps.uart_rx, gps.uart_tx, config.gps.provider));
#[cfg(feature = "magnetometer")]
let magnetometer_ctx = hardware.magnetometer.map(tasks::magnetometer::init);
#[cfg(feature = "optical_flow")]
let optical_flow_ctx = hardware.optical_flow.map(tasks::optical_flow::init);
#[cfg(feature = "osd")]
let osd_ctx = Some(tasks::osd::init(display_port_mutex).await);
#[cfg(feature = "rangefinder")]
let rangefinder_ctx = hardware.rangefinder.map(tasks::rangefinder::init);
drop(config);
#[rustfmt::skip]
let realtime_spawner = {
#[cfg(feature = "realtime_executor")] { crate::boards::start_realtime_executor() }
#[cfg(not(feature = "realtime_executor"))] { spawner.make_send() }
};
#[rustfmt::skip]
let gyro_pid_spawner = {
#[cfg(feature = "multicore")] { crate::boards::start_core1_executor() }
#[cfg(not(feature = "multicore"))] { realtime_spawner }
};
#[allow(clippy::expect_used)]
{
gyro_pid_spawner.spawn(tasks::gyro_pid::run(gyro_pid_ctx).expect("Failed to create GYRO PID task"));
realtime_spawner.spawn(tasks::motor_mixer::run(motor_mixer_ctx).expect("Failed to create MOTOR MIXER task"));
realtime_spawner.spawn(tasks::rx::run(rx_ctx).expect("Failed to create RX task"));
}
#[cfg(feature = "blackbox")]
{
if let Some(blackbox_writer_ctx) = blackbox_writer_ctx
&& let Ok(blackbox_encoder_task) = tasks::blackbox_encoder::run(blackbox_encoder_ctx)
&& let Ok(blackbox_writer_task) = tasks::blackbox_writer::run(blackbox_writer_ctx)
{
realtime_spawner.spawn(blackbox_encoder_task);
spawner.spawn(blackbox_writer_task);
}
}
#[cfg(feature = "autopilot")]
if let Ok(autopilot_task) = tasks::autopilot::run(autopilot_ctx) {
spawner.spawn(autopilot_task);
}
#[cfg(feature = "barometer")]
if let Some(barometer_ctx) = barometer_ctx
&& let Ok(barometer_task) = tasks::barometer::run(barometer_ctx)
{
spawner.spawn(barometer_task);
}
#[cfg(feature = "battery")]
if let Some(battery_ctx) = battery_ctx
&& let Ok(battery_task) = tasks::battery::run(battery_ctx)
{
spawner.spawn(battery_task);
}
#[cfg(feature = "gps")]
if let Some(gps_ctx) = gps_ctx
&& let Ok(gps_task) = tasks::gps::run(gps_ctx)
{
spawner.spawn(gps_task);
}
#[cfg(feature = "magnetometer")]
if let Some(magnetometer_ctx) = magnetometer_ctx
&& let Ok(magnetometer_task) = tasks::magnetometer::run(magnetometer_ctx)
{
spawner.spawn(magnetometer_task);
}
#[cfg(feature = "msp")]
if let Some(msp_ctx) = msp_ctx
&& let Ok(msp_task) = tasks::msp::run(msp_ctx)
{
spawner.spawn(msp_task);
}
#[cfg(feature = "optical_flow")]
if let Some(optical_flow_ctx) = optical_flow_ctx
&& let Ok(optical_flow_task) = tasks::optical_flow::run(optical_flow_ctx)
{
spawner.spawn(optical_flow_task);
}
#[cfg(feature = "osd")]
if let Some(osd_ctx) = osd_ctx
&& let Ok(osd_task) = tasks::osd::run(osd_ctx)
{
spawner.spawn(osd_task);
}
#[cfg(feature = "rangefinder")]
if let Some(rangefinder_ctx) = rangefinder_ctx
&& let Ok(rangefinder_task) = tasks::rangefinder::run(rangefinder_ctx)
{
spawner.spawn(rangefinder_task);
}
}