summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlf Lilleengen <ulf.lilleengen@gmail.com>2021-10-06 18:43:55 +0200
committerUlf Lilleengen <ulf.lilleengen@gmail.com>2021-10-06 18:43:55 +0200
commit8d78ed20f1313d00d8727f41383413a13c23d457 (patch)
tree754cfb7251bbf7d727b54aa4c82926554e312f76
parent230d133f4d6e02d2631a3fcdcebe7675764c17fb (diff)
downloadnrf-softdevice-8d78ed20f1313d00d8727f41383413a13c23d457.zip
Simplify API
-rw-r--r--examples/src/bin/ble_bas_peripheral.rs52
-rw-r--r--nrf-softdevice-macro/src/lib.rs18
-rw-r--r--nrf-softdevice/src/ble/gatt_server.rs9
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)]