From 2921750bd85d1890ae294fc67f80ff436eb88e8e Mon Sep 17 00:00:00 2001 From: Albert Skog Date: Fri, 8 Oct 2021 21:17:50 +0200 Subject: fix for charsacteristics with both notify and indicate --- nrf-softdevice-macro/src/lib.rs | 85 +++++++++++++++++++++++++++++------------ 1 file changed, 60 insertions(+), 25 deletions(-) (limited to 'nrf-softdevice-macro') 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), + _ => {}, } } )); -- cgit v1.2.3