Skip to content

Commit

Permalink
bt: left uses directed advertising, right advertises HID only
Browse files Browse the repository at this point in the history
  • Loading branch information
benedekkupper committed Feb 7, 2025
1 parent a0dfb6d commit e7eabdd
Show file tree
Hide file tree
Showing 6 changed files with 30 additions and 90 deletions.
98 changes: 23 additions & 75 deletions device/src/bt_advertise.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,14 @@
#include "event_scheduler.h"
#include "bt_scan.h"

#undef DEVICE_NAME
#define DEVICE_NAME CONFIG_BT_DEVICE_NAME
#define DEVICE_NAME_LEN (sizeof(DEVICE_NAME) - 1)
#define ADV_DEVICE_NAME CONFIG_BT_DEVICE_NAME
#define ADV_DEVICE_NAME_LEN (sizeof(CONFIG_BT_DEVICE_NAME) - 1)

// Advertisement packets

#define AD_NUS_DATA \
BT_DATA_BYTES(BT_DATA_FLAGS, (BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR)), \
BT_DATA(BT_DATA_NAME_COMPLETE, DEVICE_NAME, DEVICE_NAME_LEN),
BT_DATA(BT_DATA_NAME_COMPLETE, ADV_DEVICE_NAME, ADV_DEVICE_NAME_LEN),

#define AD_HID_DATA \
BT_DATA_BYTES(BT_DATA_GAP_APPEARANCE, (CONFIG_BT_DEVICE_APPEARANCE >> 0) & 0xff, \
Expand All @@ -25,107 +24,56 @@
BT_UUID_16_ENCODE(BT_UUID_BAS_VAL)),

static const struct bt_data adNus[] = {AD_NUS_DATA};

static const struct bt_data adHid[] = {AD_HID_DATA};

static const struct bt_data adNusHid[] = {AD_NUS_DATA AD_HID_DATA};

// Scan response packets

#define SD_NUS_DATA BT_DATA_BYTES(BT_DATA_UUID128_ALL, BT_UUID_NUS_VAL),

#define SD_HID_DATA BT_DATA(BT_DATA_NAME_COMPLETE, DEVICE_NAME, DEVICE_NAME_LEN),
#define SD_HID_DATA BT_DATA(BT_DATA_NAME_COMPLETE, ADV_DEVICE_NAME, ADV_DEVICE_NAME_LEN),

static const struct bt_data sdNus[] = {SD_NUS_DATA};

static const struct bt_data sdHid[] = {SD_HID_DATA};

static const struct bt_data sdNusHid[] = {SD_NUS_DATA SD_HID_DATA};

static struct bt_le_adv_param advertisementParams[] = BT_LE_ADV_CONN;

static void setFilters() {
bt_le_filter_accept_list_clear();
int BtAdvertise_Start(void)
{
int err = 0;
// directed advertising
static struct bt_le_adv_param adv_param;
if (DEVICE_IS_UHK80_RIGHT) {
if (BtConn_UnusedPeripheralConnectionCount() <= 1 && SelectedHostConnectionId != ConnectionId_Invalid) {
bt_le_filter_accept_list_add(&HostConnection(SelectedHostConnectionId)->bleAddress);
advertisementParams->options = BT_LE_ADV_OPT_FILTER_CONN;
if (Connections_Type(SelectedHostConnectionId) == ConnectionType_BtHid) {
adv_param = *BT_LE_ADV_CONN_ONE_TIME;
} else {
advertisementParams->options = BT_LE_ADV_OPT_NONE;
adv_param = *BT_LE_ADV_CONN_DIR_LOW_DUTY(&HostConnection(SelectedHostConnectionId)->bleAddress);
// adv_param.options |= BT_LE_ADV_OPT_DIR_ADDR_RPA;
}
}
}

uint8_t BtAdvertise_Start(uint8_t adv_type)
{
setFilters();
err = bt_le_adv_start(&adv_param, adHid, ARRAY_SIZE(adHid), sdHid, ARRAY_SIZE(sdHid));

} else if (DEVICE_IS_UHK80_LEFT) {
adv_param = *BT_LE_ADV_CONN_DIR_LOW_DUTY(&HostConnection(ConnectionId_NusClientRight)->bleAddress);
// adv_param.options |= BT_LE_ADV_OPT_DIR_ADDR_RPA;
err = bt_le_adv_start(&adv_param, adNus, ARRAY_SIZE(adNus), sdNus, ARRAY_SIZE(sdNus));

int err;
const char *adv_type_string;
if (adv_type == (ADVERTISE_NUS | ADVERTISE_HID)) {
adv_type_string = "NUS and HID";
err = bt_le_adv_start(
BT_LE_ADV_CONN, adNusHid, ARRAY_SIZE(adNusHid), sdNusHid, ARRAY_SIZE(sdNusHid));
} else if (adv_type == ADVERTISE_NUS) {
adv_type_string = "NUS";
err = bt_le_adv_start(BT_LE_ADV_CONN, adNus, ARRAY_SIZE(adNus), sdNus, ARRAY_SIZE(sdNus));
} else if (adv_type == ADVERTISE_HID) {
adv_type_string = "HID";
err = bt_le_adv_start(BT_LE_ADV_CONN, adHid, ARRAY_SIZE(adHid), sdHid, ARRAY_SIZE(sdHid));
} else {
printk("Attempted to start advertising without any type! Ignoring.\n");
return 0;
}

if (err == 0) {
printk("%s advertising successfully started\n", adv_type_string);
printk("Advertising successfully started\n");
return 0;
} else if (err == -EALREADY) {
printk("%s advertising continued\n", adv_type_string);
printk("Advertising continued\n");
return 0;
} else {
printk("%s advertising failed to start (err %d), free connections: %d\n", adv_type_string, err, BtConn_UnusedPeripheralConnectionCount());
printk("Advertising failed to start (err %d), free connections: %d\n", err, BtConn_UnusedPeripheralConnectionCount());
return err;
}
}

void BtAdvertise_Stop() {
void BtAdvertise_Stop(void) {
int err = bt_le_adv_stop();
if (err) {
printk("Advertising failed to stop (err %d)\n", err);
}
}

static uint8_t connectedHidCount() {
uint8_t connectedHids = 0;
for (uint8_t peerId = PeerIdFirstHost; peerId <= PeerIdLastHost; peerId++) {
if (Peers[peerId].conn && Connections_Type(Peers[peerId].connectionId) == ConnectionType_BtHid) {
connectedHids++;
}
}
return connectedHids;
}

uint8_t BtAdvertise_Type() {
switch (DEVICE_ID) {
case DeviceId_Uhk80_Left:
return ADVERTISE_NUS;
case DeviceId_Uhk80_Right:
if (BtConn_UnusedPeripheralConnectionCount() > 0) {
if (connectedHidCount() > 0) {
return ADVERTISE_NUS;
} else {
return ADVERTISE_NUS | ADVERTISE_HID;
}
} else {
printk("Current slot count %d, not advertising\n", BtConn_UnusedPeripheralConnectionCount());
BtConn_ListCurrentConnections();
return 0;
}
case DeviceId_Uhk_Dongle:
return 0;
default:
printk("unknown device!\n");
return 0;
}
}
10 changes: 2 additions & 8 deletions device/src/bt_advertise.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,9 @@

#include <stdint.h>

// Macros:

#define ADVERTISE_NUS (1 << 0)
#define ADVERTISE_HID (1 << 1)

// Functions:

uint8_t BtAdvertise_Start(uint8_t adv_type);
void BtAdvertise_Stop();
uint8_t BtAdvertise_Type();
int BtAdvertise_Start(void);
void BtAdvertise_Stop(void);

#endif // __BT_ADVERTISE_H__
4 changes: 2 additions & 2 deletions device/src/bt_manager.c
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ void BtManager_StartBt() {
}

if (DEVICE_IS_UHK80_LEFT || DEVICE_IS_UHK80_RIGHT) {
BtAdvertise_Start(BtAdvertise_Type());
BtAdvertise_Start();
}

if (DEVICE_IS_UHK80_RIGHT || DEVICE_IS_UHK_DONGLE) {
Expand Down Expand Up @@ -125,7 +125,7 @@ void BtManager_StartScanningAndAdvertising() {
}

if (leftShouldAdvertise || rightShouldAdvertise) {
err = BtAdvertise_Start(BtAdvertise_Type());
err = BtAdvertise_Start();
success &= err == 0;
}

Expand Down
2 changes: 1 addition & 1 deletion device/src/bt_pair.c
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ void BtPair_PairPeripheral() {
pairingAsCentral = false;
Settings_Reload();
bt_le_oob_set_sc_flag(true);
BtAdvertise_Start(ADVERTISE_NUS);
BtAdvertise_Start();
printk ("Waiting for central to pair to me.\n");
EventScheduler_Reschedule(k_uptime_get_32() + PAIRING_TIMEOUT, EventSchedulerEvent_EndBtPairing, "Oob pairing timeout.");
}
Expand Down
3 changes: 1 addition & 2 deletions right/src/stubs.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,7 @@
ATTRS void BtManager_RestartBt() {};
ATTRS void DongleLeds_Update(void) {};
ATTRS void BtPair_ClearUnknownBonds() {};
ATTRS uint8_t BtAdvertise_Start(uint8_t adv_type) { return 0; };
ATTRS uint8_t BtAdvertise_Type() { return 0; };
ATTRS int BtAdvertise_Start(void) { return 0; };
ATTRS int BtScan_Start(void) { return 0; };
ATTRS void BtManager_StartScanningAndAdvertising() {};
ATTRS void BtConn_UpdateHostConnectionPeerAllocations() {};
Expand Down
3 changes: 1 addition & 2 deletions right/src/stubs.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,7 @@
extern void BtManager_RestartBt();
extern void DongleLeds_Update(void);
extern void BtPair_ClearUnknownBonds();
extern uint8_t BtAdvertise_Start(uint8_t adv_type);
extern uint8_t BtAdvertise_Type();
extern int BtAdvertise_Start(void);
extern int BtScan_Start(void);
extern void BtManager_StartScanningAndAdvertising();
extern void BtConn_UpdateHostConnectionPeerAllocations();
Expand Down

0 comments on commit e7eabdd

Please sign in to comment.