mirror of
https://github.com/embassy-rs/embassy.git
synced 2025-09-30 22:01:07 +00:00
fix: add error handling for HCI transport
This commit is contained in:
parent
e4c388c704
commit
6b3d2db471
@ -3,12 +3,14 @@ use core::future::Future;
|
|||||||
use core::mem::MaybeUninit;
|
use core::mem::MaybeUninit;
|
||||||
|
|
||||||
use bt_hci::transport::WithIndicator;
|
use bt_hci::transport::WithIndicator;
|
||||||
|
use bt_hci::FromHciBytesError;
|
||||||
use bt_hci::{ControllerToHostPacket, FromHciBytes, HostToControllerPacket, PacketKind, WriteHci};
|
use bt_hci::{ControllerToHostPacket, FromHciBytes, HostToControllerPacket, PacketKind, WriteHci};
|
||||||
use embassy_futures::yield_now;
|
use embassy_futures::yield_now;
|
||||||
use embassy_sync::blocking_mutex::raw::NoopRawMutex;
|
use embassy_sync::blocking_mutex::raw::NoopRawMutex;
|
||||||
use embassy_sync::zerocopy_channel;
|
use embassy_sync::zerocopy_channel;
|
||||||
use embassy_time::{Duration, Timer};
|
use embassy_time::{Duration, Timer};
|
||||||
use embedded_hal_1::digital::OutputPin;
|
use embedded_hal_1::digital::OutputPin;
|
||||||
|
use embedded_io_async::ErrorKind;
|
||||||
|
|
||||||
use crate::bus::Bus;
|
use crate::bus::Bus;
|
||||||
pub use crate::bus::SpiBusCyw43;
|
pub use crate::bus::SpiBusCyw43;
|
||||||
@ -472,8 +474,33 @@ impl<'a> BtRunner<'a> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// HCI transport error.
|
||||||
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub enum Error {
|
||||||
|
/// I/O error.
|
||||||
|
Io(ErrorKind),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<FromHciBytesError> for Error {
|
||||||
|
fn from(e: FromHciBytesError) -> Self {
|
||||||
|
match e {
|
||||||
|
FromHciBytesError::InvalidSize => Error::Io(ErrorKind::InvalidInput),
|
||||||
|
FromHciBytesError::InvalidValue => Error::Io(ErrorKind::InvalidData),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<'d> embedded_io_async::ErrorType for BtDriver<'d> {
|
impl<'d> embedded_io_async::ErrorType for BtDriver<'d> {
|
||||||
type Error = core::convert::Infallible;
|
type Error = Error;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl embedded_io_async::Error for Error {
|
||||||
|
fn kind(&self) -> ErrorKind {
|
||||||
|
match self {
|
||||||
|
Self::Io(e) => *e,
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'d> bt_hci::transport::Transport for BtDriver<'d> {
|
impl<'d> bt_hci::transport::Transport for BtDriver<'d> {
|
||||||
@ -486,9 +513,9 @@ impl<'d> bt_hci::transport::Transport for BtDriver<'d> {
|
|||||||
rx[..n].copy_from_slice(&buf.buf[..n]);
|
rx[..n].copy_from_slice(&buf.buf[..n]);
|
||||||
ch.receive_done();
|
ch.receive_done();
|
||||||
|
|
||||||
let kind = PacketKind::from_hci_bytes_complete(&rx[..1]).unwrap();
|
let kind = PacketKind::from_hci_bytes_complete(&rx[..1])?;
|
||||||
let (res, _) = ControllerToHostPacket::from_hci_bytes_with_kind(kind, &rx[1..n]).unwrap();
|
let (pkt, _) = ControllerToHostPacket::from_hci_bytes_with_kind(kind, &rx[1..n])?;
|
||||||
Ok(res)
|
Ok(pkt)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -499,7 +526,9 @@ impl<'d> bt_hci::transport::Transport for BtDriver<'d> {
|
|||||||
let buf = ch.send().await;
|
let buf = ch.send().await;
|
||||||
let buf_len = buf.buf.len();
|
let buf_len = buf.buf.len();
|
||||||
let mut slice = &mut buf.buf[..];
|
let mut slice = &mut buf.buf[..];
|
||||||
WithIndicator::new(val).write_hci(&mut slice).unwrap();
|
WithIndicator::new(val)
|
||||||
|
.write_hci(&mut slice)
|
||||||
|
.map_err(|_| Error::Io(ErrorKind::Other))?;
|
||||||
buf.len = buf_len - slice.len();
|
buf.len = buf_len - slice.len();
|
||||||
ch.send_done();
|
ch.send_done();
|
||||||
Ok(())
|
Ok(())
|
||||||
|
Loading…
x
Reference in New Issue
Block a user