diff --git a/nrf-softdevice-macro/Cargo.toml b/nrf-softdevice-macro/Cargo.toml index 929ee60..d816051 100644 --- a/nrf-softdevice-macro/Cargo.toml +++ b/nrf-softdevice-macro/Cargo.toml @@ -14,7 +14,7 @@ syn = { version = "1.0.39", features = ["full", "extra-traits"] } quote = "1.0.7" darling = "0.13.4" proc-macro2 = "1.0.18" -Inflector = "0.11.4" +Inflector = { version = "0.11.4", default-features = false } uuid = "1.2.2" [lib] diff --git a/nrf-softdevice/src/ble/central.rs b/nrf-softdevice/src/ble/central.rs index 0418aeb..a27772c 100644 --- a/nrf-softdevice/src/ble/central.rs +++ b/nrf-softdevice/src/ble/central.rs @@ -183,7 +183,7 @@ where // has been dropped and the scanning has been stopped. static mut BUF: [u8; BUF_LEN] = [0u8; BUF_LEN]; static mut BUF_DATA: raw::ble_data_t = raw::ble_data_t { - p_data: unsafe { BUF.as_mut_ptr() }, + p_data: unsafe { (&mut *(&raw mut BUF)).as_mut_ptr() }, len: BUF_LEN as u16, }; diff --git a/nrf-softdevice/src/ble/connection.rs b/nrf-softdevice/src/ble/connection.rs index fe492ec..6c0950c 100644 --- a/nrf-softdevice/src/ble/connection.rs +++ b/nrf-softdevice/src/ble/connection.rs @@ -301,6 +301,12 @@ impl ConnectionState { } let ret = unsafe { raw::sd_ble_gap_disconnect(conn_handle, reason.into()) }; + // This case can occur in normal operation if e.g. the connection was + // already being disconnected when disconnect() is called, so + // return as error instead of a panic. + if ret == raw::NRF_ERROR_INVALID_STATE { + return Err(DisconnectedError); + } unwrap!(RawError::convert(ret), "sd_ble_gap_disconnect"); self.disconnecting = true; @@ -825,7 +831,7 @@ pub(crate) fn with_state(index: u8, f: impl FnOnce(&mut ConnectionState) -> T fn allocate_index(f: impl FnOnce(u8, &mut ConnectionState) -> T) -> Result { unsafe { - for (i, s) in STATES.iter().enumerate() { + for (i, s) in (&*(&raw const STATES)).iter().enumerate() { let state = &mut *s.get(); if state.refcount == 0 && !state.conn_handle.is_connected() { return Ok(f(i as u8, state)); diff --git a/nrf-softdevice/src/softdevice.rs b/nrf-softdevice/src/softdevice.rs index 682f947..f9cf961 100644 --- a/nrf-softdevice/src/softdevice.rs +++ b/nrf-softdevice/src/softdevice.rs @@ -287,7 +287,7 @@ impl Softdevice { }; unsafe { - let p = SOFTDEVICE.as_mut_ptr(); + let p = (&mut *(&raw mut SOFTDEVICE)).as_mut_ptr(); p.write(sd); &mut *p } @@ -298,7 +298,7 @@ impl Softdevice { /// (a call to [`enable`] has returned without error) and no `&mut` references /// to the softdevice are active pub unsafe fn steal() -> &'static Softdevice { - &*SOFTDEVICE.as_ptr() + &*(&*(&raw const SOFTDEVICE)).as_ptr() } /// Runs the softdevice event handling loop.