From 089ac163370780282c9bf4e772831d404fcda418 Mon Sep 17 00:00:00 2001 From: bjoernQ Date: Wed, 24 May 2023 09:38:47 +0200 Subject: [PATCH 1/3] Fix unit tests --- bleps-macros/tests/macro_test.rs | 20 ++++++++++++++++---- bleps/tests/test_ble.rs | 31 ++++++++++++++++--------------- 2 files changed, 32 insertions(+), 19 deletions(-) diff --git a/bleps-macros/tests/macro_test.rs b/bleps-macros/tests/macro_test.rs index 15c5438..4679af1 100644 --- a/bleps-macros/tests/macro_test.rs +++ b/bleps-macros/tests/macro_test.rs @@ -2,7 +2,10 @@ use bleps_macros::gatt; #[test] fn test() { - let mut my_read_function = || &b"Hello"[..]; + let mut my_read_function = |_offset: usize, data: &mut [u8]| { + data[..5].copy_from_slice(&b"Hola!"[..]); + 5 + }; let mut my_write_function = |_offset, data: &[u8]| { println!("{:?}", data); }; @@ -21,7 +24,10 @@ fn test() { #[test] fn test2() { - let mut my_read_function = || &b"Hello"[..]; + let mut my_read_function = |_offset: usize, data: &mut [u8]| { + data[..6].copy_from_slice(&b"Hello!"[..]); + 6 + }; let mut my_write_function = |_offset, data: &[u8]| { println!("{:?}", data); }; @@ -40,7 +46,10 @@ fn test2() { #[test] fn test3() { - let mut my_read_function = || &b"Hello"[..]; + let mut my_read_function = |_offset: usize, data: &mut [u8]| { + data[..5].copy_from_slice(&b"Hola!"[..]); + 5 + }; let mut my_write_function = |_offset, data: &[u8]| { println!("{:?}", data); }; @@ -60,7 +69,10 @@ fn test3() { #[test] fn test4() { - let mut my_read_function = || &b"Hello"[..]; + let mut my_read_function = |_offset: usize, data: &mut [u8]| { + data[..5].copy_from_slice(&b"Hola!"[..]); + 5 + }; let mut my_write_function = |_offset, data: &[u8]| { println!("{:?}", data); }; diff --git a/bleps/tests/test_ble.rs b/bleps/tests/test_ble.rs index e2109bb..ec24c56 100644 --- a/bleps/tests/test_ble.rs +++ b/bleps/tests/test_ble.rs @@ -5,16 +5,16 @@ use std::{assert_matches::assert_matches, cell::RefCell}; extern crate std; use bleps::{ - acl::{encode_acl_packet, AclPacket, BoundaryFlag, ControllerBroadcastFlag, HostBroadcastFlag}, + acl::{AclPacket, BoundaryFlag, ControllerBroadcastFlag, HostBroadcastFlag}, ad_structure::{ create_advertising_data, AdStructure, BR_EDR_NOT_SUPPORTED, LE_GENERAL_DISCOVERABLE, }, - att::{parse_att, Att, AttErrorCode, Uuid, ATT_READ_BY_GROUP_TYPE_REQUEST_OPCODE}, + att::{Att, AttErrorCode, Uuid, ATT_READ_BY_GROUP_TYPE_REQUEST_OPCODE}, attribute::Attribute, attribute_server::{AttributeServer, CHARACTERISTIC_UUID16, PRIMARY_SERVICE_UUID16}, - command::{create_command_data, Command, CommandHeader}, + command::{Command, CommandHeader}, event::{ErrorCode, EventType}, - l2cap::{encode_l2cap, parse_l2cap}, + l2cap::L2capPacket, Ble, Data, HciConnection, PollResult, }; @@ -243,14 +243,14 @@ pub fn command_header_set_adv_param_works() { #[test] fn create_reset_command_works() { - let data = create_command_data(Command::Reset); + let data = Command::Reset.encode(); assert_eq!(data.len, 4); assert_eq!(data.data[0..4], [0x01, 0x03, 0x0c, 0x00]); } #[test] fn create_le_set_advertising_parameters_works() { - let data = create_command_data(Command::LeSetAdvertisingParameters); + let data = Command::LeSetAdvertisingParameters.encode(); assert_eq!(data.len, 19); assert_eq!( data.data[..19], @@ -272,9 +272,10 @@ fn set_advertising_parameters_works() { #[test] fn create_le_set_advertising_data_works() { - let data = create_command_data(Command::LeSetAdvertisingData { + let data = Command::LeSetAdvertisingData { data: Data::new(&[1, 2, 3, 4, 5]), - }); + } + .encode(); assert_eq!(data.len, 9); assert_eq!(data.data[..9], [0x01, 0x08, 0x20, 0x05, 1, 2, 3, 4, 5]); } @@ -293,7 +294,7 @@ fn le_set_advertising_data_works() { #[test] fn create_le_set_advertise_enable_works() { - let data = create_command_data(Command::LeSetAdvertiseEnable(true)); + let data = Command::LeSetAdvertiseEnable(true).encode(); assert_eq!(data.len, 5); assert_eq!(data.data[..5], [0x01, 0x0a, 0x20, 0x01, 0x01]); } @@ -385,7 +386,7 @@ fn receiving_read_by_group_type_works() { Some(res) => match res { PollResult::Event(_) => assert!(true, "Expected async data"), PollResult::AsyncData(res) => { - let res = parse_att(parse_l2cap(res).unwrap().1); + let res = Att::decode(L2capPacket::decode(res).unwrap().1); assert_matches!( res, Ok(Att::ReadByGroupTypeReq { @@ -417,8 +418,8 @@ fn create_read_by_group_type_resp_acl_works() { let mut res = Data::new_att_read_by_group_type_response(); res.append_att_read_by_group_type_response(0x0001, 0x0010, &Uuid::Uuid16(0x1801)); res.append_att_read_by_group_type_response(0x0020, 0x0030, &Uuid::Uuid16(0x1802)); - let res = encode_l2cap(res); - let res = encode_acl_packet( + let res = L2capPacket::encode(res); + let res = AclPacket::encode( 0x0000, BoundaryFlag::FirstAutoFlushable, HostBroadcastFlag::NoBroadcast, @@ -460,7 +461,7 @@ fn receiving_read_by_type_works() { Some(res) => match res { PollResult::Event(_) => assert!(true, "Expected async data"), PollResult::AsyncData(res) => { - let res = parse_att(parse_l2cap(res).unwrap().1); + let res = Att::decode(L2capPacket::decode(res).unwrap().1); assert_matches!( res, Ok(Att::ReadByTypeReq { @@ -506,7 +507,7 @@ fn receiving_read_works() { Some(res) => match res { PollResult::Event(_) => assert!(true, "Expected async data"), PollResult::AsyncData(res) => { - let res = parse_att(parse_l2cap(res).unwrap().1); + let res = Att::decode(L2capPacket::decode(res).unwrap().1); assert_matches!(res, Ok(Att::ReadReq { handle: 0x03 })) } }, @@ -536,7 +537,7 @@ fn receiving_write_works() { Some(res) => match res { PollResult::Event(_) => assert!(true, "Expected async data"), PollResult::AsyncData(res) => { - let res = parse_att(parse_l2cap(res).unwrap().1); + let res = Att::decode(L2capPacket::decode(res).unwrap().1); assert_matches!( res, Ok(Att::WriteReq { From ca1e89f93992e966e0f832cd141244f24195a8df Mon Sep 17 00:00:00 2001 From: bjoernQ Date: Wed, 24 May 2023 10:31:03 +0200 Subject: [PATCH 2/3] Update dependencies --- esp32s3-serial-hci/Cargo.toml | 15 +++++--------- esp32s3-serial-hci/src/main.rs | 36 +++++++++++++++++++++++----------- 2 files changed, 30 insertions(+), 21 deletions(-) diff --git a/esp32s3-serial-hci/Cargo.toml b/esp32s3-serial-hci/Cargo.toml index 2e56415..b173056 100644 --- a/esp32s3-serial-hci/Cargo.toml +++ b/esp32s3-serial-hci/Cargo.toml @@ -9,14 +9,9 @@ license = "MIT OR Apache-2.0" opt-level = 3 [dependencies] -esp32s3-hal = "0.4.0" -esp-backtrace = { version = "0.4.0", features = ["esp32s3", "panic-handler", "print-uart"] } -esp-println = { version = "0.3.1", features = [ "esp32s3", "log" ] } -xtensa-lx-rt = { version = "0.14.0", features = ["esp32s3"], optional = true } -esp-wifi = { git = "https://github.com/esp-rs/esp-wifi", rev = "dbcd5ea4989ff7c295b799c1beb6ffecd78518e3", features = ["esp32s3", "ble"] } -embedded-io = "0.3.1" +esp32s3-hal = "0.9.0" +esp-backtrace = { version = "0.7.0", features = ["esp32s3", "panic-handler", "print-uart"] } +esp-println = { version = "0.5.0", features = [ "esp32s3", "log" ] } +esp-wifi = { git = "https://github.com/esp-rs/esp-wifi", rev = "dad30df82aabc76e81c341845f260d5049e0f304", features = ["esp32s3", "ble"] } +embedded-io = "0.4.0" log = "0.4.17" - -[features] -default = ["rt"] -rt = ["xtensa-lx-rt"] diff --git a/esp32s3-serial-hci/src/main.rs b/esp32s3-serial-hci/src/main.rs index 3c6c407..8f097ce 100644 --- a/esp32s3-serial-hci/src/main.rs +++ b/esp32s3-serial-hci/src/main.rs @@ -6,10 +6,10 @@ use embedded_io::blocking::{Read, Write}; use esp32s3_hal::{ clock::{ClockControl, CpuClock}, - pac::Peripherals, + peripherals::Peripherals, prelude::*, timer::TimerGroup, - Rng, Rtc, Serial, + Rng, Rtc, Uart, }; use esp_backtrace as _; use esp_println::logger::init_logger; @@ -17,31 +17,45 @@ use esp_wifi::ble::controller::BleConnector; const CNT: usize = 5000; -#[xtensa_lx_rt::entry] +#[entry] fn main() -> ! { init_logger(log::LevelFilter::Off); - esp_wifi::init_heap(); - let peripherals = Peripherals::take().unwrap(); - let system = peripherals.SYSTEM.split(); + let peripherals = Peripherals::take(); + let mut system = peripherals.SYSTEM.split(); let clocks = ClockControl::configure(system.clock_control, CpuClock::Clock240MHz).freeze(); // Disable the RTC and TIMG watchdog timers let mut rtc = Rtc::new(peripherals.RTC_CNTL); - let timer_group0 = TimerGroup::new(peripherals.TIMG0, &clocks); + let timer_group0 = TimerGroup::new( + peripherals.TIMG0, + &clocks, + &mut system.peripheral_clock_control, + ); let mut wdt0 = timer_group0.wdt; - let timer_group1 = TimerGroup::new(peripherals.TIMG1, &clocks); + let timer_group1 = TimerGroup::new( + peripherals.TIMG1, + &clocks, + &mut system.peripheral_clock_control, + ); let mut wdt1 = timer_group1.wdt; rtc.rwdt.disable(); wdt0.disable(); wdt1.disable(); - esp_wifi::initialize(timer_group1.timer0, Rng::new(peripherals.RNG), &clocks).unwrap(); + let bt = peripherals.RADIO.split().1; + esp_wifi::initialize( + timer_group1.timer0, + Rng::new(peripherals.RNG), + system.radio_clock_control, + &clocks, + ) + .unwrap(); - let mut connector = BleConnector {}; + let mut connector = BleConnector::new(bt); - let mut serial = Serial::new(peripherals.UART0); + let mut serial = Uart::new(peripherals.UART0, &mut system.peripheral_clock_control); serial.write(0xff).unwrap(); From a2f24024ab8d5dae62df5cd27bc74f2494aa72e0 Mon Sep 17 00:00:00 2001 From: bjoernQ Date: Wed, 24 May 2023 10:31:57 +0200 Subject: [PATCH 3/3] Make create_advertising_data failable --- bleps/src/ad_structure.rs | 13 +++++++++++-- bleps/tests/test_ble.rs | 24 +++++++++++++++++++----- example/src/main.rs | 13 ++++++++----- 3 files changed, 38 insertions(+), 12 deletions(-) diff --git a/bleps/src/ad_structure.rs b/bleps/src/ad_structure.rs index a13637b..85f60a3 100644 --- a/bleps/src/ad_structure.rs +++ b/bleps/src/ad_structure.rs @@ -6,6 +6,11 @@ pub const BR_EDR_NOT_SUPPORTED: u8 = 0b00000100; pub const SIMUL_LE_BR_CONTROLLER: u8 = 0b00001000; pub const SIMUL_LE_BR_HOST: u8 = 0b00010000; +#[derive(Debug, Copy, Clone)] +pub enum AdvertisementDataError { + TooLong, +} + #[derive(Debug, Copy, Clone)] pub enum AdStructure<'a> { /// Device flags and baseband capabilities. @@ -94,7 +99,7 @@ impl Data { } } -pub fn create_advertising_data(ad: &[AdStructure]) -> Data { +pub fn create_advertising_data(ad: &[AdStructure]) -> Result { let mut data = Data::default(); data.append(&[0]); @@ -105,9 +110,13 @@ pub fn create_advertising_data(ad: &[AdStructure]) -> Data { let len = data.len - 1; data.set(0, len as u8); + if len > 31 { + return Err(AdvertisementDataError::TooLong); + } + for _ in 0..(31 - len) { data.append(&[0]); } - data + Ok(data) } diff --git a/bleps/tests/test_ble.rs b/bleps/tests/test_ble.rs index ec24c56..00960e8 100644 --- a/bleps/tests/test_ble.rs +++ b/bleps/tests/test_ble.rs @@ -4,6 +4,7 @@ use std::{assert_matches::assert_matches, cell::RefCell}; extern crate std; +use bleps::ad_structure::AdvertisementDataError; use bleps::{ acl::{AclPacket, BoundaryFlag, ControllerBroadcastFlag, HostBroadcastFlag}, ad_structure::{ @@ -563,21 +564,34 @@ fn create_advertising_data_works() { let res = create_advertising_data(&[ AdStructure::Flags(LE_GENERAL_DISCOVERABLE | BR_EDR_NOT_SUPPORTED), AdStructure::ServiceUuids16(&[Uuid::Uuid16(0x1809)]), - AdStructure::CompleteLocalName("BL-602 Ble-Example!"), - ]); + AdStructure::CompleteLocalName("Ble-Example!"), + ]) + .unwrap(); println!("{:x?}", res); assert_matches!( res.as_slice(), &[ - 0x1c, 0x02, 0x01, 0x06, 0x03, 0x02, 0x09, 0x18, 0x14, 0x09, 0x42, 0x4C, 0x2D, 0x36, - 0x30, 0x32, 0x20, 0x42, 0x6C, 0x65, 0x2D, 0x45, 0x78, 0x61, 0x6D, 0x70, 0x6C, 0x65, - 0x21, 0x00, 0x00, 0x00 + 21, 2, 1, 6, 3, 2, 9, 24, 13, 9, 66, 108, 101, 45, 69, 120, 97, 109, 112, 108, 101, 33, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] ); } +#[test] +fn create_advertising_data_fails() { + let res = create_advertising_data(&[ + AdStructure::Flags(LE_GENERAL_DISCOVERABLE | BR_EDR_NOT_SUPPORTED), + AdStructure::ServiceUuids16(&[Uuid::Uuid16(0x1809)]), + AdStructure::CompleteLocalName( + "Ble-Example!Ble-Example!Ble-Example!Ble-Example!Ble-Example!Ble-Example!Ble-Example!", + ), + ]); + + assert_matches!(res, Err(AdvertisementDataError::TooLong)); +} + #[test] fn attribute_server_discover_two_services() { let connector = connector(); diff --git a/example/src/main.rs b/example/src/main.rs index e71b85e..fec4c6a 100644 --- a/example/src/main.rs +++ b/example/src/main.rs @@ -64,11 +64,14 @@ fn main() { println!("{:?}", ble.cmd_set_le_advertising_parameters()); println!( "{:?}", - ble.cmd_set_le_advertising_data(create_advertising_data(&[ - AdStructure::Flags(LE_GENERAL_DISCOVERABLE | BR_EDR_NOT_SUPPORTED), - AdStructure::ServiceUuids16(&[Uuid::Uuid16(0x1809)]), - AdStructure::CompleteLocalName("BLEPS"), - ])) + ble.cmd_set_le_advertising_data( + create_advertising_data(&[ + AdStructure::Flags(LE_GENERAL_DISCOVERABLE | BR_EDR_NOT_SUPPORTED), + AdStructure::ServiceUuids16(&[Uuid::Uuid16(0x1809)]), + AdStructure::CompleteLocalName("BLEPS"), + ]) + .unwrap() + ) ); println!("{:?}", ble.cmd_set_le_advertise_enable(true));