Skip to content

Commit c36e56e

Browse files
MarekPietarlubos
authored andcommitted
applications: nrf_desktop: Add BLE advertising control module
Change adds a small application module that suspends BLE advertising while USB HID is active. Jira: NCSDK-24220 Signed-off-by: Marek Pieta <[email protected]> Signed-off-by: Aleksander Strzebonski <[email protected]>
1 parent 598eed0 commit c36e56e

File tree

4 files changed

+99
-0
lines changed

4 files changed

+99
-0
lines changed

applications/nrf_desktop/src/modules/CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
55
#
66

7+
target_sources_ifdef(CONFIG_DESKTOP_BLE_ADV_CTRL_ENABLE
8+
app PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/ble_adv_ctrl.c)
9+
710
target_sources_ifdef(CONFIG_DESKTOP_BLE_BOND_ENABLE
811
app PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/ble_bond.c)
912

applications/nrf_desktop/src/modules/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ rsource "Kconfig.hid_state"
2525
rsource "Kconfig.led_state"
2626
rsource "Kconfig.led_stream"
2727
rsource "Kconfig.usb_state"
28+
rsource "Kconfig.ble_adv_ctrl"
2829
rsource "Kconfig.ble_bond"
2930
rsource "Kconfig.ble_conn_params"
3031
rsource "Kconfig.ble_latency"
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#
2+
# Copyright (c) 2025 Nordic Semiconductor ASA
3+
#
4+
# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
5+
#
6+
7+
menuconfig DESKTOP_BLE_ADV_CTRL_ENABLE
8+
bool "Bluetooth LE advertising control module"
9+
depends on CAF_BLE_ADV
10+
select CAF_MODULE_SUSPEND_EVENTS
11+
help
12+
The module controls suspend/resume of CAF Bluetooth LE advertising
13+
module.
14+
15+
if DESKTOP_BLE_ADV_CTRL_ENABLE
16+
17+
config DESKTOP_BLE_ADV_CTRL_SUSPEND_ON_USB
18+
bool "Suspend Bluetooth LE adverising when USB is connected"
19+
depends on DESKTOP_USB_ENABLE
20+
help
21+
Suspend CAF Bluetooth LE advertising module while HID USB is active.
22+
23+
module = DESKTOP_BLE_ADV_CTRL
24+
module-str = BLE advertising control
25+
source "subsys/logging/Kconfig.template.log_config"
26+
27+
endif # DESKTOP_BLE_ADV_CTRL_ENABLE
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
/*
2+
* Copyright (c) 2025 Nordic Semiconductor ASA
3+
*
4+
* SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
5+
*/
6+
7+
#define MODULE ble_adv_ctrl
8+
#include <caf/events/module_state_event.h>
9+
#include <caf/events/module_suspend_event.h>
10+
#include "usb_event.h"
11+
12+
#include <zephyr/logging/log.h>
13+
LOG_MODULE_REGISTER(MODULE, CONFIG_DESKTOP_BLE_ADV_CTRL_LOG_LEVEL);
14+
15+
16+
static void broadcast_ble_adv_req(bool suspend)
17+
{
18+
if (suspend) {
19+
struct module_suspend_req_event *event = new_module_suspend_req_event();
20+
21+
event->sink_module_id = MODULE_ID(ble_adv);
22+
event->src_module_id = MODULE_ID(MODULE);
23+
APP_EVENT_SUBMIT(event);
24+
} else {
25+
struct module_resume_req_event *event = new_module_resume_req_event();
26+
27+
event->sink_module_id = MODULE_ID(ble_adv);
28+
event->src_module_id = MODULE_ID(MODULE);
29+
APP_EVENT_SUBMIT(event);
30+
}
31+
}
32+
33+
static bool handle_usb_state_event(const struct usb_state_event *event)
34+
{
35+
static bool ble_adv_suspended;
36+
bool new_ble_adv_suspended;
37+
38+
if (ble_adv_suspended) {
39+
new_ble_adv_suspended = (event->state != USB_STATE_DISCONNECTED);
40+
} else {
41+
new_ble_adv_suspended = (event->state == USB_STATE_ACTIVE);
42+
}
43+
44+
if (new_ble_adv_suspended != ble_adv_suspended) {
45+
ble_adv_suspended = new_ble_adv_suspended;
46+
broadcast_ble_adv_req(ble_adv_suspended);
47+
}
48+
49+
return false;
50+
}
51+
52+
static bool app_event_handler(const struct app_event_header *aeh)
53+
{
54+
if (IS_ENABLED(CONFIG_DESKTOP_BLE_ADV_CTRL_SUSPEND_ON_USB) &&
55+
is_usb_state_event(aeh)) {
56+
return handle_usb_state_event(cast_usb_state_event(aeh));
57+
}
58+
59+
/* If event is unhandled, unsubscribe. */
60+
__ASSERT_NO_MSG(false);
61+
62+
return false;
63+
}
64+
65+
APP_EVENT_LISTENER(MODULE, app_event_handler);
66+
#ifdef CONFIG_DESKTOP_BLE_ADV_CTRL_SUSPEND_ON_USB
67+
APP_EVENT_SUBSCRIBE(MODULE, usb_state_event);
68+
#endif /* CONFIG_DESKTOP_BLE_ADV_CTRL_SUSPEND_ON_USB */

0 commit comments

Comments
 (0)