summaryrefslogtreecommitdiff
path: root/nrf-softdevice-macro
diff options
context:
space:
mode:
authoralexmoon <alex.r.moon@gmail.com>2022-07-11 18:02:35 -0400
committeralexmoon <alex.r.moon@gmail.com>2022-07-12 14:34:16 -0400
commitea7a3908df6816225641da342de2466d91ff6f2b (patch)
treeb3691429eef48000076d0c4c28ff769ab7497ea8 /nrf-softdevice-macro
parent5f651f57f6d5d04e82a7733fe6b7b2b4fbbff15c (diff)
downloadnrf-softdevice-ea7a3908df6816225641da342de2466d91ff6f2b.zip
Modify macros to use the builder interface and add an builder example
Diffstat (limited to 'nrf-softdevice-macro')
-rw-r--r--nrf-softdevice-macro/src/lib.rs84
1 files changed, 44 insertions, 40 deletions
diff --git a/nrf-softdevice-macro/src/lib.rs b/nrf-softdevice-macro/src/lib.rs
index b0382d6..020da80 100644
--- a/nrf-softdevice-macro/src/lib.rs
+++ b/nrf-softdevice-macro/src/lib.rs
@@ -45,6 +45,7 @@ struct Characteristic {
pub fn gatt_server(_args: TokenStream, item: TokenStream) -> TokenStream {
let mut struc = syn::parse_macro_input!(item as syn::ItemStruct);
+ let struct_vis = &struc.vis;
let struct_fields = match &mut struc.fields {
syn::Fields::Named(n) => n,
_ => {
@@ -74,9 +75,10 @@ pub fn gatt_server(_args: TokenStream, item: TokenStream) -> TokenStream {
for field in fields.iter() {
let name = field.ident.as_ref().unwrap();
+ let ty = &field.ty;
let span = field.ty.span();
code_register_init.extend(quote_spanned!(span=>
- #name: #ble::gatt_server::register_service(sd)?,
+ #name: #ty::new(sd)?,
));
if let syn::Type::Path(p) = &field.ty {
@@ -105,6 +107,12 @@ pub fn gatt_server(_args: TokenStream, item: TokenStream) -> TokenStream {
#struc
impl #struct_name {
+ #struct_vis fn new(sd: &mut ::nrf_softdevice::Softdevice) -> Result<Self, #ble::gatt_server::RegisterError>
+ {
+ Ok(Self {
+ #code_register_init
+ })
+ }
}
#struc_vis enum #event_enum_name {
@@ -114,13 +122,6 @@ pub fn gatt_server(_args: TokenStream, item: TokenStream) -> TokenStream {
impl #ble::gatt_server::Server for #struct_name {
type Event = #event_enum_name;
- fn register(sd: &::nrf_softdevice::Softdevice) -> Result<Self, #ble::gatt_server::RegisterError>
- {
- Ok(Self {
- #code_register_init
- })
- }
-
fn on_write(&self, handle: u16, data: &[u8]) -> Option<Self::Event> {
use #ble::gatt_server::Service;
@@ -146,6 +147,7 @@ pub fn gatt_service(args: TokenStream, item: TokenStream) -> TokenStream {
let mut chars = Vec::new();
+ let struct_vis = &struc.vis;
let struct_fields = match &mut struc.fields {
syn::Fields::Named(n) => n,
_ => {
@@ -202,8 +204,8 @@ pub fn gatt_service(args: TokenStream, item: TokenStream) -> TokenStream {
let event_enum_name = format_ident!("{}Event", struct_name);
let mut code_impl = TokenStream2::new();
- let mut code_register_chars = TokenStream2::new();
- let mut code_register_init = TokenStream2::new();
+ let mut code_build_chars = TokenStream2::new();
+ let mut code_struct_init = TokenStream2::new();
let mut code_on_write = TokenStream2::new();
let mut code_event_enum = TokenStream2::new();
@@ -237,23 +239,27 @@ pub fn gatt_service(args: TokenStream, item: TokenStream) -> TokenStream {
vis: syn::Visibility::Inherited,
});
- code_register_chars.extend(quote_spanned!(ch.span=>
- let #char_name = register_char(
- #ble::gatt_server::Characteristic {
- uuid: #uuid,
- can_read: #read,
- can_write: #write,
- can_write_without_response: #write_without_response,
- can_notify: #notify,
- can_indicate: #indicate,
- max_len: #ty_as_val::MAX_SIZE as _,
- vlen: #ty_as_val::MAX_SIZE != #ty_as_val::MIN_SIZE,
- },
- &[123],
- )?;
+ code_build_chars.extend(quote_spanned!(ch.span=>
+ let #char_name = {
+ let val = [123u8; #ty_as_val::MIN_SIZE];
+ let mut attr = #ble::gatt_server::characteristic::Attribute::new(&val);
+ if #ty_as_val::MAX_SIZE != #ty_as_val::MIN_SIZE {
+ attr = attr.variable_len(#ty_as_val::MAX_SIZE as u16);
+ }
+ let props = #ble::gatt_server::characteristic::Properties {
+ read: #read,
+ write: #write,
+ write_without_response: #write_without_response,
+ notify: #notify,
+ indicate: #indicate,
+ ..Default::default()
+ };
+ let metadata = #ble::gatt_server::characteristic::Metadata::new(props);
+ service_builder.add_characteristic(#uuid, attr, metadata)?.build()
+ };
));
- code_register_init.extend(quote_spanned!(ch.span=>
+ code_struct_init.extend(quote_spanned!(ch.span=>
#value_handle: #char_name.value_handle,
));
@@ -280,7 +286,7 @@ pub fn gatt_service(args: TokenStream, item: TokenStream) -> TokenStream {
colon_token: Default::default(),
vis: syn::Visibility::Inherited,
});
- code_register_init.extend(quote_spanned!(ch.span=>
+ code_struct_init.extend(quote_spanned!(ch.span=>
#cccd_handle: #char_name.cccd_handle,
));
}
@@ -385,27 +391,25 @@ pub fn gatt_service(args: TokenStream, item: TokenStream) -> TokenStream {
#struc
impl #struct_name {
- #code_impl
- }
-
- impl #ble::gatt_server::Service for #struct_name {
- type Event = #event_enum_name;
+ #struct_vis fn new(sd: &mut ::nrf_softdevice::Softdevice) -> Result<Self, #ble::gatt_server::RegisterError>
+ {
+ let mut service_builder = #ble::gatt_server::builder::ServiceBuilder::new(sd, #uuid)?;
- fn uuid() -> #ble::Uuid {
- #uuid
- }
+ #code_build_chars
- fn register<F>(service_handle: u16, mut register_char: F) -> Result<Self, #ble::gatt_server::RegisterError>
- where
- F: FnMut(#ble::gatt_server::Characteristic, &[u8]) -> Result<#ble::gatt_server::CharacteristicHandles, #ble::gatt_server::RegisterError>,
- {
- #code_register_chars
+ let _ = service_builder.build();
Ok(Self {
- #code_register_init
+ #code_struct_init
})
}
+ #code_impl
+ }
+
+ impl #ble::gatt_server::Service for #struct_name {
+ type Event = #event_enum_name;
+
fn on_write(&self, handle: u16, data: &[u8]) -> Option<Self::Event> {
#code_on_write
None