diff options
author | Ulf Lilleengen <ulf.lilleengen@gmail.com> | 2021-10-06 18:43:55 +0200 |
---|---|---|
committer | Ulf Lilleengen <ulf.lilleengen@gmail.com> | 2021-10-06 18:43:55 +0200 |
commit | 8d78ed20f1313d00d8727f41383413a13c23d457 (patch) | |
tree | 754cfb7251bbf7d727b54aa4c82926554e312f76 | |
parent | 230d133f4d6e02d2631a3fcdcebe7675764c17fb (diff) | |
download | nrf-softdevice-8d78ed20f1313d00d8727f41383413a13c23d457.zip |
Simplify API
-rw-r--r-- | examples/src/bin/ble_bas_peripheral.rs | 52 | ||||
-rw-r--r-- | nrf-softdevice-macro/src/lib.rs | 18 | ||||
-rw-r--r-- | nrf-softdevice/src/ble/gatt_server.rs | 9 |
3 files changed, 41 insertions, 38 deletions
diff --git a/examples/src/bin/ble_bas_peripheral.rs b/examples/src/bin/ble_bas_peripheral.rs index 2b8fe8a..c8b70a0 100644 --- a/examples/src/bin/ble_bas_peripheral.rs +++ b/examples/src/bin/ble_bas_peripheral.rs @@ -14,7 +14,10 @@ use defmt::*; use embassy::executor::Executor; use embassy::util::Forever; -use nrf_softdevice::ble::{gatt_server::{self, Server}, peripheral}; +use nrf_softdevice::ble::{ + gatt_server::{self, Server}, + peripheral, +}; use nrf_softdevice::{raw, Softdevice}; static EXECUTOR: Forever<Executor> = Forever::new(); @@ -57,31 +60,32 @@ async fn bluetooth_task(sd: &'static Softdevice) { info!("advertising done!"); // Run the GATT server on the connection. This returns when the connection gets disconnected. - let res = gatt_server::run(&conn, |e| { - server.on_event(&e, |e| match e { - BatteryServiceEvent::BatteryLevelWrite(val) => { - info!("wrote battery level: {}", val); - if let Err(e) = server.battery_level_notify(&conn, val + 1) { - info!("send notification error: {:?}", e); - } + let res = gatt_server::run(&conn, |e| match server.on_event(e) { + Some(BatteryServiceEvent::BatteryLevelWrite(val)) => { + info!("wrote battery level: {}", val); + if let Err(e) = server.battery_level_notify(&conn, val + 1) { + info!("send notification error: {:?}", e); } - BatteryServiceEvent::FooWrite(val) => { - info!("wrote battery level: {}", val); - if let Err(e) = server.foo_notify(&conn, val + 1) { - info!("send notification error: {:?}", e); - } + } + Some(BatteryServiceEvent::FooWrite(val)) => { + info!("wrote battery level: {}", val); + if let Err(e) = server.foo_notify(&conn, val + 1) { + info!("send notification error: {:?}", e); } - BatteryServiceEvent::BatteryLevelNotificationsEnabled => { - info!("battery notifications enabled") - } - BatteryServiceEvent::BatteryLevelNotificationsDisabled => { - info!("battery notifications disabled") - } - BatteryServiceEvent::FooNotificationsEnabled => info!("foo notifications enabled"), - BatteryServiceEvent::FooNotificationsDisabled => { - info!("foo notifications disabled") - } - }) + } + Some(BatteryServiceEvent::BatteryLevelNotificationsEnabled) => { + info!("battery notifications enabled") + } + Some(BatteryServiceEvent::BatteryLevelNotificationsDisabled) => { + info!("battery notifications disabled") + } + Some(BatteryServiceEvent::FooNotificationsEnabled) => { + info!("foo notifications enabled") + } + Some(BatteryServiceEvent::FooNotificationsDisabled) => { + info!("foo notifications disabled") + } + None => {} }) .await; diff --git a/nrf-softdevice-macro/src/lib.rs b/nrf-softdevice-macro/src/lib.rs index c232aac..6cefa94 100644 --- a/nrf-softdevice-macro/src/lib.rs +++ b/nrf-softdevice-macro/src/lib.rs @@ -109,7 +109,7 @@ pub fn gatt_server(args: TokenStream, item: TokenStream) -> TokenStream { let mut code_impl = TokenStream2::new(); let mut code_register_chars = TokenStream2::new(); let mut code_register_init = TokenStream2::new(); - let mut code_on_event = TokenStream2::new(); + let mut code_on_write = TokenStream2::new(); let mut code_event_enum = TokenStream2::new(); let ble = quote!(::nrf_softdevice::ble); @@ -200,9 +200,9 @@ pub fn gatt_server(args: TokenStream, item: TokenStream) -> TokenStream { code_event_enum.extend(quote_spanned!(ch.span=> #case_write(#ty), )); - code_on_event.extend(quote_spanned!(ch.span=> + code_on_write.extend(quote_spanned!(ch.span=> if event.handle == self.#value_handle { - handler(#event_enum_name::#case_write(#ty_as_val::from_gatt(event.data))); + return Some(#event_enum_name::#case_write(#ty_as_val::from_gatt(event.data))); } )); } @@ -225,13 +225,13 @@ pub fn gatt_server(args: TokenStream, item: TokenStream) -> TokenStream { #case_enabled, #case_disabled, )); - code_on_event.extend(quote_spanned!(ch.span=> + code_on_write.extend(quote_spanned!(ch.span=> if event.handle == self.#cccd_handle { let data = event.data; if data.len() != 0 && data[0] & 0x01 != 0 { - handler(#event_enum_name::#case_enabled); + return Some(#event_enum_name::#case_enabled); } else { - handler(#event_enum_name::#case_disabled); + return Some(#event_enum_name::#case_disabled); } } )); @@ -267,9 +267,9 @@ pub fn gatt_server(args: TokenStream, item: TokenStream) -> TokenStream { }) } - fn on_event<'m, F>(&self, event: &#ble::gatt_server::GattEvent<'m>, mut handler: F) - where F: FnMut(Self::Event) { - #code_on_event + fn on_write<'m>(&self, event: #ble::gatt_server::GattEvent<'m>) -> Some<Self::Event> { + #code_on_write + None } } diff --git a/nrf-softdevice/src/ble/gatt_server.rs b/nrf-softdevice/src/ble/gatt_server.rs index 2f65d5c..4200c22 100644 --- a/nrf-softdevice/src/ble/gatt_server.rs +++ b/nrf-softdevice/src/ble/gatt_server.rs @@ -28,9 +28,10 @@ pub struct CharacteristicHandles { pub sccd_handle: u16, } +#[derive(Clone)] pub struct GattEvent<'a> { - pub handle: u16, - pub data: &'a [u8], + handle: u16, + data: &'a [u8], } pub trait Server: Sized { @@ -42,9 +43,7 @@ pub trait Server: Sized { where F: FnMut(Characteristic, &[u8]) -> Result<CharacteristicHandles, RegisterError>; - fn on_event<'m, F>(&self, event: &GattEvent<'m>, f: F) - where - F: FnMut(Self::Event); + fn on_write<'m>(&self, event: GattEvent<'m>) -> Option<Self::Event>; } #[derive(Debug, PartialEq, Eq, Clone, Copy)] |