pub mod buffer;
pub mod le;
use crate::bytes::Storage;
use crate::hci::adapter;
use crate::hci::adapters::le::LEAdapter;
use crate::hci::baseband::{EventMask, Reset, SetEventMask};
use crate::hci::command::Command;
use crate::hci::event::EventPacket;
use crate::Stream;
pub trait UnrecognizedEventHandler {
type Buf: Storage<u8>;
fn handle(&mut self, event: EventPacket<Self::Buf>) -> Result<(), adapter::Error>;
}
pub struct DummyUnrecognizedEventHandler<Buf = Box<[u8]>>(core::marker::PhantomData<Buf>);
impl<Buf> DummyUnrecognizedEventHandler<Buf> {
pub const fn new() -> Self {
Self {
0: core::marker::PhantomData,
}
}
}
impl<Buf: Storage<u8>> UnrecognizedEventHandler for DummyUnrecognizedEventHandler<Buf> {
type Buf = Buf;
fn handle(&mut self, event: EventPacket<Buf>) -> Result<(), adapter::Error> {
core::mem::drop(event);
Ok(())
}
}
pub struct Adapter<A: adapter::Adapter, H: UnrecognizedEventHandler> {
pub adapter: A,
pub event_handler: H,
}
impl<A: adapter::Adapter> Adapter<A, DummyUnrecognizedEventHandler<Box<[u8]>>> {
pub fn new(adapter: A) -> Self {
Adapter {
adapter,
event_handler: DummyUnrecognizedEventHandler::new(),
}
}
}
impl<A: adapter::Adapter, H: UnrecognizedEventHandler> Adapter<A, H> {
pub fn new_with_handler(adapter: A, event_handler: H) -> Self {
Self {
adapter,
event_handler,
}
}
pub fn le(self) -> le::LEAdapter<A, H> {
LEAdapter::new(self)
}
pub async fn hci_send_command<'a, 'c: 'a, Cmd: Command + 'c>(
&mut self,
cmd: Cmd,
) -> Result<Cmd::Return, adapter::Error> {
let event_handler = &mut self.event_handler;
adapter::send_command::<_, _, H::Buf, _>(
&mut self.adapter,
cmd,
Some(|e| event_handler.handle(e)),
)
.await
}
pub async fn hci_read_event<Buf: Storage<u8>>(
&mut self,
) -> Result<EventPacket<Buf>, adapter::Error> {
self.adapter.read_event().await
}
pub fn hci_event_stream<'a, 'b: 'a, Buf: Storage<u8> + 'b>(
&'a mut self,
) -> impl Stream<Item = Result<EventPacket<Buf>, adapter::Error>> + 'a {
futures_util::stream::unfold(self, move |s| async move {
Some((s.adapter.read_event().await, s))
})
}
pub async fn set_event_mask(&mut self, mask: EventMask) -> Result<(), adapter::Error> {
self.hci_send_command(SetEventMask(mask))
.await?
.params
.status
.error()?;
Ok(())
}
pub async fn reset(&mut self) -> Result<(), adapter::Error> {
self.hci_send_command(Reset).await?.params.status.error()?;
Ok(())
}
}