use std::fmt::Debug;
use std::num::NonZeroU8;
pub use burble_const::{Characteristic, Declaration, Descriptor, Service, Unit};
bitflags::bitflags! {
#[derive(Clone, Copy, Debug, Default)]
#[repr(transparent)]
pub struct Prop: u8 {
const BROADCAST = 0x01;
const READ = 0x02;
const WRITE_CMD = 0x04;
const WRITE = 0x08;
const NOTIFY = 0x10;
const INDICATE = 0x20;
const SIGNED_WRITE_CMD = 0x40;
const EXT_PROPS = 0x80;
}
}
impl Prop {
#[inline(always)]
pub(super) const fn cccd_mask(self) -> Cccd {
Cccd::from_bits_retain((self.bits() >> 4) as u16 & Cccd::NOTIFY_MASK.bits())
}
}
bitflags::bitflags! {
#[derive(Clone, Copy, Debug, Default)]
#[repr(transparent)]
pub struct ExtProp: u16 {
const RELIABLE_WRITE = 1 << 0;
const WRITABLE_AUX = 1 << 1;
}
}
bitflags::bitflags! {
#[derive(Clone, Copy, Debug, Default, serde::Deserialize, serde::Serialize)]
#[repr(transparent)]
#[serde(transparent)]
pub struct Cccd: u16 {
const NOTIFY = 1 << 0;
const INDICATE = 1 << 1;
const NOTIFY_MASK = Self::NOTIFY.bits() | Self::INDICATE.bits();
}
}
bitflags::bitflags! {
#[derive(Clone, Copy, Debug, Default, serde::Deserialize, serde::Serialize)]
#[repr(transparent)]
#[serde(transparent)]
pub(super) struct ClientFeature: u8 {
const ROBUST_CACHING = 1 << 0;
const ENHANCED_ATT = 1 << 1;
const MULTI_NTF = 1 << 2;
}
}
bitflags::bitflags! {
#[derive(Clone, Copy, Debug, Default)]
#[repr(transparent)]
pub(super) struct ServerFeature: u8 {
const EATT = 1 << 0;
}
}
#[derive(
Clone, Copy, Debug, Eq, PartialEq, num_enum::IntoPrimitive, num_enum::TryFromPrimitive,
)]
#[non_exhaustive]
#[repr(u8)]
pub enum Format {
Bool = 0x01,
U2 = 0x02,
U4 = 0x03,
U8 = 0x04,
U12 = 0x05,
U16 = 0x06,
U24 = 0x07,
U32 = 0x08,
U48 = 0x09,
U64 = 0x0A,
U128 = 0x0B,
I8 = 0x0C,
I12 = 0x0D,
I16 = 0x0E,
I24 = 0x0F,
I32 = 0x10,
I48 = 0x11,
I64 = 0x12,
I128 = 0x13,
F32 = 0x14,
F64 = 0x15,
MedF16 = 0x16,
MedF32 = 0x17,
MedType = 0x18,
Utf8 = 0x19,
Utf16 = 0x1A,
Struct = 0x1B,
}
#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)]
#[non_exhaustive]
pub enum Description {
Unknown,
Nth(NonZeroU8),
Front,
Back,
Top,
Bottom,
Upper,
Lower,
Main,
Backup,
Auxiliary,
Supplementary,
Flash,
Inside,
Outside,
Left,
Right,
Internal,
External,
}
impl Description {
#[inline]
#[must_use]
pub const fn nth(n: u8) -> Self {
match NonZeroU8::new(n) {
Some(n) => Self::Nth(n),
None => panic!("n cannot be zero"),
}
}
#[inline(always)]
#[must_use]
pub const fn ns(self) -> u8 {
0x01 }
#[must_use]
pub const fn raw(self) -> u16 {
use Description::*;
match self {
Unknown => 0x0000,
Nth(n) => n.get() as u16,
Front => 0x0100,
Back => 0x0101,
Top => 0x0102,
Bottom => 0x0103,
Upper => 0x0104,
Lower => 0x0105,
Main => 0x0106,
Backup => 0x0107,
Auxiliary => 0x0108,
Supplementary => 0x0109,
Flash => 0x010A,
Inside => 0x010B,
Outside => 0x010C,
Left => 0x010D,
Right => 0x010E,
Internal => 0x010F,
External => 0x0110,
}
}
}
impl From<Description> for u16 {
#[inline]
fn from(d: Description) -> Self {
d.raw()
}
}