use enumflags2::BitFlags;
use super::*;
use crate::util::BufExt;
pub async fn start_discovery(
socket: &mut ManagementStream,
controller: Controller,
address_types: BitFlags<AddressTypeFlag>,
event_tx: Option<mpsc::Sender<Response>>,
) -> Result<BitFlags<AddressTypeFlag>> {
let mut param = BytesMut::with_capacity(1);
param.put_u8(address_types.bits());
let (_, param) = exec_command(
socket,
Command::StartDiscovery,
controller,
Some(param.freeze()),
event_tx,
)
.await?;
Ok(param.ok_or(Error::NoData)?.get_flags_u8())
}
pub async fn stop_discovery(
socket: &mut ManagementStream,
controller: Controller,
address_types: BitFlags<AddressTypeFlag>,
event_tx: Option<mpsc::Sender<Response>>,
) -> Result<BitFlags<AddressTypeFlag>> {
let mut param = BytesMut::with_capacity(1);
param.put_u8(address_types.bits());
let (_, param) = exec_command(
socket,
Command::StopDiscovery,
controller,
Some(param.freeze()),
event_tx,
)
.await?;
Ok(param.ok_or(Error::NoData)?.get_flags_u8())
}
pub async fn start_service_discovery(
socket: &mut ManagementStream,
controller: Controller,
address_types: BitFlags<AddressTypeFlag>,
rssi_threshold: i8,
uuids: Vec<[u8; 16]>,
event_tx: Option<mpsc::Sender<Response>>,
) -> Result<BitFlags<AddressTypeFlag>> {
let mut param = BytesMut::with_capacity(4 + 16 * uuids.len());
param.put_u8(address_types.bits());
param.put_i8(rssi_threshold);
param.put_u16_le(uuids.len() as u16);
for uuid in uuids {
param.put_slice(&uuid[..]);
}
let (_, param) = exec_command(
socket,
Command::StartServiceDiscovery,
controller,
Some(param.freeze()),
event_tx,
)
.await?;
Ok(param.ok_or(Error::NoData)?.get_flags_u8())
}
pub async fn start_limited_discovery(
socket: &mut ManagementStream,
controller: Controller,
address_types: BitFlags<AddressTypeFlag>,
event_tx: Option<mpsc::Sender<Response>>,
) -> Result<BitFlags<AddressTypeFlag>> {
let mut param = BytesMut::with_capacity(1);
param.put_u8(address_types.bits());
let (_, param) = exec_command(
socket,
Command::StartLimitedDiscovery,
controller,
Some(param.freeze()),
event_tx,
)
.await?;
Ok(param.ok_or(Error::NoData)?.get_flags_u8())
}