use core::ffi::c_int;
#[cfg(esp_idf_bt_nimble_gatt_server)]
use enumset::{EnumSet, EnumSetType};
use crate::sys::*;
use super::{BleError, ConnHandle};
#[cfg(esp_idf_bt_nimble_gatt_client)]
pub mod client;
#[cfg(esp_idf_bt_nimble_gatt_server)]
pub mod server;
pub type AttrHandle = u16;
pub fn set_preferred_mtu(mtu: u16) -> Result<(), BleError> {
BleError::from_raw(unsafe { ble_att_set_preferred_mtu(mtu) })
}
pub fn att_mtu(conn_handle: ConnHandle) -> Result<u16, BleError> {
match unsafe { ble_att_mtu(conn_handle) } {
0 => Err(BleError::new(BLE_HS_ENOTCONN as c_int)),
mtu => Ok(mtu),
}
}
#[cfg(esp_idf_bt_nimble_gatt_server)]
#[derive(Debug, EnumSetType)]
pub enum BleGattCharFlag {
Broadcast,
Read,
WriteNoRsp,
Write,
Notify,
Indicate,
AuthSignWrite,
ReliableWrite,
AuxWrite,
ReadEnc,
ReadAuthen,
ReadAuthor,
WriteEnc,
WriteAuthen,
WriteAuthor,
#[cfg(esp_idf_version_at_least_5_5_0)]
NotifyIndicateEnc,
#[cfg(esp_idf_version_at_least_5_5_0)]
NotifyIndicateAuthen,
#[cfg(esp_idf_version_at_least_5_5_0)]
NotifyIndicateAuthor,
}
#[cfg(esp_idf_bt_nimble_gatt_server)]
impl BleGattCharFlag {
pub const fn repr(self) -> ble_gatt_chr_flags {
match self {
Self::Broadcast => BLE_GATT_CHR_F_BROADCAST,
Self::Read => BLE_GATT_CHR_F_READ,
Self::WriteNoRsp => BLE_GATT_CHR_F_WRITE_NO_RSP,
Self::Write => BLE_GATT_CHR_F_WRITE,
Self::Notify => BLE_GATT_CHR_F_NOTIFY,
Self::Indicate => BLE_GATT_CHR_F_INDICATE,
Self::AuthSignWrite => BLE_GATT_CHR_F_AUTH_SIGN_WRITE,
Self::ReliableWrite => BLE_GATT_CHR_F_RELIABLE_WRITE,
Self::AuxWrite => BLE_GATT_CHR_F_AUX_WRITE,
Self::ReadEnc => BLE_GATT_CHR_F_READ_ENC,
Self::ReadAuthen => BLE_GATT_CHR_F_READ_AUTHEN,
Self::ReadAuthor => BLE_GATT_CHR_F_READ_AUTHOR,
Self::WriteEnc => BLE_GATT_CHR_F_WRITE_ENC,
Self::WriteAuthen => BLE_GATT_CHR_F_WRITE_AUTHEN,
Self::WriteAuthor => BLE_GATT_CHR_F_WRITE_AUTHOR,
#[cfg(esp_idf_version_at_least_5_5_0)]
Self::NotifyIndicateEnc => BLE_GATT_CHR_F_NOTIFY_INDICATE_ENC,
#[cfg(esp_idf_version_at_least_5_5_0)]
Self::NotifyIndicateAuthen => BLE_GATT_CHR_F_NOTIFY_INDICATE_AUTHEN,
#[cfg(esp_idf_version_at_least_5_5_0)]
Self::NotifyIndicateAuthor => BLE_GATT_CHR_F_NOTIFY_INDICATE_AUTHOR,
}
}
}
#[cfg(esp_idf_bt_nimble_gatt_server)]
impl From<BleGattCharFlag> for ble_gatt_chr_flags {
fn from(flag: BleGattCharFlag) -> Self {
flag.repr()
}
}
#[cfg(esp_idf_bt_nimble_gatt_server)]
pub(crate) fn flags_to_repr(flags: EnumSet<BleGattCharFlag>) -> ble_gatt_chr_flags {
flags
.iter()
.fold(0, |acc, flag| acc | ble_gatt_chr_flags::from(flag))
}