Proper configuration for multi-sync PAwR with PAST and connectable advertising

Hi Nordic team,

This is a follow-up to my previous question here:

Can nRF52833 perform PAwR while also syncing to another PAwR device?

We are now extending our design to support multiple periodic advertisers, where our device:

  • Acts as a PAwR observer (syncs to multiple periodic advertisers)

  • Starts a connectable extended advertiser, allowing another device to connect and perform PAST (Periodic Advertising Sync Transfer)


Gear️ Current configuration:

  • CONFIG_BT_PER_ADV_SYNC_MAX = 4

  • CONFIG_BT_MAX_CONN = 4 (initially)

With this setup, we can successfully sync to 3 periodic advertisers using bt_le_per_adv_sync_subevent() to subscribe to subevents.


ExclamationProblem:

If CONFIG_BT_MAX_CONN = 4, we cannot start connectable advertising after success with 3 periodic synced . We receive this error:

*** Booting nRF Connect SDK v3.0.0-3bfc46578e42 ***
*** Using Zephyr OS v4.0.99-a0e545cb437a ***
[00:00:00.005,218] <inf> main_app: EUI64: 3306911FAB19632F
[00:00:00.005,310] <inf> main_app: Antenna Delay TX 16309, RX 16309
[00:00:00.005,371] <inf> dw3000: RESET on gpio@50000000 pin 24
[00:00:00.005,371] <inf> dw3000: DW3000 SPI (max 32MHz)
[00:00:00.008,636] <inf> dw3000: IRQ on gpio@50000000 pin 19
[00:00:00.008,636] <inf> dw3000: WAKEUP CS
[00:00:00.009,857] <inf> dw3000_utils: Using Default Delay TX 16309, RX 16309
[00:00:00.016,723] <inf> main_app: DW3000_ret: 0
[00:00:00.016,723] <inf> main_app: Starting Periodic Advertising with Responses Synchronization Demo
[00:00:00.016,815] <inf> bt_sdc_hci_driver: SoftDevice Controller build revision: 
                                            c7 53 7d bc 06 12 f7 c0  b3 3a 3e 28 8e 56 1e d7 |.S}..... .:>(.V..
                                            a0 be 95 b0                                      |....             
[00:00:00.019,439] <inf> bt_hci_core: HW Platform: Nordic Semiconductor (0x0002)
[00:00:00.019,470] <inf> bt_hci_core: HW Variant: nRF52x (0x0002)
[00:00:00.019,470] <inf> bt_hci_core: Firmware: Standard Bluetooth controller (0x00) Version 199.32083 Build 4145153724
[00:00:00.020,355] <inf> bt_hci_core: Identity: DD:0F:C1:95:12:65 (random)
[00:00:00.020,385] <inf> bt_hci_core: HCI: version 6.0 (0x0e) revision 0x10e8, manufacturer 0x0059
[00:00:00.020,416] <inf> bt_hci_core: LMP: version 6.0 (0x0e) subver 0x10e8
[00:00:00.021,453] <inf> main_app: Advertise start success
[00:00:00.021,484] <inf> main_app: Waiting for connected...
[00:00:04.648,590] <inf> main_app: Connected, err 0x00 
[00:00:04.649,902] <inf> main_app: Advertise start success
[00:00:04.649,963] <inf> main_app: Waiting for periodic sync...
[00:00:04.964,630] <inf> main_app: Synced to 36:85:C9:D6:F0:90 (random) with 20 subevents
[00:00:04.964,904] <inf> main_app: Set sync to subevent 0
[00:00:04.964,996] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:04.965,270] <inf> main_app: Periodic sync established.
[00:00:04.965,301] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:05.164,459] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:05.164,672] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:05.223,205] <inf> main_app: GATT timing update: F7:02:A5:36:9E:86 (random) subevent=0 slot=0
[00:00:05.223,449] <inf> main_app: Changed sync to subevent 0
[00:00:05.364,440] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:05.364,654] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:05.564,422] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:05.564,636] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:05.673,156] <inf> main_app: Total Synced: 1
[00:00:05.673,217] <inf> main_app: Disconnected, reason 0x13 
[00:00:05.674,407] <inf> main_app: Advertise start success
[00:00:05.764,404] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:05.764,617] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:05.964,385] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:05.964,599] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:06.164,367] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:06.164,581] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:06.364,349] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:06.364,562] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:06.564,331] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:06.564,544] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:06.764,312] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:06.764,526] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:06.964,294] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:06.964,508] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:07.164,276] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:07.164,489] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:07.364,257] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:07.364,501] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:07.564,239] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:07.564,422] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:07.764,221] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:07.764,526] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:07.964,202] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:07.964,447] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:08.164,184] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:08.164,428] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:08.364,166] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:08.364,410] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:08.564,147] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:08.564,392] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:08.764,129] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:08.764,373] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:08.964,111] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:08.964,355] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:09.164,093] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:09.164,337] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:09.364,074] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:09.364,288] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:09.564,056] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:09.564,361] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:09.678,710] <inf> main_app: Connected, err 0x00 
[00:00:09.680,023] <inf> main_app: Advertise start success
[00:00:09.764,038] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:09.764,282] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:09.964,019] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:09.964,263] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:10.153,228] <inf> main_app: Synced to 0B:F4:54:9B:97:90 (random) with 20 subevents
[00:00:10.153,503] <inf> main_app: Set sync to subevent 0
[00:00:10.153,564] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:10.153,778] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:10.164,031] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:10.164,245] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:10.211,822] <inf> main_app: GATT timing update: F1:1C:7E:B3:DE:29 (random) subevent=0 slot=0
[00:00:10.212,005] <wrn> bt_hci_core: opcode 0x2084 status 0x3a 
[00:00:10.212,036] <err> main_app: Failed to set subevents to sync to (err -5)
[00:00:10.353,057] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:10.353,271] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:10.364,013] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:10.364,227] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:10.553,039] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:10.553,283] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:10.563,995] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:10.564,208] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:10.661,834] <inf> main_app: Total Synced: 2
[00:00:10.661,895] <inf> main_app: Disconnected, reason 0x13 
[00:00:10.663,085] <inf> main_app: Advertise start success
[00:00:10.753,051] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:10.753,265] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:10.763,977] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:10.764,190] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:10.953,033] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:10.953,277] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:10.963,958] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:10.964,172] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:11.153,045] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:11.153,259] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:11.163,940] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:11.164,154] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:11.353,027] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:11.353,271] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:11.363,922] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:11.364,135] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:11.553,039] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:11.553,283] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:11.563,903] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:11.564,117] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:11.753,051] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:11.753,265] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:11.763,885] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:11.764,099] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:11.953,033] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:11.953,277] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:11.963,867] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:11.964,080] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:12.153,045] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:12.153,259] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:12.163,848] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:12.164,062] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:12.353,027] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:12.353,240] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:12.363,830] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:12.364,044] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:12.553,039] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:12.553,283] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:12.563,812] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:12.564,025] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:12.753,051] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:12.753,265] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:12.763,793] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:12.764,038] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:12.953,033] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:12.953,277] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:12.963,775] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:12.964,019] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:13.153,045] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:13.153,259] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:13.163,757] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:13.164,001] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:13.353,057] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:13.353,271] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:13.363,739] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:13.363,952] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:13.553,039] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:13.553,283] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:13.563,720] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:13.563,934] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:13.753,051] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:13.753,265] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:13.763,702] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:13.763,916] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:13.953,033] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:13.953,247] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:13.963,684] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:13.963,897] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:14.153,045] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:14.153,228] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:14.163,665] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:14.163,879] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:14.353,057] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:14.353,271] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:14.363,647] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:14.363,922] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:14.471,832] <inf> main_app: Connected, err 0x00 
[00:00:14.473,144] <inf> main_app: Advertise start success
[00:00:14.553,039] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:14.553,283] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:14.563,629] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:14.563,842] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:14.753,051] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:14.753,265] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:14.763,610] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:14.763,824] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:14.877,105] <inf> main_app: Synced to 1F:E1:C2:AE:30:14 (random) with 20 subevents
[00:00:14.877,349] <inf> main_app: Set sync to subevent 0
[00:00:14.877,441] <inf> main_app: Indication from 19987710E7733DA5, subevent 0, responding in slot 0
[00:00:14.877,655] <inf> main_app: Initiator 3306911FAB19632F sending Responder 19987710E7733DA5
[00:00:14.953,033] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:14.953,277] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:14.963,592] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:14.963,806] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:14.985,687] <inf> main_app: GATT timing update: ED:24:90:7A:60:6F (random) subevent=0 slot=0
[00:00:14.985,900] <wrn> bt_hci_core: opcode 0x2084 status 0x3a 
[00:00:14.985,900] <err> main_app: Failed to set subevents to sync to (err -5)
[00:00:15.076,934] <inf> main_app: Indication from 19987710E7733DA5, subevent 0, responding in slot 0
[00:00:15.077,148] <inf> main_app: Initiator 3306911FAB19632F sending Responder 19987710E7733DA5
[00:00:15.153,045] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:15.153,289] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:15.163,574] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:15.163,787] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:15.276,916] <inf> main_app: Indication from 19987710E7733DA5, subevent 0, responding in slot 0
[00:00:15.277,160] <inf> main_app: Initiator 3306911FAB19632F sending Responder 19987710E7733DA5
[00:00:15.353,057] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:15.353,271] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:15.363,586] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:15.363,800] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:15.435,699] <inf> main_app: Total Synced: 3
[00:00:15.435,729] <inf> main_app: Disconnected, reason 0x13 
[00:00:15.436,828] <wrn> bt_hci_core: opcode 0x2039 status 0x0d 
[00:00:15.436,828] <err> bt_adv: Failed to start advertiser
[00:00:15.436,859] <inf> main_app: Failed to start extended advertising  (err -12)
[00:00:15.436,859] <inf> main_app: Advertise start failed
[00:00:15.476,928] <inf> main_app: Indication from 19987710E7733DA5, subevent 0, responding in slot 0
[00:00:15.477,142] <inf> main_app: Initiator 3306911FAB19632F sending Responder 19987710E7733DA5
[00:00:15.553,039] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:15.553,283] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:15.563,537] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:15.563,751] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:15.676,910] <inf> main_app: Indication from 19987710E7733DA5, subevent 0, responding in slot 0
[00:00:15.677,154] <inf> main_app: Initiator 3306911FAB19632F sending Responder 19987710E7733DA5
[00:00:15.753,051] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:15.753,265] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:15.763,549] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:15.763,763] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:15.876,922] <inf> main_app: Indication from 19987710E7733DA5, subevent 0, responding in slot 0
[00:00:15.877,136] <inf> main_app: Initiator 3306911FAB19632F sending Responder 19987710E7733DA5
[00:00:15.953,033] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:15.953,277] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:15.963,531] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:15.963,745] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:16.076,934] <inf> main_app: Indication from 19987710E7733DA5, subevent 0, responding in slot 0
[00:00:16.077,148] <inf> main_app: Initiator 3306911FAB19632F sending Responder 19987710E7733DA5
[00:00:16.153,045] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:16.153,259] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:16.163,513] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:16.163,726] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:16.276,916] <inf> main_app: Indication from 19987710E7733DA5, subevent 0, responding in slot 0
[00:00:16.277,160] <inf> main_app: Initiator 3306911FAB19632F sending Responder 19987710E7733DA5
[00:00:16.353,057] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:16.353,271] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:16.363,494] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:16.363,708] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:16.476,928] <inf> main_app: Indication from 19987710E7733DA5, subevent 0, responding in slot 0
[00:00:16.477,172] <inf> main_app: Initiator 3306911FAB19632F sending Responder 19987710E7733DA5
[00:00:16.553,039] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:16.553,283] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:16.563,476] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:16.563,690] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:16.676,940] <inf> main_app: Indication from 19987710E7733DA5, subevent 0, responding in slot 0
[00:00:16.677,154] <inf> main_app: Initiator 3306911FAB19632F sending Responder 19987710E7733DA5
[00:00:16.753,051] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:16.753,265] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:16.763,458] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:16.763,671] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:16.876,922] <inf> main_app: Indication from 19987710E7733DA5, subevent 0, responding in slot 0
[00:00:16.877,136] <inf> main_app: Initiator 3306911FAB19632F sending Responder 19987710E7733DA5
[00:00:16.953,033] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:16.953,277] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:16.963,439] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:16.963,653] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:17.076,934] <inf> main_app: Indication from 19987710E7733DA5, subevent 0, responding in slot 0
[00:00:17.077,148] <inf> main_app: Initiator 3306911FAB19632F sending Responder 19987710E7733DA5
[00:00:17.153,045] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:17.153,289] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:17.163,421] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:17.163,635] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:17.276,947] <inf> main_app: Indication from 19987710E7733DA5, subevent 0, responding in slot 0
[00:00:17.277,160] <inf> main_app: Initiator 3306911FAB19632F sending Responder 19987710E7733DA5
[00:00:17.353,057] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:17.353,271] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:17.363,403] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:17.363,616] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:17.476,928] <inf> main_app: Indication from 19987710E7733DA5, subevent 0, responding in slot 0
[00:00:17.477,172] <inf> main_app: Initiator 3306911FAB19632F sending Responder 19987710E7733DA5
[00:00:17.553,039] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:17.553,283] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:17.563,385] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:17.563,598] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:17.676,940] <inf> main_app: Indication from 19987710E7733DA5, subevent 0, responding in slot 0
[00:00:17.677,154] <inf> main_app: Initiator 3306911FAB19632F sending Responder 19987710E7733DA5
[00:00:17.753,051] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:17.753,265] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:17.763,366] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:17.763,580] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:17.876,922] <inf> main_app: Indication from 19987710E7733DA5, subevent 0, responding in slot 0
[00:00:17.877,166] <inf> main_app: Initiator 3306911FAB19632F sending Responder 19987710E7733DA5
[00:00:17.953,033] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:17.953,277] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:17.963,378] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:17.963,592] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:18.076,934] <inf> main_app: Indication from 19987710E7733DA5, subevent 0, responding in slot 0
[00:00:18.077,178] <inf> main_app: Initiator 3306911FAB19632F sending Responder 19987710E7733DA5
[00:00:18.153,045] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:18.153,289] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:18.163,360] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:18.163,574] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:18.276,947] <inf> main_app: Indication from 19987710E7733DA5, subevent 0, responding in slot 0
[00:00:18.277,160] <inf> main_app: Initiator 3306911FAB19632F sending Responder 19987710E7733DA5
[00:00:18.353,057] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:18.353,271] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:18.363,342] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:18.363,555] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:18.476,928] <inf> main_app: Indication from 19987710E7733DA5, subevent 0, responding in slot 0
[00:00:18.477,172] <inf> main_app: Initiator 3306911FAB19632F sending Responder 19987710E7733DA5
[00:00:18.553,039] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:18.553,283] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:18.563,323] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:18.563,537] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:18.676,940] <inf> main_app: Indication from 19987710E7733DA5, subevent 0, responding in slot 0
[00:00:18.677,185] <inf> main_app: Initiator 3306911FAB19632F sending Responder 19987710E7733DA5
[00:00:18.753,051] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:18.753,265] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:18.763,305] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:18.763,519] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:18.876,953] <inf> main_app: Indication from 19987710E7733DA5, subevent 0, responding in slot 0
[00:00:18.877,166] <inf> main_app: Initiator 3306911FAB19632F sending Responder 19987710E7733DA5
[00:00:18.953,033] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:18.953,277] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:18.963,287] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:18.963,500] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:19.076,934] <inf> main_app: Indication from 19987710E7733DA5, subevent 0, responding in slot 0
[00:00:19.077,178] <inf> main_app: Initiator 3306911FAB19632F sending Responder 19987710E7733DA5
[00:00:19.153,045] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:19.153,289] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:19.163,269] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:19.163,482] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:19.276,947] <inf> main_app: Indication from 19987710E7733DA5, subevent 0, responding in slot 0
[00:00:19.277,160] <inf> main_app: Initiator 3306911FAB19632F sending Responder 19987710E7733DA5
[00:00:19.353,057] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:19.353,271] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:19.363,250] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:19.363,464] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:19.476,959] <inf> main_app: Indication from 19987710E7733DA5, subevent 0, responding in slot 0
[00:00:19.477,172] <inf> main_app: Initiator 3306911FAB19632F sending Responder 19987710E7733DA5
[00:00:19.553,039] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:19.553,283] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:19.563,232] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:19.563,446] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:19.676,940] <inf> main_app: Indication from 19987710E7733DA5, subevent 0, responding in slot 0
[00:00:19.677,185] <inf> main_app: Initiator 3306911FAB19632F sending Responder 19987710E7733DA5
[00:00:19.753,051] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:19.753,265] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:19.763,214] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:19.763,427] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:19.876,953] <inf> main_app: Indication from 19987710E7733DA5, subevent 0, responding in slot 0
[00:00:19.877,166] <inf> main_app: Initiator 3306911FAB19632F sending Responder 19987710E7733DA5
[00:00:19.953,033] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:19.953,277] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:19.963,195] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:19.963,409] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:20.076,934] <inf> main_app: Indication from 19987710E7733DA5, subevent 0, responding in slot 0
[00:00:20.077,178] <inf> main_app: Initiator 3306911FAB19632F sending Responder 19987710E7733DA5
[00:00:20.153,045] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:20.153,289] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:20.163,177] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:20.163,391] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:20.276,947] <inf> main_app: Indication from 19987710E7733DA5, subevent 0, responding in slot 0
[00:00:20.277,191] <inf> main_app: Initiator 3306911FAB19632F sending Responder 19987710E7733DA5
[00:00:20.353,057] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:20.353,271] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:20.363,159] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:20.363,372] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:20.476,959] <inf> main_app: Indication from 19987710E7733DA5, subevent 0, responding in slot 0
[00:00:20.477,172] <inf> main_app: Initiator 3306911FAB19632F sending Responder 19987710E7733DA5
[00:00:20.553,039] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:20.553,283] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:20.563,140] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:20.563,354] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:20.676,940] <inf> main_app: Indication from 19987710E7733DA5, subevent 0, responding in slot 0
[00:00:20.677,185] <inf> main_app: Initiator 3306911FAB19632F sending Responder 19987710E7733DA5
[00:00:20.753,051] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:20.753,265] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:20.763,122] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:20.763,336] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED
[00:00:20.876,953] <inf> main_app: Indication from 19987710E7733DA5, subevent 0, responding in slot 0
[00:00:20.877,166] <inf> main_app: Initiator 3306911FAB19632F sending Responder 19987710E7733DA5
[00:00:20.953,033] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:20.953,277] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:21.076,965] <inf> main_app: Indication from 19987710E7733DA5, subevent 0, responding in slot 0
[00:00:21.077,178] <inf> main_app: Initiator 3306911FAB19632F sending Responder 19987710E7733DA5
[00:00:21.153,045] <inf> main_app: Indication from 824CD893202B3DA4, subevent 0, responding in slot 0
[00:00:21.153,289] <inf> main_app: Initiator 3306911FAB19632F sending Responder 824CD893202B3DA4
[00:00:21.163,085] <inf> main_app: Indication from 9848800670EBF9ED, subevent 0, responding in slot 0
[00:00:21.163,299] <inf> main_app: Initiator 3306911FAB19632F sending Responder 9848800670EBF9ED


But if we increase CONFIG_BT_MAX_CONN = 8,  we still can start connectable advertising after synced with 3 periodic advertiser.

CONFIG_BT=y
CONFIG_BT_OBSERVER=y
CONFIG_BT_BROADCASTER=y
CONFIG_BT_EXT_ADV=y
CONFIG_BT_PER_ADV_SYNC=y
CONFIG_BT_PER_ADV_SYNC_MAX=4
CONFIG_BT_DEVICE_NAME="PAwR sync sample"

CONFIG_BT_MAX_CONN=4
CONFIG_BT_PERIPHERAL=y
CONFIG_BT_PER_ADV_SYNC_TRANSFER_SENDER=y
CONFIG_BT_PER_ADV_SYNC_TRANSFER_RECEIVER=y

CONFIG_BT_PER_ADV_SYNC_RSP=y
CONFIG_BT_PER_ADV_SYNC_BUF_SIZE=247

CONFIG_LOG=y

CONFIG_DW3000=y
CONFIG_DW3000_CHIP_DW3000=y
CONFIG_SPI=y
CONFIG_GPIO=y

CONFIG_FLASH=y
CONFIG_SPI_NOR=y
CONFIG_CBPRINTF_FP_SUPPORT=y
CONFIG_DK_LIBRARY=y

/*
 * Main application for Tag device: Multi-forklift PAwR sync + UWB TWR + per-peer slot config
 *
 * Copyright (c) 2023 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <zephyr/bluetooth/bluetooth.h>
#include <zephyr/bluetooth/conn.h>
#include <zephyr/bluetooth/gatt.h>
#include <zephyr/bluetooth/uuid.h>
#include <zephyr/bluetooth/hci.h>
#include <zephyr/sys/util.h>
#include <zephyr/sys/byteorder.h>
#include <zephyr/logging/log.h>
#include <zephyr/drivers/flash.h>
#include <nrfx.h>
#include <dk_buttons_and_leds.h>
#include "peer_forklift_manager.h"
#include "dw3000_utils.h"

LOG_MODULE_REGISTER(main_app, CONFIG_MAIN_APP_LOG_LEVEL);

#define DEVICE_NAME         CONFIG_BT_DEVICE_NAME
#define DEVICE_NAME_LEN     (sizeof(DEVICE_NAME) - 1)

uint64_t eui64_from_device = 0;
static K_MUTEX_DEFINE(dw3000_mutex);

static K_SEM_DEFINE(sem_connected, 0, 1);
static K_SEM_DEFINE(sem_per_sync, 0, 1);
static K_SEM_DEFINE(sem_per_sync_lost, 0, 1);

static struct bt_conn *default_conn;

static struct __packed {
	uint64_t eui64;
	uint8_t subevent;
	uint8_t response_slot;
} pawr_timing;

// ---- Manufacturer Data (Advertising Payload) ----
struct adv_mfg_data {
	uint16_t company_code;	    /* Company Identifier Code. */
	uint32_t magic_number;		/* Magic number for filtering */
	uint8_t reserved;			/* Reserved */
	uint8_t node_type;			/* UWB Node type */
	uint64_t eui64;				/* EUI64 of UWB DW3000. */
	int64_t ticks;				/* Ticks of system. */
} __packed;

static struct adv_mfg_data mfg_data;

// ---- Advertising Params ----
struct bt_le_adv_param adv_param_conn =
	BT_LE_ADV_PARAM_INIT(BT_LE_ADV_OPT_EXT_ADV |
				 BT_LE_ADV_OPT_USE_IDENTITY |
				 BT_LE_ADV_OPT_CONN,
			     BT_GAP_ADV_FAST_INT_MIN_2,
			     BT_GAP_ADV_FAST_INT_MAX_2,
			     NULL);

struct bt_le_adv_param adv_param_noconn =
	BT_LE_ADV_PARAM_INIT(BT_LE_ADV_OPT_EXT_ADV |
				 BT_LE_ADV_OPT_USE_IDENTITY,
			     BT_GAP_ADV_FAST_INT_MIN_2,
			     BT_GAP_ADV_FAST_INT_MAX_2,
			     NULL);

struct bt_le_adv_param *adv_param = &adv_param_conn;

static const struct bt_data ad[] = {
    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_MANUFACTURER_DATA, (unsigned char *)&mfg_data, sizeof(mfg_data))
};

static struct bt_le_ext_adv *adv;
static void adv_work_handle(struct k_work *item);
static K_WORK_DEFINE(adv_work, adv_work_handle);

static void adv_connectable(void)
{
    adv_param = &adv_param_conn;
    k_work_submit(&adv_work);
}

static void adv_non_connectable(void)
{
    adv_param = &adv_param_noconn;
    k_work_submit(&adv_work);
}

// ---- PAwR sync callback: add peer, use per-peer subevent/slot ----
static void sync_cb(struct bt_le_per_adv_sync *sync, struct bt_le_per_adv_sync_synced_info *info)
{
    char le_addr[BT_ADDR_LE_STR_LEN];
    bt_addr_le_to_str(info->addr, le_addr, sizeof(le_addr));
    LOG_INF("Synced to %s with %d subevents", le_addr, info->num_subevents);

    struct peer_forklift_entry *peer = peer_forklift_add(sync, 0);
    if (peer) {
        peer->pawr_synced = true;
        peer->last_seen_ms = k_uptime_get();

        // Set subevent/slot for this peer (may default to 0, can be changed later via GATT)
        struct bt_le_per_adv_sync_subevent_params params;
        uint8_t subevents[1] = { peer->subevent };
        params.properties = 0;
        params.num_subevents = 1;
        params.subevents = subevents;
        int err = bt_le_per_adv_sync_subevent(sync, &params);
        if (err) {
            LOG_ERR("Failed to set subevent %d (err %d)", subevents[0], err);
        } else {
            LOG_INF("Set sync to subevent %d", subevents[0]);
        }
    }
    k_sem_give(&sem_per_sync);
}

// ---- PAwR sync lost callback ----
static void term_cb(struct bt_le_per_adv_sync *sync, const struct bt_le_per_adv_sync_term_info *info)
{
    char le_addr[BT_ADDR_LE_STR_LEN];
    bt_addr_le_to_str(info->addr, le_addr, sizeof(le_addr));
    LOG_INF("Sync terminated (reason %d)", info->reason);

    peer_forklift_remove_by_sync(sync);
    k_sem_give(&sem_per_sync_lost);
}

// ---- PAwR Indication/Recv Callback: update peer, trigger TWR ----
static bool print_ad_field(struct bt_data *data, void *user_data)
{
    ARG_UNUSED(user_data);

    LOG_DBG("Type: 0x%02X Len: %u", data->type, data->data_len);
    LOG_HEXDUMP_DBG(data->data, data->data_len, "response_cb");

    uint64_t eui64_forklift;
    memcpy(&eui64_forklift, &data->data[2], sizeof(eui64_forklift));

    if (user_data) {
        memcpy(user_data, &eui64_forklift, sizeof(eui64_forklift));
    }

    return true;
}

int bt_le_per_adv_set_response_data(struct bt_le_per_adv_sync *per_adv_sync,
				    const struct bt_le_per_adv_response_params *params,
				    const struct net_buf_simple *data);

static struct bt_le_per_adv_response_params rsp_params;

NET_BUF_SIMPLE_DEFINE_STATIC(rsp_buf, 247);

static void recv_cb(struct bt_le_per_adv_sync *sync,
            const struct bt_le_per_adv_sync_recv_info *info,
            struct net_buf_simple *buf)
{
    if (!buf || !buf->len) {
        LOG_INF("Received empty indication: subevent %d", info->subevent);
        return;
    }

    struct peer_forklift_entry *peer = peer_forklift_find_by_sync(sync);
    if (!peer) {
        LOG_WRN("No peer for PAwR sync handle");
        return;
    }

    // Prepare response payload
    net_buf_simple_reset(&rsp_buf);
    net_buf_simple_add_mem(&rsp_buf, buf->data, 10);
    net_buf_simple_add_mem(&rsp_buf, &eui64_from_device, 8);
	net_buf_simple_add_mem(&rsp_buf, buf->data + 18, buf->len - 18);

    // Update peer state, TWR schedule (from indication payload)
    uint64_t eui64_forklift = 0;
    bt_data_parse(buf, print_ad_field, &eui64_forklift);

    peer->eui64 = eui64_forklift;
    peer->last_seen_ms = k_uptime_get();
    peer_forklift_schedule_twr(peer, K_NO_WAIT);

    // Prepare response params
    rsp_params.request_event = info->periodic_event_counter;
    rsp_params.request_subevent = info->subevent;
    rsp_params.response_subevent = info->subevent;
    rsp_params.response_slot = peer->response_slot;

    LOG_INF("Indication from %llX, subevent %d, responding in slot %d", peer->eui64, info->subevent, peer->response_slot);

    if (peer->subevent != info->subevent) {
        struct bt_le_per_adv_sync_subevent_params params;
        uint8_t subevents[1] = { peer->subevent };
        params.properties = 0;
        params.num_subevents = 1;
        params.subevents = subevents;
        int err = bt_le_per_adv_sync_subevent(sync, &params);
        if (err) {
            LOG_ERR("Failed to set subevents to sync to (err %d)", err);
        } else {
            LOG_INF("Changed sync to subevent %d", subevents[0]);
        }
    }

    int err = bt_le_per_adv_set_response_data(sync, &rsp_params, &rsp_buf);
    if (err) {
        LOG_ERR("Failed to send response (err %d)", err);
    }
}

// ---- Zephyr sync callback registration ----
static struct bt_le_per_adv_sync_cb sync_callbacks = {
    .synced = sync_cb,
    .term = term_cb,
    .recv = recv_cb,
};

// ---- GATT for per-peer slot config (write timing) ----
static const struct bt_uuid_128 pawr_svc_uuid =
    BT_UUID_INIT_128(BT_UUID_128_ENCODE(0x12345678, 0x1234, 0x5678, 0x1234, 0x56789abcdef0));
static const struct bt_uuid_128 pawr_char_uuid =
    BT_UUID_INIT_128(BT_UUID_128_ENCODE(0x12345678, 0x1234, 0x5678, 0x1234, 0x56789abcdef1));

// Buffer: [0]=subevent, [1]=response_slot
static ssize_t write_timing(struct bt_conn *conn, const struct bt_gatt_attr *attr,
                const void *buf, uint16_t len, uint16_t offset, uint8_t flags)
{
	if (offset) {
		return BT_GATT_ERR(BT_ATT_ERR_INVALID_OFFSET);
	}

	if (len != sizeof(pawr_timing)) {
		return BT_GATT_ERR(BT_ATT_ERR_INVALID_ATTRIBUTE_LEN);
	}

	memcpy(&pawr_timing, buf, len);

    // Find peer by BLE connection's address
    const bt_addr_le_t *addr = bt_conn_get_dst(conn);
    if (!addr) {
        LOG_ERR("Cannot get peer addr from conn!");
        return BT_GATT_ERR(BT_ATT_ERR_UNLIKELY);
    }

    struct peer_forklift_entry *peer = peer_forklift_find_by_eui64(pawr_timing.eui64);
    if (peer) {
        peer->subevent = pawr_timing.subevent;
        peer->response_slot = pawr_timing.response_slot;
        char addr_str[BT_ADDR_LE_STR_LEN];
        bt_addr_le_to_str(addr, addr_str, sizeof(addr_str));
        LOG_INF("GATT timing update: %s subevent=%d slot=%d", addr_str, pawr_timing.subevent, pawr_timing.response_slot);

        // Set subevent/slot for this peer (may default to 0, can be changed later via GATT)
        struct bt_le_per_adv_sync_subevent_params params;
        uint8_t subevents[1] = { peer->subevent };
        params.properties = 0;
        params.num_subevents = 1;
        params.subevents = subevents;
        if (peer->sync) {
            int err = bt_le_per_adv_sync_subevent(peer->sync, &params);
            if (err) {
                LOG_ERR("Failed to set subevents to sync to (err %d)", err);
            } else {
                LOG_INF("Changed sync to subevent %d", subevents[0]);
            }
        } else {
            LOG_INF("Not synced yet");
        }
    } else {
        char addr_str[BT_ADDR_LE_STR_LEN];
        bt_addr_le_to_str(addr, addr_str, sizeof(addr_str));
        LOG_WRN("GATT timing: No matching peer for conn %s", addr_str);
    }

    return len;
}

BT_GATT_SERVICE_DEFINE(pawr_svc, BT_GATT_PRIMARY_SERVICE(&pawr_svc_uuid.uuid),
            BT_GATT_CHARACTERISTIC(&pawr_char_uuid.uuid, BT_GATT_CHRC_WRITE,
                        BT_GATT_PERM_WRITE, NULL, write_timing, NULL));

// ---- BLE connection callbacks ----
void connected(struct bt_conn *conn, uint8_t err)
{
    LOG_INF("Connected, err 0x%02X %s", err, bt_hci_err_to_str(err));
    if (err) {
        default_conn = NULL;
        return;
    }

    default_conn = bt_conn_ref(conn);
    adv_non_connectable();
    k_sem_give(&sem_connected);
}

void disconnected(struct bt_conn *conn, uint8_t reason)
{
    bt_conn_unref(default_conn);
    default_conn = NULL;

    int peer_count = peer_forklift_count();
    LOG_INF("Total Synced: %d", peer_count);
    if (peer_count < CONFIG_BT_PER_ADV_SYNC_MAX) {
        adv_connectable();
    } else {
        adv_non_connectable();
    }

    LOG_INF("Disconnected, reason 0x%02X %s", reason, bt_hci_err_to_str(reason));
}

BT_CONN_CB_DEFINE(conn_cb) = {
    .connected = connected,
    .disconnected = disconnected,
};

static void adv_scanned_cb(struct bt_le_ext_adv *adv,
						struct bt_le_ext_adv_scanned_info *info)
{
	LOG_DBG("Scanned Callback");
}

const static struct bt_le_ext_adv_cb adv_cb = {
	.scanned = adv_scanned_cb,
};

// ---- Advertising Start Logic ----
static int adv_start(void)
{
	int err;
	struct bt_le_ext_adv_start_param ext_adv_start_param = {0};

	if (adv) {
		err = bt_le_ext_adv_stop(adv);
		if (err) {
			LOG_INF("Failed to stop extended advertising  (err %d)", err);
			return err;
		}

		err = bt_le_ext_adv_delete(adv);
		if (err) {
			LOG_INF("Failed to delete advertising set  (err %d)", err);
			return err;
		}
	}

	mfg_data.company_code = sys_cpu_to_le16(CONFIG_BT_COMPANY_ID_NORDIC);
	mfg_data.magic_number = 0xDEADBEEF;
	mfg_data.reserved = 0;
	mfg_data.node_type = NODE_TYPE_TAG;
	mfg_data.eui64 = eui64_from_device;
	mfg_data.ticks = 0;

	err = bt_le_ext_adv_create(adv_param, &adv_cb, &adv);
	if (err) {
		LOG_INF("Failed to create advertising set (err %d)", err);
		return err;
	}

	err = bt_le_ext_adv_set_data(adv, ad, ARRAY_SIZE(ad), NULL, 0);
	if (err) {
		LOG_INF("Failed setting adv data (err %d)", err);
		return err;
	}

	err = bt_le_ext_adv_start(adv, &ext_adv_start_param);
	if (err) {
		LOG_INF("Failed to start extended advertising  (err %d)", err);
		return err;
	}

	return err;
}


static void adv_work_handle(struct k_work *item)
{
	int err = adv_start();
	if (err) {
		LOG_INF("Advertise start failed");
		return;
	}

	LOG_INF("Advertise start success");
}

void read_antenna_delay_from_ext_flash(uint16_t *antenna_delay_tx, uint16_t *antenna_delay_rx)
{
    uint16_t tx = ANTENNA_DELAY_DEFAULT;
    uint16_t rx = ANTENNA_DELAY_DEFAULT;

#if DT_NODE_HAS_STATUS(DT_ALIAS(spi_flash0), okay)
const struct device* const flash_dev = DEVICE_DT_GET(DT_ALIAS(spi_flash0));
    if (!device_is_ready(flash_dev)) {
        LOG_ERR("%s: device not ready.", flash_dev->name);
        goto update_ptr;
    }

    uint8_t f_data[4]; // Read only what you need (first 4 bytes)
    int err = flash_read(flash_dev, 0x80000, f_data, sizeof(f_data));
    if (err) {
        LOG_ERR("Antenna Delay read Ext Flash error %d", err);
        goto update_ptr;
    }

    uint32_t otp = (f_data[0] << 24) | (f_data[1] << 16) | (f_data[2] << 8) | f_data[3];
    if (otp != 0x00000000 && otp != 0xFFFFFFFF) {
        rx = (otp >> 16) & 0xFFFFU;
        tx = otp & 0xFFFFU;
        LOG_INF("Antenna Delay TX %u, RX %u", tx, rx);
    } else {
        LOG_INF("Using Default Delay TX %u, RX %u", tx, rx);
    }
#else
	goto update_ptr;
#endif

update_ptr:
    *antenna_delay_tx = tx;
    *antenna_delay_rx = rx;
}

uint64_t read_eui64_from_device()
{
    uint64_t read_eui64_addr = 0;

    uint8_t eui64[8] = { 0 };
    uint32_t deviceid0 = NRF_FICR->DEVICEID[0];
    uint32_t deviceid1 = NRF_FICR->DEVICEID[1];

    memcpy(eui64, &deviceid0, 4);
    memcpy(eui64 + 4, &deviceid1, 4);
    for (int i = 0; i < 8; i++) {
        read_eui64_addr |= ((uint64_t)eui64[i]) << (8 * i);
    }

    return read_eui64_addr;
}

void uwb_tag_twr(struct peer_forklift_entry *peer)
{
    if (!peer) return;
    if (k_mutex_lock(&dw3000_mutex, K_NO_WAIT) != 0) return;

    bool is_ranging_success = false;
    double distance = 0;

    // dw3000_initialize();
    LOG_INF("Initiator %llX sending Responder %llX", eui64_from_device ,peer->eui64);
    // dw3000_rx_info_t rx_info;
    // transmit_poll_message(rx_info, peer->eui64);
    // if (dw3000_rx_data(&rx_info, find_response_message, POLL_TICKS_TIMEOUT)) {
    //     distance = dw3000_get_distance_from_response_msg(rx_info);
    //     transmit_final_message(rx_info);
    //     is_ranging_success = true;
    // } else {
    //     LOG_WRN("Not found response message from Responder %llX", peer->eui64);
    // }

    // if (is_ranging_success) {
    //     LOG_INF("Initiator %llX and Responder %llX Distance: %+0.12f m Time: %lld",
    //             eui64_from_device, peer->eui64, distance, k_uptime_get() - peer->last_ranged_ms);
    //     peer->last_ranged_ms = k_uptime_get();
    //     peer->last_warn_ms = (distance < WARN_DISTANCE) ? peer->last_ranged_ms : peer->last_warn_ms;
    //     peer->last_alert_ms = (distance < ALERT_DISTANCE) ? peer->last_ranged_ms : peer->last_alert_ms;
    // } else {
    //     LOG_ERR("Ranging with Responder %llX is not success", peer->eui64);
    // }

    // dw3000_sleep();
    k_mutex_unlock(&dw3000_mutex);
}

// ---- Main entrypoint ----

int main(void)
{
    struct bt_le_per_adv_sync_transfer_param past_param;
    int err;

    dk_leds_init();
    peer_forklift_manager_init(); // Peer+TWR static init

    // -- UWB/dw3000 init omitted --
	eui64_from_device = read_eui64_from_device();
	LOG_INF("EUI64: %llX", eui64_from_device);
    dw3000_set_eui64(eui64_from_device);

	uint16_t antenna_delay_tx = 0, antenna_delay_rx = 0;
    read_antenna_delay_from_ext_flash(&antenna_delay_tx, &antenna_delay_rx);
    dw3000_set_antenna_delay(antenna_delay_tx, antenna_delay_rx);

	int dw300_ret = dw3000_initialize();
	LOG_INF("DW3000_ret: %d", dw300_ret);

	// dw3000_sleep();

	LOG_INF("Starting Periodic Advertising with Responses Synchronization Demo");

    err = bt_enable(NULL);
    if (err) {
        LOG_ERR("Bluetooth init failed (err %d)", err);
        return 0;
    }

    bt_le_per_adv_sync_cb_register(&sync_callbacks);

    past_param.skip = 1;
    past_param.timeout = 50;
    past_param.options = BT_LE_PER_ADV_SYNC_TRANSFER_OPT_NONE;
    err = bt_le_per_adv_sync_transfer_subscribe(NULL, &past_param);
    if (err) {
        LOG_ERR("PAST subscribe failed (err %d)", err);
        return 0;
    }

    do {
        adv_connectable();

        LOG_INF("Waiting for connected...");
        err = k_sem_take(&sem_connected, K_FOREVER);
        if (err) {
            LOG_ERR("Timeout waiting for connection");
            return 0;
        }

        LOG_INF("Waiting for periodic sync...");
        err = k_sem_take(&sem_per_sync, K_SECONDS(10));
        if (err) {
            LOG_ERR("Timeout waiting for sync");
            continue;
        }
        LOG_INF("Periodic sync established.");

        err = k_sem_take(&sem_per_sync_lost, K_FOREVER);
        if (err) {
            LOG_ERR("Sync lost wait failed (err %d)", err);
            return 0;
        }
        LOG_INF("Periodic sync lost.");
	} while (true);

    return 0;
}


Question Questions:

  1. What is the correct and minimal set of Kconfig options required to:

    • Sync to multiple periodic 

    • Start a connectable extended advertiser reliably

  2. Are there additional memory pools or controller resources (besides CONFIG_BT_MAX_CONN) that should be increased?


Best regards,

Gear

Related