bt_gatt/
periodic_advertising.rs1use bt_common::core::Phy;
13use futures::{Future, Stream};
14
15use crate::central::AdvertisingDatum;
16use thiserror::Error;
17
18use bt_common::PeerId;
19
20#[derive(Error, Debug)]
21#[non_exhaustive]
22pub enum Error {
23 #[error("Periodic Advertising Sync failed to establish")]
24 SyncEstablishFailed,
25 #[error("Periodic Advertising Sync lost")]
26 SyncLost,
27 #[error("I/O error")]
28 Io,
29}
30
31pub trait PeriodicAdvertising {
33 type SyncFut: Future<Output = crate::Result<Self::SyncStream>>;
34 type SyncStream: Stream<Item = crate::Result<SyncReport>>;
35
36 fn sync_to_advertising_reports(
40 &self,
41 peer_id: PeerId,
42 advertising_sid: u8,
43 config: SyncConfiguration,
44 ) -> Self::SyncFut;
45
46 }
48
49#[derive(Debug, Clone)]
50pub struct SyncConfiguration {
51 pub filter_duplicates: bool,
55}
56
57#[derive(Debug, Clone)]
58pub struct PeriodicAdvertisingReport {
59 pub rssi: i8,
60 pub data: Vec<AdvertisingDatum>,
61 pub event_counter: Option<u16>,
64 pub subevent: Option<u8>,
67 pub timestamp: i64,
68}
69
70#[derive(Debug, Clone)]
71pub struct BroadcastIsochronousGroupInfo {
72 pub streams_count: u8,
75 pub sdu_interval: i64,
77 pub max_sdu_size: u16,
79 pub phy: Phy,
81 pub encryption: bool,
83}
84
85#[derive(Debug, Clone)]
86pub struct BroadcastIsochronousGroupInfoReport {
87 pub info: BroadcastIsochronousGroupInfo,
88 pub timestamp: i64,
89}
90
91#[derive(Debug, Clone)]
92pub enum SyncReport {
93 PeriodicAdvertisingReport(PeriodicAdvertisingReport),
94 BroadcastIsochronousGroupInfoReport(BroadcastIsochronousGroupInfoReport),
95}