use core::mem; use crate::ble::gatt::Server; use defmt::{info, unwrap}; use embassy_executor::Spawner; use nrf_softdevice::{raw, Softdevice}; #[embassy_executor::task] async fn softdevice_task(sd: &'static Softdevice) -> ! { sd.run().await } fn configure(device_name: &str) -> nrf_softdevice::Config { nrf_softdevice::Config { clock: Some(raw::nrf_clock_lf_cfg_t { source: raw::NRF_CLOCK_LF_SRC_RC as u8, rc_ctiv: 16, rc_temp_ctiv: 2, accuracy: raw::NRF_CLOCK_LF_ACCURACY_500_PPM as u8, }), conn_gap: Some(raw::ble_gap_conn_cfg_t { conn_count: 6, event_length: 24, }), conn_gatt: Some(raw::ble_gatt_conn_cfg_t { att_mtu: 256 }), gatts_attr_tab_size: Some(raw::ble_gatts_cfg_attr_tab_size_t { attr_tab_size: raw::BLE_GATTS_ATTR_TAB_SIZE_DEFAULT, }), gap_role_count: Some(raw::ble_gap_cfg_role_count_t { adv_set_count: 1, periph_role_count: 3, central_role_count: 3, central_sec_count: 0, _bitfield_1: raw::ble_gap_cfg_role_count_t::new_bitfield_1(0), }), gap_device_name: Some(raw::ble_gap_cfg_device_name_t { p_value: device_name.as_bytes().as_ptr() as *const u8 as _, current_len: 9, max_len: 9, write_perm: unsafe { mem::zeroed() }, _bitfield_1: raw::ble_gap_cfg_device_name_t::new_bitfield_1( raw::BLE_GATTS_VLOC_STACK as u8, ), }), ..Default::default() } } pub fn run<'a>(spawner: Spawner, device_name: &str) -> (&'a Softdevice, Server) { let config = configure(device_name); let sd = Softdevice::enable(&config); let server = unwrap!(Server::new(sd)); unwrap!(spawner.spawn(softdevice_task(sd))); info!("softdevice started"); (sd, server) }