diff --git a/device/src/bt_advertise.c b/device/src/bt_advertise.c index 853d654f..658fb866 100644 --- a/device/src/bt_advertise.c +++ b/device/src/bt_advertise.c @@ -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, \ @@ -25,107 +24,54 @@ 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; if (DEVICE_IS_UHK80_RIGHT) { + bt_le_filter_accept_list_clear(); if (BtConn_UnusedPeripheralConnectionCount() <= 1 && SelectedHostConnectionId != ConnectionId_Invalid) { bt_le_filter_accept_list_add(&HostConnection(SelectedHostConnectionId)->bleAddress); - advertisementParams->options = BT_LE_ADV_OPT_FILTER_CONN; - } else { - advertisementParams->options = BT_LE_ADV_OPT_NONE; } - } -} -uint8_t BtAdvertise_Start(uint8_t adv_type) -{ - setFilters(); + err = bt_le_adv_start(BT_LE_ADV_CONN_ONE_TIME, adHid, ARRAY_SIZE(adHid), sdHid, ARRAY_SIZE(sdHid)); - 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 if (DEVICE_IS_UHK80_LEFT) { + // directed advertising + static struct bt_le_adv_param adv_param; + 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)); } 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; - } -} diff --git a/device/src/bt_advertise.h b/device/src/bt_advertise.h index 7f67e9e5..ca6aea54 100644 --- a/device/src/bt_advertise.h +++ b/device/src/bt_advertise.h @@ -5,15 +5,9 @@ #include -// 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__ diff --git a/device/src/bt_manager.c b/device/src/bt_manager.c index 629de63c..42381ef5 100644 --- a/device/src/bt_manager.c +++ b/device/src/bt_manager.c @@ -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) { @@ -125,7 +125,7 @@ void BtManager_StartScanningAndAdvertising() { } if (leftShouldAdvertise || rightShouldAdvertise) { - err = BtAdvertise_Start(BtAdvertise_Type()); + err = BtAdvertise_Start(); success &= err == 0; } diff --git a/device/src/bt_pair.c b/device/src/bt_pair.c index 7e4298b1..ac2a7ab5 100644 --- a/device/src/bt_pair.c +++ b/device/src/bt_pair.c @@ -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."); } diff --git a/right/src/stubs.c b/right/src/stubs.c index cf784537..2da01dda 100644 --- a/right/src/stubs.c +++ b/right/src/stubs.c @@ -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() {}; diff --git a/right/src/stubs.h b/right/src/stubs.h index e0ef85c0..469ef154 100644 --- a/right/src/stubs.h +++ b/right/src/stubs.h @@ -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();