pub use device::{
Address, Advertisement, DiscoveredDevice, MAX_ADVERTISED_SERVICE_UUIDS, ManufacturerData,
SecuritySettings, ServiceData,
};
pub use macros::{parse_mac_str, parse_uuid_str};
pub use uuid::Uuid;
mod device;
mod macros;
mod uuid;
use core::fmt::{Display, Formatter};
#[cfg(feature = "alloc")]
use alloc::collections::BTreeMap;
#[cfg(feature = "alloc")]
use alloc::string::String;
#[cfg(feature = "alloc")]
use alloc::vec::Vec;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct DiscoveryFilter {
pub company_id: Option<u16>,
pub local_name: Option<heapless::String<32>>,
pub service_uuid: Option<Uuid>,
}
#[derive(
Debug,
Clone,
Copy,
Default,
PartialEq,
Eq,
Serialize,
Deserialize,
postcard::experimental::max_size::MaxSize,
)]
pub enum ScanMode {
#[default]
Passive,
Active,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum ReadError {
BufTooSmall,
NotReadable,
RequiresSecurity,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum WriteError {
NotWriteable,
RequiresSecurity,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum NotifyError {
BufTooSmall,
NotNotifiable,
RequiresSecurity,
}
#[cfg(feature = "alloc")]
pub struct ConnectedDevice {
pub mac_address: Address,
pub gatt_services: BTreeMap<Uuid, Service>,
}
#[cfg(feature = "alloc")]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[allow(missing_docs)]
pub struct Service {
pub characteristics: BTreeMap<Uuid, Characteristic>,
}
#[derive(
Debug,
Copy,
Clone,
Serialize,
Deserialize,
PartialEq,
Eq,
PartialOrd,
Ord,
postcard::experimental::max_size::MaxSize,
)]
pub struct Characteristic {
pub uuid: Uuid,
pub service_uuid: Uuid,
}
impl Display for Characteristic {
fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
self.uuid.fmt(f)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, thiserror::Error)]
#[allow(missing_docs)] pub enum DisconnectReason {
#[error("the connection attempt never succeeded")]
ConnectionFailed,
#[error("the connection attempt or an operation timed out.")]
Timeout,
#[error("the peripheral closed the connection.")]
RemoteClosed,
#[error("the cell requested the disconnect.")]
LocalClosed,
#[error("the connection ended for an unspecified reason.")]
Unknown,
}
#[cfg(feature = "alloc")]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ScanRequest {
pub callback: String,
pub filter: Option<DiscoveryFilter>,
pub mode: ScanMode,
}
#[cfg(feature = "alloc")]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ConnectRequest {
pub address: Address,
pub on_connected: String,
pub on_disconnected: String,
}
#[cfg(feature = "alloc")]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SubscribeRequest {
pub connection_id: u32,
pub characteristic: Characteristic,
pub callback: String,
}
#[cfg(feature = "alloc")]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReadRequest {
pub connection_id: u32,
pub characteristic: Characteristic,
pub callback: String,
}
#[cfg(feature = "alloc")]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WriteRequest {
pub connection_id: u32,
pub characteristic: Characteristic,
pub data: Vec<u8>,
pub callback: Option<String>,
}
#[cfg(feature = "alloc")]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ConnectionInfo {
pub id: u32,
pub mac_address: Address,
pub gatt_services: BTreeMap<Uuid, Service>,
}
#[cfg(feature = "alloc")]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[allow(missing_docs)]
pub struct NotificationInfo {
pub characteristic: Characteristic,
pub data: Vec<u8>,
}
#[cfg(feature = "alloc")]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[allow(missing_docs)]
pub struct ReadOutcome {
pub characteristic: Characteristic,
pub value: Result<Vec<u8>, ReadError>,
}
#[cfg(feature = "alloc")]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[allow(missing_docs)]
pub struct WriteOutcome {
pub characteristic: Characteristic,
pub result: Result<(), WriteError>,
}