use core::iter::{empty, once};
use crate::dm::clusters::basic_info::BasicInfoConfig;
use super::{GATT_HEADER_SIZE, MAX_BTP_SEGMENT_SIZE};
#[cfg(all(feature = "os", feature = "bluer", target_os = "linux"))]
pub mod bluer;
#[cfg(all(feature = "zbus", target_os = "linux"))]
pub mod bluez;
pub const MATTER_BLE_SERVICE_UUID16: u16 = 0xFFF6;
pub const MATTER_BLE_SERVICE_UUID: u128 = 0x0000FFF600001000800000805F9B34FB;
pub const C1_CHARACTERISTIC_UUID: u128 = 0x18EE2EF5263D4559959F4F9C429F9D11;
pub const C2_CHARACTERISTIC_UUID: u128 = 0x18EE2EF5263D4559959F4F9C429F9D12;
pub const C3_CHARACTERISTIC_UUID: u128 = 0x64630238877245F2B87D748A83218F04;
pub const C1_MAX_LEN: usize = MAX_BTP_SEGMENT_SIZE + GATT_HEADER_SIZE;
pub const C2_MAX_LEN: usize = MAX_BTP_SEGMENT_SIZE + GATT_HEADER_SIZE;
pub const C3_MAX_LEN: usize = 512;
#[derive(Clone)]
pub struct AdvData {
vid: u16,
pid: u16,
discriminator: u16,
}
impl AdvData {
pub const fn new(dev_det: &BasicInfoConfig, discriminator: u16) -> Self {
Self {
vid: dev_det.vid,
pid: dev_det.pid,
discriminator,
}
}
pub fn iter(&self) -> impl Iterator<Item = u8> + '_ {
self.flags_iter().chain(self.service_iter())
}
pub fn flags_iter(&self) -> impl Iterator<Item = u8> + '_ {
empty()
.chain(once(self.flags_payload_iter().count() as u8 + 1)) .chain(once(self.flags_adv_type()))
.chain(self.flags_payload_iter())
}
pub const fn flags_adv_type(&self) -> u8 {
0x01
}
pub fn flags_payload_iter(&self) -> impl Iterator<Item = u8> + '_ {
once(0x06)
}
pub fn service_iter(&self) -> impl Iterator<Item = u8> + '_ {
empty()
.chain(once(self.service_payload_iter().count() as u8 + 3)) .chain(once(self.service_adv_type()))
.chain(MATTER_BLE_SERVICE_UUID16.to_le_bytes())
.chain(self.service_payload_iter())
}
pub const fn service_adv_type(&self) -> u8 {
0x16
}
pub fn service_payload_iter(&self) -> impl Iterator<Item = u8> + '_ {
[
0, self.discriminator.to_le_bytes()[0],
self.discriminator.to_le_bytes()[1],
self.vid.to_le_bytes()[0],
self.vid.to_le_bytes()[1],
self.pid.to_le_bytes()[0],
self.pid.to_le_bytes()[1],
0, ]
.into_iter()
}
}