Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
d18eb64
Ensure to hide pairing screen if race conditions occur.
kareltucek Jan 16, 2026
9a61dc3
Log reboots better.
kareltucek Jan 16, 2026
1714486
Respond immediately in pairing modes.
kareltucek Jan 16, 2026
27f7eea
DOCS: testing scenarios, notes
kareltucek Jan 16, 2026
9b222a9
Prevent blue dongle on double switchHost.
kareltucek Jan 16, 2026
7531b74
Comment reason codes.
kareltucek Jan 16, 2026
8265c5c
Minor registered/unregistered fix.
kareltucek Jan 16, 2026
fa62e95
DOCS: Mention $macroArg limits.
kareltucek Jan 16, 2026
85dc494
Update changelog
kareltucek Jan 16, 2026
65819ad
Revert pairing fail disconnect.
kareltucek Jan 16, 2026
03c72e4
Stash.
kareltucek Jan 16, 2026
e8b478a
Deduplicate host connections.
kareltucek Jan 16, 2026
863d19d
Add jj configuration
kareltucek Jan 7, 2026
32e3af2
Fix compile_commands.json. Typo
kareltucek Jan 14, 2026
cb3ae14
Ble fixes: increase ble buff counts.
kareltucek Jan 16, 2026
bc991d1
Ble fixes: don't disconnect connections that are cncted but not rdy.
kareltucek Jan 5, 2026
8adf636
Ble fixes: lower latency timeouts. Let's believe the author for once.
kareltucek Jan 17, 2026
d8ad0f9
Ble fixes: Refactor handling of unknown connections.
kareltucek Dec 29, 2025
1d84927
Ble fixes: When moving connections, exchange them to not terminate th…
kareltucek Dec 29, 2025
0468d02
Ble fixes: Prevent blue dongle on double switchHost.
kareltucek Jan 16, 2026
1ef7200
Ble fixes: add logging.
kareltucek Jan 5, 2026
1e6eb64
Ble fixes: when detecting hid collision, don't collide with yourself.
kareltucek Jan 5, 2026
e502cb2
Ble fixes: on pairing complete, just set conn selected - dont reserve
kareltucek Jan 5, 2026
51097eb
Ble slots: pilot implementation
kareltucek Dec 29, 2025
de34add
Ble slots: Preserve ble slots when parsing UserConfig.
kareltucek Jan 14, 2026
81459f2
Ble: reason codes.
kareltucek Dec 30, 2025
f961331
Ble: restore advertising state after cancelled switch. Cancel timeout.
kareltucek Jan 8, 2026
9ea3546
Ble: bluetooth pairing notifications.
kareltucek Jan 8, 2026
0f63874
Implement exponential backoff when aggresive devices turn up.
kareltucek Jan 8, 2026
cd8333f
DOCS: testing scenarios, notes
kareltucek Jan 12, 2026
8497742
Inline tracing.
kareltucek Jan 17, 2026
2e8d9f0
Optimization: inline trace calls.
kareltucek Jan 17, 2026
99dce08
Merge branch 'bt_bisect3' into bt_crash_fixes
kareltucek Jan 17, 2026
bf073a7
Ble fixes: unauth on pairing_failed?
kareltucek Jan 17, 2026
d0af27e
Ble fixes: reorder bluetooth shutdown sequence to not produce hci cra…
kareltucek Jan 17, 2026
3561b08
Ble fixes: prevent automatic advertising start if oob is in progress.
kareltucek Jan 17, 2026
17f752e
Increase i2c stack size - we have encountered an overflow.
kareltucek Jan 17, 2026
536760f
Fix compilation.
kareltucek Jan 17, 2026
abecad7
DOCS: rename testing_scenarios.md
kareltucek Jan 19, 2026
5d9425c
DOCS: add logging instructions.
kareltucek Jan 19, 2026
62040ba
DOCS: testing scenarios.
kareltucek Jan 19, 2026
9b265b2
Bt: refactor some logging
kareltucek Jan 19, 2026
513945d
DOCS: add some testing notes.
kareltucek Jan 19, 2026
9a72794
Bt: prune some logs.
kareltucek Jan 19, 2026
38787f6
Humanify logs.
kareltucek Jan 19, 2026
d359f2f
Bt: advertisement exponentail backoff - adjustments.
kareltucek Jan 19, 2026
a8f13ed
connection quotas: Add comment.
kareltucek Jan 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
The format is loosely based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
and this project adheres to the [UHK Versioning](VERSIONING.md) conventions.

## [16.1.1] - 2026-01-16

- Fix: fix bluetooth issues caused by returning bad disconnect reasons - failing oob pairing, connected but otherwise unhandled connections.
- Fix: when the same dongle is switched to multiple times, it now remains greed instead of turning blue.
- Fix: exempt pairing scenarios from exponential advertising delay backoff.

## [16.1.0] - 2026-01-16

Device Protocol: 4.17.0 | Module Protocol: 4.3.0 | Dongle Protocol: 1.0.2 | User Config: 13.0.0 | Hardware Config: 1.0.0 | Smart Macros: 3.**12.0**
Expand Down
7 changes: 6 additions & 1 deletion device/prj.conf.overlays/nrf_shared.conf
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,14 @@ CONFIG_BT=y
# CONFIG_BT_DEBUG_LOG=y
CONFIG_BT_SMP=y

CONFIG_BT_L2CAP_TX_BUF_COUNT=5
CONFIG_BT_FILTER_ACCEPT_LIST=y

# increase these to make multiple connections more reliable
# this is a generic ai advice.
CONFIG_BT_ATT_TX_COUNT=10
CONFIG_BT_CONN_TX_MAX=6
CONFIG_BT_L2CAP_TX_BUF_COUNT=12

# negotiate larger MTU for NUS
CONFIG_BT_USER_DATA_LEN_UPDATE=y
CONFIG_BT_BUF_ACL_RX_SIZE=251
Expand Down
32 changes: 15 additions & 17 deletions device/src/bt_advertise.c
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ ATTR_UNUSED static void setFilters(adv_config_t advConfig) {
bt_le_filter_accept_list_clear();

if (advConfig.advType & (ADVERTISE_HID | ADVERTISE_NUS)) {
printk("Bt: filling adv allow filter\n");
LOG_DBG("Bt: filling adv allow filter");
for (uint8_t connId = ConnectionId_HostConnectionFirst; connId <= ConnectionId_HostConnectionLast; connId++) {
host_connection_t* hostConnection = HostConnection(connId);

Expand All @@ -99,7 +99,7 @@ ATTR_UNUSED static void setFilters(adv_config_t advConfig) {
}

if (advConfig.advType & ADVERTISE_DIRECTED_NUS) {
printk("Bt: filling adv allow filter for \"directed\" advertising.\n");
LOG_DBG("Bt: filling adv allow filter for \"directed\" advertising.");
bt_le_filter_accept_list_add(advConfig.addr);
}
}
Expand Down Expand Up @@ -136,69 +136,67 @@ uint8_t BtAdvertise_Start(adv_config_t advConfig)

updateAdvertisingIcon(advConfig.advType & ADVERTISE_HID);

printk("Bt: start advertising\n");

// Start advertising
static struct bt_le_adv_param advParam;
switch (advConfig.advType) {
case ADVERTISE_HID:
case ADVERTISE_NUS | ADVERTISE_HID:
LOG_INF("Adv: advertise nus+hid.\n");
LOG_DBG("Adv: advertise nus+hid.");
/* our devices don't check service uuids, so hid advertisement effectively advertises nus too */
advParam = *BT_LE_ADV_CONN_ONE_TIME;
err = BT_LE_ADV_START(&advParam, adHid, sdHid);

break;
case ADVERTISE_NUS:
if (Cfg.Bt_DirectedAdvertisingAllowed) {
LOG_INF("Adv: advertise nus, with allow list.\n");
LOG_DBG("Adv: advertise nus, with allow list.");
setFilters(advConfig);

advParam = *BT_LE_ADV_CONN_ONE_TIME;
advParam.options = BT_LE_ADV_OPT_CONNECTABLE | BT_LE_ADV_OPT_ONE_TIME | BT_LE_ADV_OPT_FILTER_CONN | BT_LE_ADV_OPT_USE_IDENTITY;

err = BT_LE_ADV_START(&advParam, BY_SIDE(adNusLeft, adNusRight), sdNus);
} else {
LOG_INF("Adv: advertise nus, without allow list.\n");
LOG_DBG("Adv: advertise nus, without allow list.");
advParam = *BT_LE_ADV_CONN_ONE_TIME;
err = BT_LE_ADV_START(&advParam, BY_SIDE(adNusLeft, adNusRight), sdNus);
}
break;
case ADVERTISE_DIRECTED_NUS:
if (Cfg.Bt_DirectedAdvertisingAllowed) {
LOG_INF("Adv: direct advertise nus, with allow list.\n");
LOG_DBG("Adv: direct advertise nus, with allow list.");
setFilters(advConfig);

advParam = *BT_LE_ADV_CONN_ONE_TIME;
advParam.options = BT_LE_ADV_OPT_CONNECTABLE | BT_LE_ADV_OPT_ONE_TIME | BT_LE_ADV_OPT_FILTER_CONN | BT_LE_ADV_OPT_USE_IDENTITY;

err = BT_LE_ADV_START(&advParam, BY_SIDE(adNusLeft, adNusRight), sdNus);
} else {
LOG_INF("Adv: direct advertise nus, without allow list.\n");
LOG_DBG("Adv: direct advertise nus, without allow list.");
advParam = *BT_LE_ADV_CONN_ONE_TIME;
err = BT_LE_ADV_START(&advParam, BY_SIDE(adNusLeft, adNusRight), sdNus);
}

//// TODO: fix and reenable this?
// printk("Advertising against %s\n", GetAddrString(advConfig.addr));
// printk("Advertising against %s", GetAddrString(advConfig.addr));
// advParam = *BT_LE_ADV_CONN_DIR_LOW_DUTY(advConfig.addr);
// advParam.options |= BT_LE_ADV_OPT_DIR_ADDR_RPA;
// err = BT_LE_ADV_START(&advParam, BY_SIDE(adNusLeft, adNusRight), sdNus);
break;
default:
LOG_INF("Adv: Attempted to start advertising without any type! Ignoring.\n");
LOG_INF("Adv: Attempted to start advertising without any type! Ignoring.");
return 0;
}

// Log it
if (err == 0) {
LOG_INF("Adv: %s advertising successfully started\n", advTypeString);
LOG_INF("Adv: '%s' started", advTypeString);
return 0;
} else if (err == -EALREADY) {
LOG_INF("Adv: %s advertising continued\n", advTypeString);
LOG_INF("Adv: '%s' continued", advTypeString);
return 0;
} else {
LOG_INF("Adv: %s advertising failed to start (err %d), free connections: %d\n", advTypeString, err, BtConn_UnusedPeripheralConnectionCount());
LOG_INF("Adv: '%s' failed to start (err %d), free connections: %d", advTypeString, err, BtConn_UnusedPeripheralConnectionCount());
return err;
}
}
Expand All @@ -207,7 +205,7 @@ void BtAdvertise_Stop(void) {
BT_TRACE_AND_ASSERT("ba2");
int err = bt_le_adv_stop();
if (err) {
LOG_WRN("Adv: Advertising failed to stop (err %d)\n", err);
LOG_WRN("Adv: Advertising failed to stop (err %d)", err);
Bt_HandleError("BtAdvertise_Stop", err);
}
}
Expand Down Expand Up @@ -262,15 +260,15 @@ adv_config_t BtAdvertise_Config() {
} else {
/** advertising needs a peripheral slot. When it is not free and we try to advertise, it will fail, and our code will try to
* disconnect other devices in order to restore proper function. */
LOG_INF("Adv: Current slot count is zero, not advertising!\n");
LOG_INF("Adv: Current slot count is zero, not advertising!");
// BtConn_ListCurrentConnections();
return ADVERTISEMENT( 0 );
}
}
case DeviceId_Uhk_Dongle:
return ADVERTISEMENT( 0 );
default:
LOG_WRN("unknown device!\n");
LOG_WRN("unknown device!");
return ADVERTISEMENT( 0 );
}
}
Loading