summaryrefslogtreecommitdiff
path: root/nrf-softdevice-macro
diff options
context:
space:
mode:
authorAlbert Skog <mail@albertskog.se>2021-10-08 21:17:50 +0200
committerAlbert Skog <mail@albertskog.se>2021-10-08 21:17:50 +0200
commit2921750bd85d1890ae294fc67f80ff436eb88e8e (patch)
treec4fcb708ce4d756e4799a2e47020a58015f5d5c5 /nrf-softdevice-macro
parente7b1b20c514ac99773b57a9a2a2b5d16285c4dc3 (diff)
downloadnrf-softdevice-2921750bd85d1890ae294fc67f80ff436eb88e8e.zip
fix for charsacteristics with both notify and indicate
Diffstat (limited to 'nrf-softdevice-macro')
-rw-r--r--nrf-softdevice-macro/src/lib.rs85
1 files changed, 60 insertions, 25 deletions
diff --git a/nrf-softdevice-macro/src/lib.rs b/nrf-softdevice-macro/src/lib.rs
index 2ffff5f..2f4b766 100644
--- a/nrf-softdevice-macro/src/lib.rs
+++ b/nrf-softdevice-macro/src/lib.rs
@@ -198,10 +198,8 @@ pub fn gatt_server(args: TokenStream, item: TokenStream) -> TokenStream {
}
));
}
- if notify {
- let case_enabled = format_ident!("{}NotificationsEnabled", name_pascal);
- let case_disabled = format_ident!("{}NotificationsDisabled", name_pascal);
+ if notify {
code_impl.extend(quote_spanned!(ch.span=>
fn #notify_fn(
&self,
@@ -213,24 +211,27 @@ pub fn gatt_server(args: TokenStream, item: TokenStream) -> TokenStream {
}
));
- code_event_enum.extend(quote_spanned!(ch.span=>
- #case_enabled,
- #case_disabled,
- ));
- code_on_write.extend(quote_spanned!(ch.span=>
- if handle == self.#cccd_handle {
- if data.len() != 0 && data[0] & 0x01 != 0 {
- return Some(#event_enum_name::#case_enabled);
- } else {
- return Some(#event_enum_name::#case_disabled);
+ if !indicate {
+ let case_enabled = format_ident!("{}NotificationsEnabled", name_pascal);
+ let case_disabled = format_ident!("{}NotificationsDisabled", name_pascal);
+
+ code_event_enum.extend(quote_spanned!(ch.span=>
+ #case_enabled,
+ #case_disabled,
+ ));
+ code_on_write.extend(quote_spanned!(ch.span=>
+ if handle == self.#cccd_handle {
+ if data.len() != 0 && data[0] & 0x01 != 0 {
+ return Some(#event_enum_name::#case_enabled);
+ } else {
+ return Some(#event_enum_name::#case_disabled);
+ }
}
- }
- ));
+ ));
+ }
}
- if indicate {
- let case_enabled = format_ident!("{}IndicationsEnabled", name_pascal);
- let case_disabled = format_ident!("{}IndicationsDisabled", name_pascal);
+ if indicate {
code_impl.extend(quote_spanned!(ch.span=>
fn #indicate_fn(
&self,
@@ -242,16 +243,50 @@ pub fn gatt_server(args: TokenStream, item: TokenStream) -> TokenStream {
}
));
+ if !notify {
+ let case_enabled = format_ident!("{}IndicationsEnabled", name_pascal);
+ let case_disabled = format_ident!("{}IndicationsDisabled", name_pascal);
+
+ code_event_enum.extend(quote_spanned!(ch.span=>
+ #case_enabled,
+ #case_disabled,
+ ));
+ code_on_write.extend(quote_spanned!(ch.span=>
+ if handle == self.#cccd_handle {
+ if data.len() != 0 && data[0] & 0x02 != 0 {
+ return Some(#event_enum_name::#case_enabled);
+ } else {
+ return Some(#event_enum_name::#case_disabled);
+ }
+ }
+ ));
+ }
+ }
+
+ if indicate && notify {
+ let case_disabled_disabled =
+ format_ident!("{}IndicationsDisabledNotificationsDisabled", name_pascal);
+ let case_disabled_enabled =
+ format_ident!("{}IndicationsDisabledNotificationsEnabled", name_pascal);
+ let case_enabled_disabled =
+ format_ident!("{}IndicationsEnabledNotificationsDisabled", name_pascal);
+ let case_enabled_enabled =
+ format_ident!("{}IndicationsEnabledNotificationsEnabled", name_pascal);
+
code_event_enum.extend(quote_spanned!(ch.span=>
- #case_enabled,
- #case_disabled,
+ #case_disabled_disabled,
+ #case_disabled_enabled,
+ #case_enabled_disabled,
+ #case_enabled_enabled,
));
code_on_write.extend(quote_spanned!(ch.span=>
- if handle == self.#cccd_handle {
- if data.len() != 0 && data[0] & 0x02 != 0 {
- return Some(#event_enum_name::#case_enabled);
- } else {
- return Some(#event_enum_name::#case_disabled);
+ if handle == self.#cccd_handle && data.len() != 0 {
+ match data[0] & 0x03 {
+ 0x00 => return Some(#event_enum_name::#case_disabled_disabled),
+ 0x01 => return Some(#event_enum_name::#case_disabled_enabled),
+ 0x02 => return Some(#event_enum_name::#case_enabled_disabled),
+ 0x03 => return Some(#event_enum_name::#case_enabled_enabled),
+ _ => {},
}
}
));