blob: c0c227fa8b1fa90f34c2397a8f7fe21524e4e087 [file] [log] [blame]
// Copyright 2025 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//! Contains traits that are used to synchronize to Periodic Advertisements,
//! i.e. the GAP Central role role defined in the Bluetooth Core
//! Specification (5.4, Volume 3 Part C Section 2.2.2)
//!
//! These traits should be implemented outside this crate, conforming to the
//! types and structs here when necessary.
use bt_common::core::Phy;
use futures::{Future, Stream};
use thiserror::Error;
use bt_common::PeerId;
#[derive(Error, Debug)]
#[non_exhaustive]
pub enum Error {
#[error("Periodic Advertising Sync failed to establish")]
SyncEstablishFailed,
#[error("Periodic Advertising Sync lost")]
SyncLost,
#[error("I/O error")]
Io,
}
/// A trait for managing a periodic advertising.
pub trait PeriodicAdvertising {
type SyncFut: Future<Output = crate::Result<Self::SyncStream>>;
type SyncStream: Stream<Item = crate::Result<SyncReport>>;
/// Request to sync to periodic advertising resports.
/// On success, returns the SyncStream which can be used to receive
/// SyncReports.
fn sync_to_advertising_reports(
peer_id: PeerId,
advertising_sid: u8,
config: SyncConfiguration,
) -> Self::SyncFut;
// TODO(b/340885203): Add a method to sync to subevents.
}
#[derive(Debug, Clone)]
pub struct SyncConfiguration {
/// Filter out duplicate advertising reports.
/// Optional.
/// Default: true
pub filter_duplicates: bool,
}
#[derive(Debug, Clone)]
pub struct PeriodicAdvertisingReport {
pub rssi: i8,
pub data: Vec<u8>,
/// The event counter of the event that the advertising packet was received
/// in.
pub event_counter: Option<u16>,
/// The subevent number of the report. Only present if the packet was
/// received in a subevent.
pub subevent: Option<u8>,
pub timestamp: i64,
}
#[derive(Debug, Clone)]
pub struct BroadcastIsochronousGroupInfo {
/// The number of Broadcast Isochronous Streams in this group.
/// The specification calls this "num_bis".
pub streams_count: u8,
/// The time interval of the periodic SDUs.
pub sdu_interval: i64,
/// The maximum size of an SDU.
pub max_sdu_size: u16,
/// The PHY used for transmission of data.
pub phy: Phy,
/// Indicates whether the BIG is encrypted.
pub encryption: bool,
}
#[derive(Debug, Clone)]
pub struct BroadcastIsochronousGroupInfoReport {
pub info: BroadcastIsochronousGroupInfo,
pub timestamp: i64,
}
#[derive(Debug, Clone)]
pub enum SyncReport {
PeriodicAdvertisingReport(PeriodicAdvertisingReport),
BroadcastIsochronousGroupInfoReport(BroadcastIsochronousGroupInfoReport),
}