#![feature(impl_trait_in_assoc_type)] #![no_std] #![no_main] mod adc; mod ble; mod button; mod constants; mod led; mod panic_handler; mod shtc3; mod state; mod timer; use embassy_executor::Executor; use sachy_fmt::{info, unwrap}; use embassy_nrf::{ bind_interrupts, gpio::{Level, Output, OutputDrive}, peripherals, rng::{self, Rng}, saadc, twim, }; use static_cell::StaticCell; use nrf_sdc::mpsl::MultiprotocolServiceLayer; use nrf_sdc::{self as sdc, mpsl}; bind_interrupts!(struct Irqs { RNG => rng::InterruptHandler; EGU0_SWI0 => mpsl::LowPrioInterruptHandler; CLOCK_POWER => mpsl::ClockInterruptHandler; RADIO => mpsl::HighPrioInterruptHandler; TIMER0 => mpsl::HighPrioInterruptHandler; RTC0 => mpsl::HighPrioInterruptHandler; TWISPI0 => twim::InterruptHandler; SAADC => saadc::InterruptHandler; }); #[cortex_m_rt::entry] fn main() -> ! { let p = embassy_nrf::init(Default::default()); let mpsl_p = mpsl::Peripherals::new(p.RTC0, p.TIMER0, p.TEMP, p.PPI_CH19, p.PPI_CH30, p.PPI_CH31); let lfclk_cfg = mpsl::raw::mpsl_clock_lfclk_cfg_t { source: mpsl::raw::MPSL_CLOCK_LF_SRC_RC as u8, rc_ctiv: mpsl::raw::MPSL_RECOMMENDED_RC_CTIV as u8, rc_temp_ctiv: mpsl::raw::MPSL_RECOMMENDED_RC_TEMP_CTIV as u8, accuracy_ppm: mpsl::raw::MPSL_DEFAULT_CLOCK_ACCURACY_PPM as u16, skip_wait_lfclk_started: mpsl::raw::MPSL_DEFAULT_SKIP_WAIT_LFCLK_STARTED != 0, }; static MPSL: StaticCell = StaticCell::new(); let mpsl = MPSL.init_with(|| { unwrap!(mpsl::MultiprotocolServiceLayer::new( mpsl_p, Irqs, lfclk_cfg )) }); let sdc_p = sdc::Peripherals::new( p.PPI_CH17, p.PPI_CH18, p.PPI_CH20, p.PPI_CH21, p.PPI_CH22, p.PPI_CH23, p.PPI_CH24, p.PPI_CH25, p.PPI_CH26, p.PPI_CH27, p.PPI_CH28, p.PPI_CH29, ); static DEVICE_RNG: StaticCell> = StaticCell::new(); let rng = DEVICE_RNG.init_with(|| rng::Rng::new(p.RNG, Irqs)); static SDC_MEM: StaticCell> = StaticCell::new(); let sdc_mem = SDC_MEM.init_with(sdc::Mem::new); let sdc = unwrap!(ble::build_sdc(sdc_p, rng, mpsl, sdc_mem)); static EXECUTOR: StaticCell = StaticCell::new(); EXECUTOR.init_with(Executor::new).run(|spawner| { spawner.spawn(unwrap!(button::task(p.GPIOTE_CH0, p.P0_30))); spawner.spawn(unwrap!(led::task(Output::new( p.P0_28, Level::Low, OutputDrive::Standard, )))); spawner.spawn(unwrap!(shtc3::task(p.TWISPI0, p.P0_24, p.P0_13))); spawner.spawn(unwrap!(adc::task( p.SAADC, p.P0_02, p.P0_03, p.P0_29, p.PWM0, p.P0_05, ))); spawner.spawn(unwrap!(timer::task())); spawner.spawn(unwrap!(ble::task(spawner, sdc, mpsl))); info!("Sachy's Parasite is go!"); }) }