From 9df1dd1e6f455005bfcbb27e1c20d54f00d0cfcc Mon Sep 17 00:00:00 2001 From: Ulf Lilleengen Date: Mon, 22 Apr 2024 08:59:14 +0200 Subject: [PATCH] rustfmt and refactor --- .../nrf-sdc/src/bin/ble_bas_peripheral.rs | 14 +- examples/nrf-sdc/src/bin/ble_l2cap_central.rs | 16 +- .../nrf-sdc/src/bin/ble_l2cap_peripheral.rs | 14 +- examples/serial-hci/src/main.rs | 13 +- host/src/adapter.rs | 31 ++-- host/src/advertise.rs | 11 +- host/src/attribute.rs | 10 +- host/src/attribute_server.rs | 17 +-- host/src/channel_manager.rs | 42 +++--- host/src/connection.rs | 15 +- host/src/connection_manager.rs | 17 +-- host/src/gatt.rs | 9 +- host/src/l2cap.rs | 138 +----------------- host/src/lib.rs | 3 +- host/src/packet_pool.rs | 5 +- host/src/scan.rs | 7 +- host/src/types/l2cap.rs | 29 +++- host/tests/l2cap.rs | 20 +-- rustfmt.toml | 2 + 19 files changed, 144 insertions(+), 269 deletions(-) diff --git a/examples/nrf-sdc/src/bin/ble_bas_peripheral.rs b/examples/nrf-sdc/src/bin/ble_bas_peripheral.rs index 4149815b..8da5e491 100644 --- a/examples/nrf-sdc/src/bin/ble_bas_peripheral.rs +++ b/examples/nrf-sdc/src/bin/ble_bas_peripheral.rs @@ -8,16 +8,14 @@ use embassy_futures::join::join3; use embassy_nrf::{bind_interrupts, pac}; use embassy_sync::blocking_mutex::raw::NoopRawMutex; use embassy_time::{Duration, Timer}; -use nrf_sdc::{self as sdc, mpsl, mpsl::MultiprotocolServiceLayer}; +use nrf_sdc::mpsl::MultiprotocolServiceLayer; +use nrf_sdc::{self as sdc, mpsl}; use sdc::rng_pool::RngPool; use static_cell::StaticCell; -use trouble_host::{ - adapter::{Adapter, HostResources}, - advertise::{AdStructure, Advertisement, BR_EDR_NOT_SUPPORTED, LE_GENERAL_DISCOVERABLE}, - attribute::{AttributeTable, CharacteristicProp, Service, Uuid}, - Address, PacketQos, -}; - +use trouble_host::adapter::{Adapter, HostResources}; +use trouble_host::advertise::{AdStructure, Advertisement, BR_EDR_NOT_SUPPORTED, LE_GENERAL_DISCOVERABLE}; +use trouble_host::attribute::{AttributeTable, CharacteristicProp, Service, Uuid}; +use trouble_host::{Address, PacketQos}; use {defmt_rtt as _, panic_probe as _}; bind_interrupts!(struct Irqs { diff --git a/examples/nrf-sdc/src/bin/ble_l2cap_central.rs b/examples/nrf-sdc/src/bin/ble_l2cap_central.rs index 4d89f143..e50397cf 100644 --- a/examples/nrf-sdc/src/bin/ble_l2cap_central.rs +++ b/examples/nrf-sdc/src/bin/ble_l2cap_central.rs @@ -8,17 +8,15 @@ use embassy_futures::join::join; use embassy_nrf::{bind_interrupts, pac}; use embassy_sync::blocking_mutex::raw::NoopRawMutex; use embassy_time::{Duration, Timer}; -use nrf_sdc::{self as sdc, mpsl, mpsl::MultiprotocolServiceLayer}; +use nrf_sdc::mpsl::MultiprotocolServiceLayer; +use nrf_sdc::{self as sdc, mpsl}; use sdc::rng_pool::RngPool; use static_cell::StaticCell; -use trouble_host::{ - adapter::{Adapter, HostResources}, - connection::ConnectConfig, - l2cap::L2capChannel, - scan::ScanConfig, - Address, PacketQos, -}; - +use trouble_host::adapter::{Adapter, HostResources}; +use trouble_host::connection::ConnectConfig; +use trouble_host::l2cap::L2capChannel; +use trouble_host::scan::ScanConfig; +use trouble_host::{Address, PacketQos}; use {defmt_rtt as _, panic_probe as _}; bind_interrupts!(struct Irqs { diff --git a/examples/nrf-sdc/src/bin/ble_l2cap_peripheral.rs b/examples/nrf-sdc/src/bin/ble_l2cap_peripheral.rs index 958f3962..2a8d6ed5 100644 --- a/examples/nrf-sdc/src/bin/ble_l2cap_peripheral.rs +++ b/examples/nrf-sdc/src/bin/ble_l2cap_peripheral.rs @@ -8,16 +8,14 @@ use embassy_futures::join::join; use embassy_nrf::{bind_interrupts, pac}; use embassy_sync::blocking_mutex::raw::NoopRawMutex; use embassy_time::{Duration, Timer}; -use nrf_sdc::{self as sdc, mpsl, mpsl::MultiprotocolServiceLayer}; +use nrf_sdc::mpsl::MultiprotocolServiceLayer; +use nrf_sdc::{self as sdc, mpsl}; use sdc::rng_pool::RngPool; use static_cell::StaticCell; -use trouble_host::{ - adapter::{Adapter, HostResources}, - advertise::{AdStructure, Advertisement, BR_EDR_NOT_SUPPORTED, LE_GENERAL_DISCOVERABLE}, - l2cap::L2capChannel, - Address, PacketQos, -}; - +use trouble_host::adapter::{Adapter, HostResources}; +use trouble_host::advertise::{AdStructure, Advertisement, BR_EDR_NOT_SUPPORTED, LE_GENERAL_DISCOVERABLE}; +use trouble_host::l2cap::L2capChannel; +use trouble_host::{Address, PacketQos}; use {defmt_rtt as _, panic_probe as _}; bind_interrupts!(struct Irqs { diff --git a/examples/serial-hci/src/main.rs b/examples/serial-hci/src/main.rs index 8b83e0a5..d517ca6b 100644 --- a/examples/serial-hci/src/main.rs +++ b/examples/serial-hci/src/main.rs @@ -6,14 +6,11 @@ use embassy_sync::blocking_mutex::raw::NoopRawMutex; use log::*; use static_cell::StaticCell; use tokio::time::Duration; -use tokio_serial::SerialStream; -use tokio_serial::{DataBits, Parity, StopBits}; -use trouble_host::{ - adapter::{Adapter, HostResources}, - advertise::{AdStructure, Advertisement, BR_EDR_NOT_SUPPORTED, LE_GENERAL_DISCOVERABLE}, - attribute::{AttributeTable, CharacteristicProp, Service, Uuid}, - PacketQos, -}; +use tokio_serial::{DataBits, Parity, SerialStream, StopBits}; +use trouble_host::adapter::{Adapter, HostResources}; +use trouble_host::advertise::{AdStructure, Advertisement, BR_EDR_NOT_SUPPORTED, LE_GENERAL_DISCOVERABLE}; +use trouble_host::attribute::{AttributeTable, CharacteristicProp, Service, Uuid}; +use trouble_host::PacketQos; #[tokio::main] async fn main() { diff --git a/host/src/adapter.rs b/host/src/adapter.rs index aef6c71e..1788073b 100644 --- a/host/src/adapter.rs +++ b/host/src/adapter.rs @@ -1,15 +1,6 @@ -use crate::advertise::{Advertisement, AdvertisementConfig, RawAdvertisement}; -use crate::channel_manager::ChannelManager; -use crate::connection::{ConnectConfig, Connection}; -use crate::connection_manager::{ConnectionInfo, ConnectionManager}; -use crate::cursor::{ReadCursor, WriteCursor}; -use crate::l2cap::{L2capHeader, PacketReassembly, L2CAP_CID_ATT, L2CAP_CID_DYN_START, L2CAP_CID_LE_U_SIGNAL}; -use crate::packet_pool::{AllocId, DynamicPacketPool, PacketPool, Qos}; -use crate::pdu::Pdu; -use crate::scan::{PhySet, ScanConfig, ScanReport}; -use crate::types::l2cap::L2capLeSignal; -use crate::Address; -use crate::{AdapterError, Error}; +use core::future::pending; +use core::task::Poll; + use bt_hci::cmd::controller_baseband::{HostBufferSize, Reset, SetEventMask}; use bt_hci::cmd::le::{ LeAddDeviceToFilterAcceptList, LeClearAdvSets, LeClearFilterAcceptList, LeCreateConn, LeCreateConnCancel, @@ -19,8 +10,7 @@ use bt_hci::cmd::le::{ }; use bt_hci::cmd::link_control::Disconnect; use bt_hci::cmd::{AsyncCmd, SyncCmd}; -use bt_hci::controller::{CmdError, Controller}; -use bt_hci::controller::{ControllerCmdAsync, ControllerCmdSync}; +use bt_hci::controller::{CmdError, Controller, ControllerCmdAsync, ControllerCmdSync}; use bt_hci::data::{AclBroadcastFlag, AclPacket, AclPacketBoundary}; use bt_hci::event::le::LeEvent; use bt_hci::event::{Event, Vendor}; @@ -29,16 +19,25 @@ use bt_hci::param::{ InitiatingPhy, LeEventMask, Operation, PhyParams, ScanningPhy, }; use bt_hci::ControllerToHostPacket; -use core::future::pending; -use core::task::Poll; use embassy_futures::select::{select, Either}; use embassy_sync::blocking_mutex::raw::RawMutex; use embassy_sync::channel::Channel; use futures::pin_mut; use futures_intrusive::sync::LocalSemaphore; +use crate::advertise::{Advertisement, AdvertisementConfig, RawAdvertisement}; +use crate::channel_manager::ChannelManager; +use crate::connection::{ConnectConfig, Connection}; +use crate::connection_manager::{ConnectionInfo, ConnectionManager}; +use crate::cursor::{ReadCursor, WriteCursor}; +use crate::l2cap::sar::PacketReassembly; +use crate::packet_pool::{AllocId, DynamicPacketPool, PacketPool, Qos}; +use crate::pdu::Pdu; +use crate::scan::{PhySet, ScanConfig, ScanReport}; +use crate::types::l2cap::{L2capHeader, L2capLeSignal, L2CAP_CID_ATT, L2CAP_CID_DYN_START, L2CAP_CID_LE_U_SIGNAL}; #[cfg(feature = "gatt")] use crate::{attribute::AttributeTable, gatt::GattServer}; +use crate::{AdapterError, Address, Error}; pub struct HostResources { pool: PacketPool, diff --git a/host/src/advertise.rs b/host/src/advertise.rs index 8ff62818..b26f4fb2 100644 --- a/host/src/advertise.rs +++ b/host/src/advertise.rs @@ -1,13 +1,10 @@ -use crate::{ - codec, - cursor::{ReadCursor, WriteCursor}, - types::uuid::Uuid, - Address, -}; +pub use bt_hci::param::{AdvChannelMap, AdvFilterPolicy, PhyKind}; use bt_hci::param::{AdvEventProps, AdvHandle, AdvSet}; use embassy_time::Duration; -pub use bt_hci::param::{AdvChannelMap, AdvFilterPolicy, PhyKind}; +use crate::cursor::{ReadCursor, WriteCursor}; +use crate::types::uuid::Uuid; +use crate::{codec, Address}; #[cfg_attr(feature = "defmt", derive(defmt::Format))] #[derive(Eq, PartialEq, Copy, Clone)] diff --git a/host/src/attribute.rs b/host/src/attribute.rs index d81337f1..263562f6 100644 --- a/host/src/attribute.rs +++ b/host/src/attribute.rs @@ -1,9 +1,13 @@ -use core::{cell::RefCell, fmt}; +use core::cell::RefCell; +use core::fmt; -use embassy_sync::blocking_mutex::{raw::RawMutex, Mutex}; +use embassy_sync::blocking_mutex::raw::RawMutex; +use embassy_sync::blocking_mutex::Mutex; +use crate::att::AttErrorCode; +use crate::cursor::WriteCursor; pub use crate::types::uuid::Uuid; -use crate::{att::AttErrorCode, cursor::WriteCursor, Error}; +use crate::Error; pub const GENERIC_ACCESS_SERVICE_UUID16: Uuid = Uuid::Uuid16(0x1800u16.to_le_bytes()); pub const CHARACTERISTIC_DEVICE_NAME_UUID16: Uuid = Uuid::Uuid16(0x2A00u16.to_le_bytes()); diff --git a/host/src/attribute_server.rs b/host/src/attribute_server.rs index ef034935..71b51054 100644 --- a/host/src/attribute_server.rs +++ b/host/src/attribute_server.rs @@ -1,16 +1,15 @@ +use core::cell::RefCell; + use bt_hci::param::ConnHandle; use embassy_sync::blocking_mutex::raw::RawMutex; - -use crate::{ - att::{self, Att, AttDecodeError, AttErrorCode}, - attribute::{AttributeData, AttributeTable}, - codec, - cursor::WriteCursor, - types::uuid::Uuid, -}; -use core::cell::RefCell; use embassy_sync::blocking_mutex::Mutex; +use crate::att::{self, Att, AttDecodeError, AttErrorCode}; +use crate::attribute::{AttributeData, AttributeTable}; +use crate::codec; +use crate::cursor::WriteCursor; +use crate::types::uuid::Uuid; + #[derive(Debug, PartialEq)] pub enum WorkResult { DidWork, diff --git a/host/src/channel_manager.rs b/host/src/channel_manager.rs index c00b2af0..86b6e83c 100644 --- a/host/src/channel_manager.rs +++ b/host/src/channel_manager.rs @@ -1,27 +1,23 @@ -use core::{ - cell::RefCell, - future::poll_fn, - task::{Context, Poll}, -}; - -use bt_hci::{controller::Controller, param::ConnHandle}; -use embassy_sync::{ - blocking_mutex::{raw::RawMutex, Mutex}, - channel::Channel, - waitqueue::WakerRegistration, -}; - -use crate::{ - adapter::HciController, - cursor::{ReadCursor, WriteCursor}, - l2cap::L2capHeader, - packet_pool::{AllocId, DynamicPacketPool, Packet}, - pdu::Pdu, - types::l2cap::{ - L2capLeSignal, L2capLeSignalData, LeCreditConnReq, LeCreditConnRes, LeCreditConnResultCode, LeCreditFlowInd, - }, - AdapterError, Error, +use core::cell::RefCell; +use core::future::poll_fn; +use core::task::{Context, Poll}; + +use bt_hci::controller::Controller; +use bt_hci::param::ConnHandle; +use embassy_sync::blocking_mutex::raw::RawMutex; +use embassy_sync::blocking_mutex::Mutex; +use embassy_sync::channel::Channel; +use embassy_sync::waitqueue::WakerRegistration; + +use crate::adapter::HciController; +use crate::cursor::{ReadCursor, WriteCursor}; +use crate::packet_pool::{AllocId, DynamicPacketPool, Packet}; +use crate::pdu::Pdu; +use crate::types::l2cap::{ + L2capHeader, L2capLeSignal, L2capLeSignalData, LeCreditConnReq, LeCreditConnRes, LeCreditConnResultCode, + LeCreditFlowInd, }; +use crate::{AdapterError, Error}; const BASE_ID: u16 = 0x40; diff --git a/host/src/connection.rs b/host/src/connection.rs index adc9d1d4..efb37b6c 100644 --- a/host/src/connection.rs +++ b/host/src/connection.rs @@ -1,16 +1,15 @@ -use bt_hci::{ - cmd::{le::LeConnUpdate, link_control::Disconnect, status::ReadRssi}, - controller::{Controller, ControllerCmdAsync, ControllerCmdSync}, - param::{BdAddr, ConnHandle, DisconnectReason, LeConnRole}, -}; +use bt_hci::cmd::le::LeConnUpdate; +use bt_hci::cmd::link_control::Disconnect; +use bt_hci::cmd::status::ReadRssi; +use bt_hci::controller::{Controller, ControllerCmdAsync, ControllerCmdSync}; +use bt_hci::param::{BdAddr, ConnHandle, DisconnectReason, LeConnRole}; use embassy_sync::blocking_mutex::raw::RawMutex; +use embassy_time::Duration; use crate::adapter::Adapter; +pub use crate::connection_manager::ConnectionInfo; use crate::scan::ScanConfig; use crate::AdapterError; -use embassy_time::Duration; - -pub use crate::connection_manager::ConnectionInfo; #[derive(Clone)] pub struct Connection { diff --git a/host/src/connection_manager.rs b/host/src/connection_manager.rs index 4690b918..b37e30c8 100644 --- a/host/src/connection_manager.rs +++ b/host/src/connection_manager.rs @@ -1,15 +1,12 @@ -use core::{ - cell::RefCell, - future::poll_fn, - task::{Context, Poll}, -}; +use core::cell::RefCell; +use core::future::poll_fn; +use core::task::{Context, Poll}; use bt_hci::param::{AddrKind, BdAddr, ConnHandle, LeConnRole, Status}; -use embassy_sync::{ - blocking_mutex::{raw::RawMutex, Mutex}, - signal::Signal, - waitqueue::WakerRegistration, -}; +use embassy_sync::blocking_mutex::raw::RawMutex; +use embassy_sync::blocking_mutex::Mutex; +use embassy_sync::signal::Signal; +use embassy_sync::waitqueue::WakerRegistration; use crate::Error; diff --git a/host/src/gatt.rs b/host/src/gatt.rs index a1ad684a..e0912d86 100644 --- a/host/src/gatt.rs +++ b/host/src/gatt.rs @@ -1,5 +1,10 @@ use core::fmt; +use bt_hci::controller::Controller; +use bt_hci::param::ConnHandle; +use embassy_sync::blocking_mutex::raw::RawMutex; +use embassy_sync::channel::DynamicReceiver; + use crate::adapter::HciController; use crate::att::{self, Att, ATT_HANDLE_VALUE_NTF_OPTCODE}; use crate::attribute::CharacteristicHandle; @@ -10,10 +15,6 @@ use crate::cursor::WriteCursor; use crate::packet_pool::{AllocId, DynamicPacketPool}; use crate::pdu::Pdu; use crate::{AdapterError, Error}; -use bt_hci::controller::Controller; -use bt_hci::param::ConnHandle; -use embassy_sync::blocking_mutex::raw::RawMutex; -use embassy_sync::channel::DynamicReceiver; pub struct GattServer<'reference, 'values, 'resources, M: RawMutex, T: Controller, const MAX: usize> { pub(crate) server: AttributeServer<'reference, 'values, M, MAX>, diff --git a/host/src/l2cap.rs b/host/src/l2cap.rs index ff4f638c..1de815ab 100644 --- a/host/src/l2cap.rs +++ b/host/src/l2cap.rs @@ -1,140 +1,14 @@ -use core::cell::RefCell; - -use crate::adapter::Adapter; -pub use crate::channel_manager::CreditFlowPolicy; -use crate::codec; -use crate::connection::Connection; -use crate::cursor::ReadCursor; -use crate::packet_pool::Packet; -use crate::{AdapterError, Error}; use bt_hci::cmd::link_control::Disconnect; use bt_hci::controller::{Controller, ControllerCmdSync}; -use bt_hci::data::AclPacket; -use bt_hci::param::ConnHandle; -use bt_hci::param::DisconnectReason; +use bt_hci::param::{ConnHandle, DisconnectReason}; use embassy_sync::blocking_mutex::raw::RawMutex; -pub(crate) const L2CAP_CID_ATT: u16 = 0x0004; -pub(crate) const L2CAP_CID_LE_U_SIGNAL: u16 = 0x0005; -pub(crate) const L2CAP_CID_DYN_START: u16 = 0x0040; - -pub struct AssembledPacket<'d> { - packet: Packet<'d>, - written: usize, -} - -impl<'d> AssembledPacket<'d> { - pub(crate) fn new(packet: Packet<'d>, initial: usize) -> Self { - Self { - packet, - written: initial, - } - } - - pub(crate) fn write(&mut self, data: &[u8]) -> Result<(), Error> { - if self.written + data.len() > self.packet.len() { - return Err(Error::InsufficientSpace); - } - self.packet.as_mut()[self.written..self.written + data.len()].copy_from_slice(data); - self.written += data.len(); - Ok(()) - } - - pub(crate) fn len(&self) -> usize { - self.written - } - - pub(crate) fn finalize(self, header: L2capHeader) -> Result<(L2capHeader, Packet<'d>), Error> { - if header.length as usize != self.written { - return Err(Error::InvalidValue); - } - Ok((header, self.packet)) - } -} - -// Handles reassembling of packets -pub struct PacketReassembly<'d, const CONNS: usize> { - handles: RefCell<[Option<(ConnHandle, L2capHeader, AssembledPacket<'d>)>; CONNS]>, -} -impl<'d, const CONNS: usize> Default for PacketReassembly<'d, CONNS> { - fn default() -> Self { - Self::new() - } -} - -impl<'d, const CONNS: usize> PacketReassembly<'d, CONNS> { - const EMPTY: Option<(ConnHandle, L2capHeader, AssembledPacket<'d>)> = None; - pub fn new() -> Self { - Self { - handles: RefCell::new([Self::EMPTY; CONNS]), - } - } - - /// Initializes a reassembly for a given connection - /// - /// Returns InvalidState if there is already an ongoing reassembly for this connection - /// Returns InsufficientSpace if there is no space for this reassembly - pub fn init(&self, handle: ConnHandle, header: L2capHeader, p: Packet<'d>, initial: usize) -> Result<(), Error> { - let mut state = self.handles.borrow_mut(); - - // Sanity check - for entry in state.iter().flatten() { - if entry.0 == handle { - return Err(Error::InvalidState); - } - } - - // Sanity check - for entry in state.iter_mut() { - if entry.is_none() { - entry.replace((handle, header, AssembledPacket::new(p, initial))); - return Ok(()); - } - } - Err(Error::InsufficientSpace) - } - - /// Updates any in progress packet assembly for the connection - /// - /// If the reassembly is complete, the l2cap header + packet is returned. - pub fn update(&self, handle: ConnHandle, data: &[u8]) -> Result)>, Error> { - let mut state = self.handles.borrow_mut(); - - for entry in state.iter_mut() { - match entry { - Some((conn, header, packet)) if *conn == handle => { - let (conn, header, mut packet) = entry.take().unwrap(); - packet.write(data)?; - if packet.len() == header.length as usize { - return Ok(Some(packet.finalize(header)?)); - } else { - entry.replace((conn, header, packet)); - return Ok(None); - } - } - _ => {} - } - } - Err(Error::NotFound) - } -} - -#[cfg_attr(feature = "defmt", derive(defmt::Format))] -#[derive(Debug)] -pub struct L2capHeader { - pub length: u16, - pub channel: u16, -} +use crate::adapter::Adapter; +pub use crate::channel_manager::CreditFlowPolicy; +use crate::connection::Connection; +use crate::AdapterError; -impl L2capHeader { - pub fn decode<'m>(packet: &AclPacket<'m>) -> Result<(L2capHeader, &'m [u8]), codec::Error> { - let data = packet.data(); - let mut r = ReadCursor::new(data); - let length: u16 = r.read()?; - let channel: u16 = r.read()?; - Ok((Self { length, channel }, &packet.data()[4..])) - } -} +pub(crate) mod sar; #[derive(Clone)] pub struct L2capChannel { diff --git a/host/src/lib.rs b/host/src/lib.rs index 4444065c..848154a2 100644 --- a/host/src/lib.rs +++ b/host/src/lib.rs @@ -4,9 +4,8 @@ #![allow(unused_variables)] use advertise::AdvertisementDataError; -use bt_hci::FromHciBytesError; - pub use bt_hci::param::{AddrKind, BdAddr, LeConnRole as Role}; +use bt_hci::FromHciBytesError; mod fmt; diff --git a/host/src/packet_pool.rs b/host/src/packet_pool.rs index 4a5d5ae1..bd49ab97 100644 --- a/host/src/packet_pool.rs +++ b/host/src/packet_pool.rs @@ -1,8 +1,9 @@ use core::cell::{RefCell, UnsafeCell}; -use embassy_sync::blocking_mutex::{raw::RawMutex, Mutex}; +use embassy_sync::blocking_mutex::raw::RawMutex; +use embassy_sync::blocking_mutex::Mutex; -use crate::l2cap::{L2CAP_CID_ATT, L2CAP_CID_DYN_START}; +use crate::types::l2cap::{L2CAP_CID_ATT, L2CAP_CID_DYN_START}; // Generic client ID used by ATT PDU #[cfg(feature = "gatt")] diff --git a/host/src/scan.rs b/host/src/scan.rs index f21202a3..784343cc 100644 --- a/host/src/scan.rs +++ b/host/src/scan.rs @@ -1,8 +1,7 @@ -use bt_hci::{ - param::{AddrKind, BdAddr, LeAdvReport, LeExtAdvReport}, - FromHciBytes, FromHciBytesError, -}; use core::iter::FusedIterator; + +use bt_hci::param::{AddrKind, BdAddr, LeAdvReport, LeExtAdvReport}; +use bt_hci::{FromHciBytes, FromHciBytesError}; use embassy_time::Duration; use heapless::Vec; diff --git a/host/src/types/l2cap.rs b/host/src/types/l2cap.rs index 3bb58237..c912583d 100644 --- a/host/src/types/l2cap.rs +++ b/host/src/types/l2cap.rs @@ -1,9 +1,30 @@ -use crate::{ - codec::{Decode, Encode, Error, FixedSize, Type}, - cursor::{ReadCursor, WriteCursor}, -}; +use bt_hci::data::AclPacket; use trouble_host_macros::*; +use crate::codec::{self, Decode, Encode, Error, FixedSize, Type}; +use crate::cursor::{ReadCursor, WriteCursor}; + +pub(crate) const L2CAP_CID_ATT: u16 = 0x0004; +pub(crate) const L2CAP_CID_LE_U_SIGNAL: u16 = 0x0005; +pub(crate) const L2CAP_CID_DYN_START: u16 = 0x0040; + +#[cfg_attr(feature = "defmt", derive(defmt::Format))] +#[derive(Debug)] +pub struct L2capHeader { + pub length: u16, + pub channel: u16, +} + +impl L2capHeader { + pub fn decode<'m>(packet: &AclPacket<'m>) -> Result<(L2capHeader, &'m [u8]), codec::Error> { + let data = packet.data(); + let mut r = ReadCursor::new(data); + let length: u16 = r.read()?; + let channel: u16 = r.read()?; + Ok((Self { length, channel }, &packet.data()[4..])) + } +} + #[cfg_attr(feature = "defmt", derive(defmt::Format))] #[derive(Debug, Clone, Copy)] #[repr(u8)] diff --git a/host/tests/l2cap.rs b/host/tests/l2cap.rs index 302f0a4a..c4ac3567 100644 --- a/host/tests/l2cap.rs +++ b/host/tests/l2cap.rs @@ -3,20 +3,16 @@ use bt_hci::controller::ExternalController; use bt_hci::transport::SerialTransport; use embassy_sync::blocking_mutex::raw::NoopRawMutex; use embedded_io_adapters::tokio_1::FromTokio; -use tokio::io::ReadHalf; -use tokio::io::WriteHalf; +use tokio::io::{ReadHalf, WriteHalf}; use tokio::select; use tokio::time::Duration; -use tokio_serial::SerialStream; -use tokio_serial::{DataBits, Parity, StopBits}; -use trouble_host::{ - adapter::{Adapter, HostResources}, - advertise::{AdStructure, Advertisement, BR_EDR_NOT_SUPPORTED, LE_GENERAL_DISCOVERABLE}, - connection::ConnectConfig, - l2cap::L2capChannel, - scan::ScanConfig, - PacketQos, -}; +use tokio_serial::{DataBits, Parity, SerialStream, StopBits}; +use trouble_host::adapter::{Adapter, HostResources}; +use trouble_host::advertise::{AdStructure, Advertisement, BR_EDR_NOT_SUPPORTED, LE_GENERAL_DISCOVERABLE}; +use trouble_host::connection::ConnectConfig; +use trouble_host::l2cap::L2capChannel; +use trouble_host::scan::ScanConfig; +use trouble_host::PacketQos; const CONNECTIONS_MAX: usize = 1; const L2CAP_CHANNELS_MAX: usize = 3; diff --git a/rustfmt.toml b/rustfmt.toml index ca7c4ee6..b1d7c649 100644 --- a/rustfmt.toml +++ b/rustfmt.toml @@ -1,2 +1,4 @@ edition = "2021" max_width=120 +group_imports = "StdExternalCrate" +imports_granularity = "Module"