diff options
Diffstat (limited to 'examples/stm32wb/src/bin/gatt_server.rs')
| -rw-r--r-- | examples/stm32wb/src/bin/gatt_server.rs | 120 |
1 files changed, 56 insertions, 64 deletions
diff --git a/examples/stm32wb/src/bin/gatt_server.rs b/examples/stm32wb/src/bin/gatt_server.rs index 5d927bc00..3484f1844 100644 --- a/examples/stm32wb/src/bin/gatt_server.rs +++ b/examples/stm32wb/src/bin/gatt_server.rs | |||
| @@ -8,6 +8,7 @@ use embassy_executor::Spawner; | |||
| 8 | use embassy_stm32::bind_interrupts; | 8 | use embassy_stm32::bind_interrupts; |
| 9 | use embassy_stm32::ipcc::{Config, ReceiveInterruptHandler, TransmitInterruptHandler}; | 9 | use embassy_stm32::ipcc::{Config, ReceiveInterruptHandler, TransmitInterruptHandler}; |
| 10 | use embassy_stm32::rcc::WPAN_DEFAULT; | 10 | use embassy_stm32::rcc::WPAN_DEFAULT; |
| 11 | use embassy_stm32_wpan::TlMbox; | ||
| 11 | use embassy_stm32_wpan::hci::event::command::{CommandComplete, ReturnParameters}; | 12 | use embassy_stm32_wpan::hci::event::command::{CommandComplete, ReturnParameters}; |
| 12 | use embassy_stm32_wpan::hci::host::uart::{Packet, UartHci}; | 13 | use embassy_stm32_wpan::hci::host::uart::{Packet, UartHci}; |
| 13 | use embassy_stm32_wpan::hci::host::{AdvertisingFilterPolicy, EncryptionKey, HostHci, OwnAddressType}; | 14 | use embassy_stm32_wpan::hci::host::{AdvertisingFilterPolicy, EncryptionKey, HostHci, OwnAddressType}; |
| @@ -28,7 +29,6 @@ use embassy_stm32_wpan::hci::{BdAddr, Event}; | |||
| 28 | use embassy_stm32_wpan::lhci::LhciC1DeviceInformationCcrp; | 29 | use embassy_stm32_wpan::lhci::LhciC1DeviceInformationCcrp; |
| 29 | use embassy_stm32_wpan::sub::ble::Ble; | 30 | use embassy_stm32_wpan::sub::ble::Ble; |
| 30 | use embassy_stm32_wpan::sub::mm; | 31 | use embassy_stm32_wpan::sub::mm; |
| 31 | use embassy_stm32_wpan::TlMbox; | ||
| 32 | use {defmt_rtt as _, panic_probe as _}; | 32 | use {defmt_rtt as _, panic_probe as _}; |
| 33 | 33 | ||
| 34 | bind_interrupts!(struct Irqs{ | 34 | bind_interrupts!(struct Irqs{ |
| @@ -69,92 +69,85 @@ async fn main(spawner: Spawner) { | |||
| 69 | info!("Hello World!"); | 69 | info!("Hello World!"); |
| 70 | 70 | ||
| 71 | let config = Config::default(); | 71 | let config = Config::default(); |
| 72 | let mut mbox = TlMbox::init(p.IPCC, Irqs, config); | 72 | let mbox = TlMbox::init(p.IPCC, Irqs, config).await; |
| 73 | let mut sys = mbox.sys_subsystem; | ||
| 74 | let mut ble = mbox.ble_subsystem; | ||
| 73 | 75 | ||
| 74 | spawner.spawn(run_mm_queue(mbox.mm_subsystem).unwrap()); | 76 | spawner.spawn(run_mm_queue(mbox.mm_subsystem).unwrap()); |
| 75 | let sys_event = mbox.sys_subsystem.read().await; | ||
| 76 | info!("sys event: {}", sys_event.payload()); | ||
| 77 | 77 | ||
| 78 | let _ = mbox.sys_subsystem.shci_c2_ble_init(Default::default()).await; | 78 | let _ = sys.shci_c2_ble_init(Default::default()).await; |
| 79 | 79 | ||
| 80 | info!("resetting BLE..."); | 80 | info!("resetting BLE..."); |
| 81 | mbox.ble_subsystem.reset().await; | 81 | ble.reset().await; |
| 82 | let response = mbox.ble_subsystem.read().await; | 82 | let response = ble.read().await; |
| 83 | defmt::debug!("{}", response); | 83 | defmt::debug!("{}", response); |
| 84 | 84 | ||
| 85 | info!("config public address..."); | 85 | info!("config public address..."); |
| 86 | mbox.ble_subsystem | 86 | ble.write_config_data(&ConfigData::public_address(get_bd_addr()).build()) |
| 87 | .write_config_data(&ConfigData::public_address(get_bd_addr()).build()) | ||
| 88 | .await; | 87 | .await; |
| 89 | let response = mbox.ble_subsystem.read().await; | 88 | let response = ble.read().await; |
| 90 | defmt::debug!("{}", response); | 89 | defmt::debug!("{}", response); |
| 91 | 90 | ||
| 92 | info!("config random address..."); | 91 | info!("config random address..."); |
| 93 | mbox.ble_subsystem | 92 | ble.write_config_data(&ConfigData::random_address(get_random_addr()).build()) |
| 94 | .write_config_data(&ConfigData::random_address(get_random_addr()).build()) | ||
| 95 | .await; | 93 | .await; |
| 96 | let response = mbox.ble_subsystem.read().await; | 94 | let response = ble.read().await; |
| 97 | defmt::debug!("{}", response); | 95 | defmt::debug!("{}", response); |
| 98 | 96 | ||
| 99 | info!("config identity root..."); | 97 | info!("config identity root..."); |
| 100 | mbox.ble_subsystem | 98 | ble.write_config_data(&ConfigData::identity_root(&get_irk()).build()) |
| 101 | .write_config_data(&ConfigData::identity_root(&get_irk()).build()) | ||
| 102 | .await; | 99 | .await; |
| 103 | let response = mbox.ble_subsystem.read().await; | 100 | let response = ble.read().await; |
| 104 | defmt::debug!("{}", response); | 101 | defmt::debug!("{}", response); |
| 105 | 102 | ||
| 106 | info!("config encryption root..."); | 103 | info!("config encryption root..."); |
| 107 | mbox.ble_subsystem | 104 | ble.write_config_data(&ConfigData::encryption_root(&get_erk()).build()) |
| 108 | .write_config_data(&ConfigData::encryption_root(&get_erk()).build()) | ||
| 109 | .await; | 105 | .await; |
| 110 | let response = mbox.ble_subsystem.read().await; | 106 | let response = ble.read().await; |
| 111 | defmt::debug!("{}", response); | 107 | defmt::debug!("{}", response); |
| 112 | 108 | ||
| 113 | info!("config tx power level..."); | 109 | info!("config tx power level..."); |
| 114 | mbox.ble_subsystem.set_tx_power_level(PowerLevel::ZerodBm).await; | 110 | ble.set_tx_power_level(PowerLevel::ZerodBm).await; |
| 115 | let response = mbox.ble_subsystem.read().await; | 111 | let response = ble.read().await; |
| 116 | defmt::debug!("{}", response); | 112 | defmt::debug!("{}", response); |
| 117 | 113 | ||
| 118 | info!("GATT init..."); | 114 | info!("GATT init..."); |
| 119 | mbox.ble_subsystem.init_gatt().await; | 115 | ble.init_gatt().await; |
| 120 | let response = mbox.ble_subsystem.read().await; | 116 | let response = ble.read().await; |
| 121 | defmt::debug!("{}", response); | 117 | defmt::debug!("{}", response); |
| 122 | 118 | ||
| 123 | info!("GAP init..."); | 119 | info!("GAP init..."); |
| 124 | mbox.ble_subsystem | 120 | ble.init_gap(Role::PERIPHERAL, false, BLE_GAP_DEVICE_NAME_LENGTH).await; |
| 125 | .init_gap(Role::PERIPHERAL, false, BLE_GAP_DEVICE_NAME_LENGTH) | 121 | let response = ble.read().await; |
| 126 | .await; | ||
| 127 | let response = mbox.ble_subsystem.read().await; | ||
| 128 | defmt::debug!("{}", response); | 122 | defmt::debug!("{}", response); |
| 129 | 123 | ||
| 130 | info!("set IO capabilities..."); | 124 | info!("set IO capabilities..."); |
| 131 | mbox.ble_subsystem.set_io_capability(IoCapability::DisplayConfirm).await; | 125 | ble.set_io_capability(IoCapability::DisplayConfirm).await; |
| 132 | let response = mbox.ble_subsystem.read().await; | 126 | let response = ble.read().await; |
| 133 | defmt::debug!("{}", response); | 127 | defmt::debug!("{}", response); |
| 134 | 128 | ||
| 135 | info!("set authentication requirements..."); | 129 | info!("set authentication requirements..."); |
| 136 | mbox.ble_subsystem | 130 | ble.set_authentication_requirement(&AuthenticationRequirements { |
| 137 | .set_authentication_requirement(&AuthenticationRequirements { | 131 | bonding_required: false, |
| 138 | bonding_required: false, | 132 | keypress_notification_support: false, |
| 139 | keypress_notification_support: false, | 133 | mitm_protection_required: false, |
| 140 | mitm_protection_required: false, | 134 | encryption_key_size_range: (8, 16), |
| 141 | encryption_key_size_range: (8, 16), | 135 | fixed_pin: Pin::Requested, |
| 142 | fixed_pin: Pin::Requested, | 136 | identity_address_type: AddressType::Public, |
| 143 | identity_address_type: AddressType::Public, | 137 | secure_connection_support: SecureConnectionSupport::Optional, |
| 144 | secure_connection_support: SecureConnectionSupport::Optional, | 138 | }) |
| 145 | }) | 139 | .await |
| 146 | .await | 140 | .unwrap(); |
| 147 | .unwrap(); | 141 | let response = ble.read().await; |
| 148 | let response = mbox.ble_subsystem.read().await; | ||
| 149 | defmt::debug!("{}", response); | 142 | defmt::debug!("{}", response); |
| 150 | 143 | ||
| 151 | info!("set scan response data..."); | 144 | info!("set scan response data..."); |
| 152 | mbox.ble_subsystem.le_set_scan_response_data(b"TXTX").await.unwrap(); | 145 | ble.le_set_scan_response_data(b"TXTX").await.unwrap(); |
| 153 | let response = mbox.ble_subsystem.read().await; | 146 | let response = ble.read().await; |
| 154 | defmt::debug!("{}", response); | 147 | defmt::debug!("{}", response); |
| 155 | 148 | ||
| 156 | defmt::info!("initializing services and characteristics..."); | 149 | defmt::info!("initializing services and characteristics..."); |
| 157 | let mut ble_context = init_gatt_services(&mut mbox.ble_subsystem).await.unwrap(); | 150 | let mut ble_context = init_gatt_services(&mut ble).await.unwrap(); |
| 158 | defmt::info!("{}", ble_context); | 151 | defmt::info!("{}", ble_context); |
| 159 | 152 | ||
| 160 | let discovery_params = DiscoverableParameters { | 153 | let discovery_params = DiscoverableParameters { |
| @@ -168,12 +161,12 @@ async fn main(spawner: Spawner) { | |||
| 168 | }; | 161 | }; |
| 169 | 162 | ||
| 170 | info!("set discoverable..."); | 163 | info!("set discoverable..."); |
| 171 | mbox.ble_subsystem.set_discoverable(&discovery_params).await.unwrap(); | 164 | ble.set_discoverable(&discovery_params).await.unwrap(); |
| 172 | let response = mbox.ble_subsystem.read().await; | 165 | let response = ble.read().await; |
| 173 | defmt::debug!("{}", response); | 166 | defmt::debug!("{}", response); |
| 174 | 167 | ||
| 175 | loop { | 168 | loop { |
| 176 | let response = mbox.ble_subsystem.read().await; | 169 | let response = ble.read().await; |
| 177 | defmt::debug!("{}", response); | 170 | defmt::debug!("{}", response); |
| 178 | 171 | ||
| 179 | if let Ok(Packet::Event(event)) = response { | 172 | if let Ok(Packet::Event(event)) = response { |
| @@ -184,24 +177,23 @@ async fn main(spawner: Spawner) { | |||
| 184 | Event::DisconnectionComplete(_) => { | 177 | Event::DisconnectionComplete(_) => { |
| 185 | defmt::info!("disconnected"); | 178 | defmt::info!("disconnected"); |
| 186 | ble_context.is_subscribed = false; | 179 | ble_context.is_subscribed = false; |
| 187 | mbox.ble_subsystem.set_discoverable(&discovery_params).await.unwrap(); | 180 | ble.set_discoverable(&discovery_params).await.unwrap(); |
| 188 | } | 181 | } |
| 189 | Event::Vendor(vendor_event) => match vendor_event { | 182 | Event::Vendor(vendor_event) => match vendor_event { |
| 190 | VendorEvent::AttReadPermitRequest(read_req) => { | 183 | VendorEvent::AttReadPermitRequest(read_req) => { |
| 191 | defmt::info!("read request received {}, allowing", read_req); | 184 | defmt::info!("read request received {}, allowing", read_req); |
| 192 | mbox.ble_subsystem.allow_read(read_req.conn_handle).await | 185 | ble.allow_read(read_req.conn_handle).await |
| 193 | } | 186 | } |
| 194 | VendorEvent::AttWritePermitRequest(write_req) => { | 187 | VendorEvent::AttWritePermitRequest(write_req) => { |
| 195 | defmt::info!("write request received {}, allowing", write_req); | 188 | defmt::info!("write request received {}, allowing", write_req); |
| 196 | mbox.ble_subsystem | 189 | ble.write_response(&WriteResponseParameters { |
| 197 | .write_response(&WriteResponseParameters { | 190 | conn_handle: write_req.conn_handle, |
| 198 | conn_handle: write_req.conn_handle, | 191 | attribute_handle: write_req.attribute_handle, |
| 199 | attribute_handle: write_req.attribute_handle, | 192 | status: Ok(()), |
| 200 | status: Ok(()), | 193 | value: write_req.value(), |
| 201 | value: write_req.value(), | 194 | }) |
| 202 | }) | 195 | .await |
| 203 | .await | 196 | .unwrap() |
| 204 | .unwrap() | ||
| 205 | } | 197 | } |
| 206 | VendorEvent::GattAttributeModified(attribute) => { | 198 | VendorEvent::GattAttributeModified(attribute) => { |
| 207 | defmt::info!("{}", ble_context); | 199 | defmt::info!("{}", ble_context); |
| @@ -224,7 +216,7 @@ async fn main(spawner: Spawner) { | |||
| 224 | } | 216 | } |
| 225 | 217 | ||
| 226 | #[embassy_executor::task] | 218 | #[embassy_executor::task] |
| 227 | async fn run_mm_queue(memory_manager: mm::MemoryManager) { | 219 | async fn run_mm_queue(mut memory_manager: mm::MemoryManager<'static>) { |
| 228 | memory_manager.run_queue().await; | 220 | memory_manager.run_queue().await; |
| 229 | } | 221 | } |
| 230 | 222 | ||
| @@ -285,7 +277,7 @@ pub struct CharHandles { | |||
| 285 | pub notify: AttributeHandle, | 277 | pub notify: AttributeHandle, |
| 286 | } | 278 | } |
| 287 | 279 | ||
| 288 | pub async fn init_gatt_services(ble_subsystem: &mut Ble) -> Result<BleContext, ()> { | 280 | pub async fn init_gatt_services<'a>(ble_subsystem: &mut Ble<'a>) -> Result<BleContext, ()> { |
| 289 | let service_handle = gatt_add_service(ble_subsystem, Uuid::Uuid16(0x500)).await?; | 281 | let service_handle = gatt_add_service(ble_subsystem, Uuid::Uuid16(0x500)).await?; |
| 290 | 282 | ||
| 291 | let read = gatt_add_char( | 283 | let read = gatt_add_char( |
| @@ -322,7 +314,7 @@ pub async fn init_gatt_services(ble_subsystem: &mut Ble) -> Result<BleContext, ( | |||
| 322 | }) | 314 | }) |
| 323 | } | 315 | } |
| 324 | 316 | ||
| 325 | async fn gatt_add_service(ble_subsystem: &mut Ble, uuid: Uuid) -> Result<AttributeHandle, ()> { | 317 | async fn gatt_add_service<'a>(ble_subsystem: &mut Ble<'a>, uuid: Uuid) -> Result<AttributeHandle, ()> { |
| 326 | ble_subsystem | 318 | ble_subsystem |
| 327 | .add_service(&AddServiceParameters { | 319 | .add_service(&AddServiceParameters { |
| 328 | uuid, | 320 | uuid, |
| @@ -348,8 +340,8 @@ async fn gatt_add_service(ble_subsystem: &mut Ble, uuid: Uuid) -> Result<Attribu | |||
| 348 | } | 340 | } |
| 349 | } | 341 | } |
| 350 | 342 | ||
| 351 | async fn gatt_add_char( | 343 | async fn gatt_add_char<'a>( |
| 352 | ble_subsystem: &mut Ble, | 344 | ble_subsystem: &mut Ble<'a>, |
| 353 | service_handle: AttributeHandle, | 345 | service_handle: AttributeHandle, |
| 354 | characteristic_uuid: Uuid, | 346 | characteristic_uuid: Uuid, |
| 355 | characteristic_properties: CharacteristicProperty, | 347 | characteristic_properties: CharacteristicProperty, |
