diff options
author | Albert Skog <mail@albertskog.se> | 2021-10-08 21:17:50 +0200 |
---|---|---|
committer | Albert Skog <mail@albertskog.se> | 2021-10-08 21:17:50 +0200 |
commit | 2921750bd85d1890ae294fc67f80ff436eb88e8e (patch) | |
tree | c4fcb708ce4d756e4799a2e47020a58015f5d5c5 /nrf-softdevice-macro | |
parent | e7b1b20c514ac99773b57a9a2a2b5d16285c4dc3 (diff) | |
download | nrf-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.rs | 85 |
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), + _ => {}, } } )); |