Try to set up 2 Initiators with Channel Sounding

I’m currently working on a setup with two Initiators and one Reflector using the Channel Sounding sample.
My goal is to get distance measurements either simultaneously or, if not possible, automatically alternating between the two initiators (without manual reset).

At the moment, I’ve:

  • Flashed the iniator sample on two different dev kits ( which are my two initiators)

  • Adjusted the prj.conf files to include what seemed relevant for multiple connections (see below).

  • Flashed one reflector device with its own configuration.

Everything builds and flashes correctly, and both initiators can measure distance — but only one at a time.
If one initiator is connected, the other cannot start measuring unless I reset the first one.

I would like some guidance on what modifications might be required (either in the main.c of the initiator or reflector, or in the configuration files) to allow both initiators to perform measurements without manual reset.

Here are my current configurations:

#
# Copyright (c) 2024 Nordic Semiconductor ASA
#
# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
#
#Initiators

CONFIG_NCS_SAMPLES_DEFAULTS=y
CONFIG_DK_LIBRARY=y

CONFIG_BT=y
CONFIG_BT_SMP=y
CONFIG_BT_CENTRAL=y
CONFIG_BT_MAX_CONN=2
CONFIG_BT_BONDABLE=n

CONFIG_BT_GATT_CLIENT=y
CONFIG_BT_GATT_DYNAMIC_DB=y

CONFIG_BT_CHANNEL_SOUNDING=y
CONFIG_BT_RAS=y
CONFIG_BT_RAS_RREQ=y

CONFIG_BT_SCAN=y
CONFIG_BT_SCAN_FILTER_ENABLE=y
CONFIG_BT_SCAN_UUID_CNT=1

# The Ranging Profile recommends a MTU of at least 247 octets.
CONFIG_BT_L2CAP_TX_MTU=498
CONFIG_BT_BUF_ACL_TX_SIZE=502
CONFIG_BT_BUF_ACL_RX_SIZE=502
CONFIG_BT_ATT_PREPARE_COUNT=3
CONFIG_BT_CTLR_DATA_LENGTH_MAX=251

# This reduces RAM usage. Additional RAM is needed to support optional
# features such as mode 3 or multiantenna. Change or remove these if
# using those features
CONFIG_BT_RAS_MODE_3_SUPPORTED=n
CONFIG_BT_RAS_MAX_ANTENNA_PATHS=1
CONFIG_BT_CTLR_SDC_CS_MAX_ANTENNA_PATHS=1
CONFIG_BT_CTLR_SDC_CS_NUM_ANTENNAS=1
CONFIG_BT_CTLR_SDC_CS_STEP_MODE3=n
CONFIG_BT_CTLR_SDC_CS_ROLE_INITIATOR_ONLY=y

# Disabling the CS Test command reduces flash usage
CONFIG_BT_CTLR_CHANNEL_SOUNDING_TEST=n

# This allows CS and ACL to use different PHYs
CONFIG_BT_TRANSMIT_POWER_CONTROL=y
CONFIG_BT_CTLR_TX_PWR_PLUS_4=y
# CONFIG_BT_CTLR_TX_PWR_PLUS_8=y

# This improves the performance of floating-point operations
CONFIG_FPU=y
CONFIG_FPU_SHARING=y

CONFIG_CBPRINTF_FP_SUPPORT=y

CONFIG_BT_CS_DE=y
CONFIG_BT_CS_DE_512_NFFT=y

#
# Copyright (c) 2024 Nordic Semiconductor ASA
#
# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
#

CONFIG_NCS_SAMPLES_DEFAULTS=y
CONFIG_DK_LIBRARY=y

CONFIG_BT=y
CONFIG_BT_PERIPHERAL=y
CONFIG_BT_SMP=y
CONFIG_BT_DEVICE_NAME="Nordic CS Reflector"
CONFIG_BT_MAX_CONN=2
CONFIG_BT_GAP_AUTO_UPDATE_CONN_PARAMS=n
CONFIG_BT_BONDABLE=n

CONFIG_BT_CTLR_SDC_CS_COUNT=2
CONFIG_BT_MAX_PAIRED=2
CONFIG_BT_CTLR_SDC_PERIPHERAL_COUNT=2

# The Ranging Profile recommends a MTU of at least 247 octets.
CONFIG_BT_L2CAP_TX_MTU=498
CONFIG_BT_BUF_ACL_TX_SIZE=502
CONFIG_BT_BUF_ACL_RX_SIZE=502
CONFIG_BT_CTLR_DATA_LENGTH_MAX=251
CONFIG_BT_CTLR_PHY_2M=y

# This reduces RAM usage. Additional RAM is needed to support optional
# features such as mode 3 or multiantenna. Change or remove these if
# using those features
CONFIG_BT_RAS_MODE_3_SUPPORTED=n
CONFIG_BT_RAS_MAX_ANTENNA_PATHS=1
CONFIG_BT_CTLR_SDC_CS_MAX_ANTENNA_PATHS=1
CONFIG_BT_CTLR_SDC_CS_NUM_ANTENNAS=1
CONFIG_BT_CTLR_SDC_CS_STEP_MODE3=n
CONFIG_BT_CTLR_SDC_CS_ROLE_REFLECTOR_ONLY=y

# Disabling the CS Test command reduces flash usage
CONFIG_BT_CTLR_CHANNEL_SOUNDING_TEST=n

# This allows CS and ACL to use different PHYs
CONFIG_BT_TRANSMIT_POWER_CONTROL=y
# CONFIG_BT_CTLR_TX_PWR_PLUS_4=y
CONFIG_BT_CTLR_TX_PWR_PLUS_8=y

CONFIG_BT_CHANNEL_SOUNDING=y
CONFIG_BT_RAS=y
CONFIG_BT_RAS_RRSP=y

Thank you for your help and time

Parents
  • Hi Fhar, as of right now they recommend doing it sequentially rather than concurrently as it has not been optimized.

  • I Triscuit, thank you for your response. 
    What do you recommand to change to the code to do it sequentially ? 
    Thank you very much 

  • Hi!

    What Triscuit is saying is correct! You would need to start a connection with a new one. I believe our DevAcademy course on BLE might be a good starting point.

    Regards,

    Elfving

  • Thank you Elfving, I followed your advice and did the BLE course.

    You would need to start a connection with a new one.

    do you mean that I need to create two different initiator applications?

    From what I understand, each initiator would act as a separate central device, and the reflector would be the peripheral.

    Would it be easier instead to have two advertising peripheral devices (i.e., two reflectors) and one initiator that connects to them alternately?

    Thank you for your help, 
    Regards

    Fhar

  • Note that CS roles are independent from Bluetooth roles so you can have a device be central and reflectors as well as peripheral and initiator. This option makes it easier for one moveable battery powered device to work with multiple mains powered (or bigger battery option) devices as all the processing is kept of the smaller device while still allowing one device to set the Bluetooth timing to all nodes. If you have 2+ centrals then the single peripheral will not have control of timing and collisions are likely to occur.

    The Bluetooth stack in the nRF Connect SDK already supports this and we have seen people build such solutions running with concurrent connections already, it's just a question about setting up the timing correctly.

  • Hi Paka, 

    Thank you again for your explaination. I would like to follow the approach now (1 initiator (central) / 2 reflectors(peripherals)), but I’m still struggling a bit with the concrete implementation.

    Would the main changes need to be done primarily in int main() in the main.c of the initiator? For example, should all the Channel Sounding procedures be moved into a loop to alternate between the two reflectors? 

    My initial idea was to scan the reflectors, store them in an array, and then alternate between connecting and disconnecting to perform measurements. However, I’m unsure how and where in the code this should be implemented.

    I’m still new to this type of technology, so I really appreciate any guidance or advice you can give.

    Thank you very much for your time and help!

    Best regards,
    Fhar

Reply
  • Hi Paka, 

    Thank you again for your explaination. I would like to follow the approach now (1 initiator (central) / 2 reflectors(peripherals)), but I’m still struggling a bit with the concrete implementation.

    Would the main changes need to be done primarily in int main() in the main.c of the initiator? For example, should all the Channel Sounding procedures be moved into a loop to alternate between the two reflectors? 

    My initial idea was to scan the reflectors, store them in an array, and then alternate between connecting and disconnecting to perform measurements. However, I’m unsure how and where in the code this should be implemented.

    I’m still new to this type of technology, so I really appreciate any guidance or advice you can give.

    Thank you very much for your time and help!

    Best regards,
    Fhar

Children
  • Hi again Fhar,

    Fhar said:
    do you mean that I need to create two different initiator applications?

    Well, maybe that is something you need. But that was not what I meant. I just meant that if you had one initiator and multiple reflectors then you would need to first connect to reflector A, and do a ranging with that one, then disconnect to that one. Afterwards you can then do the same to reflector B. 

    Entering a connection with one, then starting a connection with another is what I figured would be nicely introduced in the BLE course. 

    Though actually now, like Paka briefly mentioned, there is support for concurrent connections in SDK (given that you use the newest SDK), though the samples are apparently not set-up to take advantage of this yet. I am bit uncertain about how this is done, so the sequential way might still be an idea.

    Fhar said:
    Would the main changes need to be done primarily in int main() in the main.c of the initiator? For example, should all the Channel Sounding procedures be moved into a loop to alternate between the two reflectors? 

    Something like a loop might be an idea. Or a workqueue. Though I think the best first step would be to try to disconnect from the reflector. And then try to reconnect to another one.

    I see that I might have to make a demo of this myself. I'll look into that next week.

    Regards,

    Elfving

  • Hi Elfving,

    Thanks for your advice! I managed to make it work with 1 initiator 2 reflector & 2 initiators and 1 reflector (using the same code) using a loop: I scan and store reflectors’ addresses, then connect sequentially and a function which handles the full Channel Sounding procedure for the current connection—setting security, performing discovery, configuring CS parameters, enabling the procedure, and collecting distance measurements—before disconnecting.

    It works, but I sometimes see stack overflow/semaphore issues. Could you clarify how a workqueue should be used here to avoid this?

    Thank you very much, 

    Fhar

  • Hi,

    Just chiming in here as I am also testing this in a similar scenario, but I'm using 1 initiator and 3 reflectors.

    In my setup, the initiator (modified this initiator code) connects to all the available reflectors (unmodified reflector code), and then sequentially enables channel sounding (no disconnecting/connecting once connection is established), performs the ranging and disables CS for each reflector. It works, but not very reliably so I'm trying to figure out what parameters to strategically test with. I've also had some success with establishing relatively slow connection intervals (50-100ms) for the devices, and then setting the connection interval to a much faster one (7.5ms) for the current channel sounding procedure. That solved a lot of my problems with not getting valid measurements, but I'm not sure whether it's an optimal approach.

    Did you try something similar? I'm curious if you have any info on how quickly you're getting measurements, counting the full length of one complete procedure between two devices. What parameters are you using?

    For Nordic:

    Do you have a rough estimate for how fast it is possible to get distance estimates between two devices, when we have multiple connections? I'm testing with a few devices, but ideally I'd like to have as many connections as possible working reliably (up to 20 is the soft device limitation, if I understood correctly?).

    Most of the implementation challenges I've had so far is due to me trying to force sequential ranging, I'm very curious to see any example on how a concurrent implementation could be done as it would simplify things a lot. Are you planning to release any sample code on this in the near future?

    I'll attach the some of the output from the Initiator's serial monitor for reference, to see what results I'm getting with my current implementation.As you can see it struggles a little initially, but after a few rounds the measurement stabilizes. The estimates themselves are far off (true distance is 10-20cm on my desk in the office), as I've haven't dived into the distance estimation algorithm just yet. So far the best I've seen is around 120-130ms (counting from the enabling and disabling, see output below):

    *** Booting nRF Connect SDK v3.1.0-6c6e5b32496e ***
    *** Using Zephyr OS v4.1.99-1612683d4010 ***
    [00:00:00.008,968] <inf> app_main: Starting Channel Sounding Initiator Sample
    [00:00:00.016,500] <inf> app_main: Will connect to up to 3 reflectors
    [00:00:00.023,428] <inf> bt_sdc_hci_driver: SoftDevice Controller build revision: 
                                                fc de 41 eb a2 d1 42 24  00 b5 f8 57 9f ac 9d 9e |..A...B$ ...W....
                                                aa c9 b4 34                                      |...4             
    [00:00:00.053,286] <inf> bt_hci_core: HW Platform: Nordic Semiconductor (0x0002)
    [00:00:00.061,022] <inf> bt_hci_core: HW Variant: nRF54Lx (0x0005)
    [00:00:00.067,612] <inf> bt_hci_core: Firmware: Standard Bluetooth controller (0x00) Version 252.16862 Build 1121034987
    [00:00:00.079,463] <inf> bt_hci_core: HCI transport: SDC
    [00:00:00.085,153] <inf> bt_hci_core: Identity: FF:FC:D2:CB:43:A2 (random)
    [00:00:00.092,403] <inf> bt_hci_core: HCI: version 6.1 (0x0f) revision 0x3069, manufacturer 0x0059
    [00:00:00.101,780] <inf> bt_hci_core: LMP: version 6.1 (0x0f) subver 0x3069
    [00:00:00.109,817] <inf> app_main: Scanning for reflectors...
    [00:00:00.115,924] <inf> app_main: Waiting for 3 reflectors to connect...
    [00:00:00.179,344] <inf> app_main: Filters matched. Address: D6:B4:FD:62:55:CC (random) connectable: 1
    [00:00:00.190,689] <inf> app_main: Connecting
    [00:00:00.282,983] <inf> app_main: Connected to D6:B4:FD:62:55:CC (random) (1/3 connections)
    [00:00:00.292,839] <inf> app_main: Device 1/3 connected
    [00:00:00.310,525] <inf> app_main: Filters matched. Address: D9:ED:BF:85:BA:8A (random) connectable: 1
    [00:00:00.322,949] <inf> app_main: Connecting
    [00:00:00.415,741] <inf> app_main: Connected to D9:ED:BF:85:BA:8A (random) (2/3 connections)
    [00:00:00.425,608] <inf> app_main: Device 2/3 connected
    [00:00:00.469,046] <inf> app_main: Filters matched. Address: C6:65:B6:3D:44:17 (random) connectable: 1
    [00:00:00.479,515] <inf> app_main: Connecting
    [00:00:00.576,318] <inf> app_main: Connected to C6:65:B6:3D:44:17 (random) (3/3 connections)
    [00:00:00.586,243] <inf> app_main: Device 3/3 connected
    [00:00:00.592,007] <inf> app_main: All 3 reflectors connected! Starting CS setup...
    [00:00:00.600,259] <inf> app_main: Updated connection interval to 70.0ms for D6:B4:FD:62:55:CC (random)
    [00:00:00.609,999] <inf> app_main: Configuring CS for device 1/3: D6:B4:FD:62:55:CC (random)
    [00:00:00.619,047] <inf> app_main: Setting up CS for D6:B4:FD:62:55:CC (random)
    [00:00:01.684,421] <inf> app_main: Security changed: D6:B4:FD:62:55:CC (random) level 2
    [00:00:01.824,401] <inf> app_main: MTU exchange success (498)
    [00:00:02.384,407] <inf> app_main: The discovery procedure succeeded
    [00:00:02.524,411] <inf> app_main: Read RAS feature bits: 0x1
    [00:00:02.734,433] <inf> app_main: CS capability exchange completed.
    [00:00:02.944,335] <inf> app_main: CS config creation complete. ID: 0
    [00:00:03.224,403] <inf> app_main: CS security enabled.
    [00:00:03.230,197] <inf> app_main: CS setup complete for D6:B4:FD:62:55:CC (random)
    [00:00:03.238,206] <inf> app_main: CS configured for device D6:B4:FD:62:55:CC (random) (1/3 complete)
    [00:00:03.248,076] <inf> app_main: Updated connection interval to 90.0ms for D9:ED:BF:85:BA:8A (random)
    [00:00:03.257,824] <inf> app_main: Configuring CS for device 2/3: D9:ED:BF:85:BA:8A (random)
    [00:00:03.266,898] <inf> app_main: Setting up CS for D9:ED:BF:85:BA:8A (random)
    [00:00:04.524,422] <inf> app_main: Security changed: D9:ED:BF:85:BA:8A (random) level 2
    [00:00:04.704,403] <inf> app_main: MTU exchange success (498)
    [00:00:05.424,444] <inf> app_main: The discovery procedure succeeded
    [00:00:05.694,412] <inf> app_main: Read RAS feature bits: 0x1
    [00:00:05.964,434] <inf> app_main: CS capability exchange completed.
    [00:00:06.234,336] <inf> app_main: CS config creation complete. ID: 0
    [00:00:06.594,403] <inf> app_main: CS security enabled.
    [00:00:06.600,198] <inf> app_main: CS setup complete for D9:ED:BF:85:BA:8A (random)
    [00:00:06.608,206] <inf> app_main: CS configured for device D9:ED:BF:85:BA:8A (random) (2/3 complete)
    [00:00:06.618,236] <inf> app_main: Updated connection interval to 120.0ms for C6:65:B6:3D:44:17 (random)
    [00:00:06.628,070] <inf> app_main: Configuring CS for device 3/3: C6:65:B6:3D:44:17 (random)
    [00:00:06.636,946] <inf> app_main: Setting up CS for C6:65:B6:3D:44:17 (random)
    [00:00:07.974,424] <inf> app_main: Security changed: C6:65:B6:3D:44:17 (random) level 2
    [00:00:08.214,404] <inf> app_main: MTU exchange success (498)
    [00:00:09.174,409] <inf> app_main: The discovery procedure succeeded
    [00:00:09.414,413] <inf> app_main: Read RAS feature bits: 0x1
    [00:00:09.774,435] <inf> app_main: CS capability exchange completed.
    [00:00:10.134,337] <inf> app_main: CS config creation complete. ID: 0
    [00:00:10.614,406] <inf> app_main: CS security enabled.
    [00:00:10.620,198] <inf> app_main: CS setup complete for C6:65:B6:3D:44:17 (random)
    [00:00:10.628,202] <inf> app_main: CS configured for device C6:65:B6:3D:44:17 (random) (3/3 complete)
    [00:00:10.637,820] <inf> app_main: CS configuration complete. 3/3 reflectors operational
    [00:00:10.646,544] <inf> app_main: 
    [00:00:10.650,443] <inf> app_main: 
    [00:00:10.654,345] <inf> app_main: 
    [00:00:10.658,252] <inf> app_main: === Distance Estimates (Round Robin) ===
    [00:00:10.665,619] <inf> app_main: Connected reflectors:
    [00:00:10.671,376] <inf> app_main:   1) D6:B4:FD:62:55:CC
    [00:00:10.677,184] <inf> app_main:   2) D9:ED:BF:85:BA:8A
    [00:00:10.682,992] <inf> app_main:   3) C6:65:B6:3D:44:17
    [00:00:11.227,018] <inf> app_main: CS procedures enabled for D6:B4:FD:62:55:CC (random)
    [00:00:11.235,596] <inf> app_main: Ranging with D6:B4:FD:62:55:CC... (attempt 1)
    [00:00:11.279,036] <wrn> app_main: [D6:B4:FD:62:55:CC (random)] ��� NO LOCAL STEP DATA for procedure 0
    [00:00:11.289,120] <wrn> app_main: [D6:B4:FD:62:55:CC (random)] Missing local step data for counter 0
    [00:00:11.299,129] <wrn> app_main: [D6:B4:FD:62:55:CC] Measurement attempt 1 produced no valid data
    [00:00:11.339,384] <inf> app_main: CS procedures disabled.
    [00:00:11.467,018] <inf> app_main: CS procedures enabled for D6:B4:FD:62:55:CC (random)
    [00:00:11.475,596] <inf> app_main: Ranging with D6:B4:FD:62:55:CC... (attempt 2)
    [00:00:11.555,676] <inf> app_main: [D6:B4:FD:62:55:CC] AP 0: ifft: 0.35 m, phase_slope: 0.69 m, rtt: nan m
    [00:00:11.594,383] <inf> app_main: CS procedures disabled.
    [00:00:12.309,520] <inf> app_main: CS procedures enabled for D9:ED:BF:85:BA:8A (random)
    [00:00:12.318,103] <inf> app_main: Ranging with D9:ED:BF:85:BA:8A... (attempt 1)
    [00:00:12.361,538] <wrn> app_main: [D9:ED:BF:85:BA:8A (random)] ��� NO LOCAL STEP DATA for procedure 0
    [00:00:12.371,619] <wrn> app_main: [D9:ED:BF:85:BA:8A (random)] Missing local step data for counter 0
    [00:00:12.381,629] <wrn> app_main: [D9:ED:BF:85:BA:8A] Measurement attempt 1 produced no valid data
    [00:00:12.429,385] <inf> app_main: CS procedures disabled.
    [00:00:12.549,520] <inf> app_main: CS procedures enabled for D9:ED:BF:85:BA:8A (random)
    [00:00:12.558,134] <inf> app_main: Ranging with D9:ED:BF:85:BA:8A... (attempt 2)
    [00:00:12.630,739] <inf> app_main: [D9:ED:BF:85:BA:8A] AP 0: ifft: 0.58 m, phase_slope: 0.87 m, rtt: nan m
    [00:00:12.669,385] <inf> app_main: CS procedures disabled.
    [00:00:13.644,520] <inf> app_main: CS procedures enabled for C6:65:B6:3D:44:17 (random)
    [00:00:13.653,102] <inf> app_main: Ranging with C6:65:B6:3D:44:17... (attempt 1)
    [00:00:13.733,212] <inf> app_main: [C6:65:B6:3D:44:17] AP 0: ifft: 0.42 m, phase_slope: 0.74 m, rtt: nan m
    [00:00:13.771,886] <inf> app_main: CS procedures disabled.
    [00:00:13.777,997] <inf> app_main: 
    [00:00:13.782,025] <inf> app_main: 
    [00:00:13.785,926] <inf> app_main: 
    [00:00:13.789,950] <inf> app_main: === Distance Estimates (Round Robin) ===
    [00:00:13.797,466] <inf> app_main: Connected reflectors:
    [00:00:13.803,377] <inf> app_main:   1) D6:B4:FD:62:55:CC
    [00:00:13.809,390] <inf> app_main:   2) D9:ED:BF:85:BA:8A
    [00:00:13.815,190] <inf> app_main:   3) C6:65:B6:3D:44:17
    [00:00:14.344,552] <inf> app_main: CS procedures enabled for D6:B4:FD:62:55:CC (random)
    [00:00:14.353,119] <inf> app_main: Ranging with D6:B4:FD:62:55:CC... (attempt 1)
    [00:00:14.425,613] <inf> app_main: [D6:B4:FD:62:55:CC] AP 0: ifft: 0.35 m, phase_slope: 0.65 m, rtt: nan m
    [00:00:14.464,384] <inf> app_main: CS procedures disabled.
    [00:00:15.182,020] <inf> app_main: CS procedures enabled for D9:ED:BF:85:BA:8A (random)
    [00:00:15.190,597] <inf> app_main: Ranging with D9:ED:BF:85:BA:8A... (attempt 1)
    [00:00:15.234,038] <wrn> app_main: [D9:ED:BF:85:BA:8A (random)] ��� NO LOCAL STEP DATA for procedure 2
    [00:00:15.244,122] <wrn> app_main: [D9:ED:BF:85:BA:8A (random)] Missing local step data for counter 2
    [00:00:15.254,218] <wrn> app_main: [D9:ED:BF:85:BA:8A] Measurement attempt 1 produced no valid data
    [00:00:15.301,885] <inf> app_main: CS procedures disabled.
    [00:00:15.429,553] <inf> app_main: CS procedures enabled for D9:ED:BF:85:BA:8A (random)
    [00:00:15.438,120] <inf> app_main: Ranging with D9:ED:BF:85:BA:8A... (attempt 2)
    [00:00:15.525,646] <inf> app_main: [D9:ED:BF:85:BA:8A] AP 0: ifft: 0.58 m, phase_slope: 0.82 m, rtt: nan m
    [00:00:15.556,885] <inf> app_main: CS procedures disabled.
    [00:00:16.502,020] <inf> app_main: CS procedures enabled for C6:65:B6:3D:44:17 (random)
    [00:00:16.510,600] <inf> app_main: Ranging with C6:65:B6:3D:44:17... (attempt 1)
    [00:00:16.546,974] <wrn> app_main: [C6:65:B6:3D:44:17 (random)] ✗ NO LOCAL STEP DATA for procedure 1
    [00:00:16.557,005] <wrn> app_main: [C6:65:B6:3D:44:17 (random)] Missing local step data for counter 1
    [00:00:16.567,067] <wrn> app_main: [C6:65:B6:3D:44:17] Measurement attempt 1 produced no valid data
    [00:00:16.599,386] <inf> app_main: CS procedures disabled.
    [00:00:16.734,521] <inf> app_main: CS procedures enabled for C6:65:B6:3D:44:17 (random)
    [00:00:16.743,102] <inf> app_main: Ranging with C6:65:B6:3D:44:17... (attempt 2)
    [00:00:16.779,454] <wrn> app_main: [C6:65:B6:3D:44:17 (random)] ��� NO LOCAL STEP DATA for procedure 2
    [00:00:16.789,469] <wrn> app_main: [C6:65:B6:3D:44:17 (random)] Missing local step data for counter 2
    [00:00:16.799,650] <wrn> app_main: [C6:65:B6:3D:44:17] Measurement attempt 2 produced no valid data
    [00:00:16.839,386] <inf> app_main: CS procedures disabled.
    [00:00:16.959,521] <inf> app_main: CS procedures enabled for C6:65:B6:3D:44:17 (random)
    [00:00:16.968,139] <inf> app_main: Ranging with C6:65:B6:3D:44:17... (attempt 3)
    [00:00:17.040,643] <inf> app_main: [C6:65:B6:3D:44:17] AP 0: ifft: 0.42 m, phase_slope: 0.72 m, rtt: nan m
    [00:00:17.079,386] <inf> app_main: CS procedures disabled.
    [00:00:17.085,502] <inf> app_main: 
    [00:00:17.089,528] <inf> app_main: 
    [00:00:17.093,428] <inf> app_main: 
    [00:00:17.097,539] <inf> app_main: === Distance Estimates (Round Robin) ===
    [00:00:17.105,053] <inf> app_main: Connected reflectors:
    [00:00:17.110,963] <inf> app_main:   1) D6:B4:FD:62:55:CC
    [00:00:17.116,902] <inf> app_main:   2) D9:ED:BF:85:BA:8A
    [00:00:17.122,703] <inf> app_main:   3) C6:65:B6:3D:44:17
    [00:00:17.712,018] <inf> app_main: CS procedures enabled for D6:B4:FD:62:55:CC (random)
    [00:00:17.720,604] <inf> app_main: Ranging with D6:B4:FD:62:55:CC... (attempt 1)
    [00:00:17.800,645] <inf> app_main: [D6:B4:FD:62:55:CC] AP 0: ifft: 0.34 m, phase_slope: 0.75 m, rtt: nan m
    [00:00:17.831,884] <inf> app_main: CS procedures disabled.
    [00:00:18.534,520] <inf> app_main: CS procedures enabled for D9:ED:BF:85:BA:8A (random)
    [00:00:18.543,097] <inf> app_main: Ranging with D9:ED:BF:85:BA:8A... (attempt 1)
    [00:00:18.586,538] <wrn> app_main: [D9:ED:BF:85:BA:8A (random)] ��� NO LOCAL STEP DATA for procedure 4
    [00:00:18.596,582] <wrn> app_main: [D9:ED:BF:85:BA:8A (random)] Missing local step data for counter 4
    [00:00:18.606,613] <wrn> app_main: [D9:ED:BF:85:BA:8A] Measurement attempt 1 produced no valid data
    [00:00:18.639,385] <inf> app_main: CS procedures disabled.
    [00:00:18.767,019] <inf> app_main: CS procedures enabled for D9:ED:BF:85:BA:8A (random)
    [00:00:18.775,600] <inf> app_main: Ranging with D9:ED:BF:85:BA:8A... (attempt 2)
    [00:00:18.811,975] <wrn> app_main: [D9:ED:BF:85:BA:8A (random)] ��� NO LOCAL STEP DATA for procedure 5
    [00:00:18.822,004] <wrn> app_main: [D9:ED:BF:85:BA:8A (random)] Missing local step data for counter 5
    [00:00:18.832,068] <wrn> app_main: [D9:ED:BF:85:BA:8A] Measurement attempt 2 produced no valid data
    [00:00:18.864,418] <inf> app_main: CS procedures disabled.
    [00:00:18.984,519] <inf> app_main: CS procedures enabled for D9:ED:BF:85:BA:8A (random)
    [00:00:18.993,100] <inf> app_main: Ranging with D9:ED:BF:85:BA:8A... (attempt 3)
    [00:00:19.072,590] <inf> app_main: [D9:ED:BF:85:BA:8A] AP 0: ifft: nan m, phase_slope: 0.86 m, rtt: nan m
    [00:00:19.104,385] <inf> app_main: CS procedures disabled.
    [00:00:20.042,021] <inf> app_main: CS procedures enabled for C6:65:B6:3D:44:17 (random)
    [00:00:20.050,604] <inf> app_main: Ranging with C6:65:B6:3D:44:17... (attempt 1)
    [00:00:20.123,178] <inf> app_main: [C6:65:B6:3D:44:17] AP 0: ifft: 0.43 m, phase_slope: 0.71 m, rtt: nan m
    [00:00:20.161,886] <inf> app_main: CS procedures disabled.
    [00:00:20.168,002] <inf> app_main: 
    [00:00:20.172,029] <inf> app_main: 
    [00:00:20.175,929] <inf> app_main: 
    [00:00:20.179,945] <inf> app_main: === Distance Estimates (Round Robin) ===
    [00:00:20.187,460] <inf> app_main: Connected reflectors:
    [00:00:20.193,380] <inf> app_main:   1) D6:B4:FD:62:55:CC
    [00:00:20.199,182] <inf> app_main:   2) D9:ED:BF:85:BA:8A
    [00:00:20.205,179] <inf> app_main:   3) C6:65:B6:3D:44:17
    [00:00:20.854,519] <inf> app_main: CS procedures enabled for D6:B4:FD:62:55:CC (random)
    [00:00:20.863,101] <inf> app_main: Ranging with D6:B4:FD:62:55:CC... (attempt 1)
    [00:00:20.935,676] <inf> app_main: [D6:B4:FD:62:55:CC] AP 0: ifft: 0.36 m, phase_slope: 0.75 m, rtt: nan m
    [00:00:20.974,384] <inf> app_main: CS procedures disabled.
    [00:00:21.707,019] <inf> app_main: CS procedures enabled for D9:ED:BF:85:BA:8A (random)
    [00:00:21.715,598] <inf> app_main: Ranging with D9:ED:BF:85:BA:8A... (attempt 1)
    [00:00:21.795,677] <inf> app_main: [D9:ED:BF:85:BA:8A] AP 0: ifft: 0.57 m, phase_slope: 0.86 m, rtt: nan m
    [00:00:21.826,885] <inf> app_main: CS procedures disabled.
    [00:00:22.764,520] <inf> app_main: CS procedures enabled for C6:65:B6:3D:44:17 (random)
    [00:00:22.773,099] <inf> app_main: Ranging with C6:65:B6:3D:44:17... (attempt 1)
    [00:00:22.845,745] <inf> app_main: [C6:65:B6:3D:44:17] AP 0: ifft: 0.41 m, phase_slope: 0.71 m, rtt: nan m
    [00:00:22.884,386] <inf> app_main: CS procedures disabled.
    [00:00:22.890,499] <inf> app_main: 
    [00:00:22.894,526] <inf> app_main: 
    [00:00:22.898,426] <inf> app_main: 
    [00:00:22.902,537] <inf> app_main: === Distance Estimates (Round Robin) ===
    [00:00:22.910,053] <inf> app_main: Connected reflectors:
    [00:00:22.915,964] <inf> app_main:   1) D6:B4:FD:62:55:CC
    [00:00:22.921,765] <inf> app_main:   2) D9:ED:BF:85:BA:8A
    [00:00:22.927,764] <inf> app_main:   3) C6:65:B6:3D:44:17
    [00:00:23.577,018] <inf> app_main: CS procedures enabled for D6:B4:FD:62:55:CC (random)
    [00:00:23.585,597] <inf> app_main: Ranging with D6:B4:FD:62:55:CC... (attempt 1)
    [00:00:23.658,146] <inf> app_main: [D6:B4:FD:62:55:CC] AP 0: ifft: 0.35 m, phase_slope: 0.64 m, rtt: nan m
    [00:00:23.696,883] <inf> app_main: CS procedures disabled.
    [00:00:24.429,520] <inf> app_main: CS procedures enabled for D9:ED:BF:85:BA:8A (random)
    [00:00:24.438,097] <inf> app_main: Ranging with D9:ED:BF:85:BA:8A... (attempt 1)
    [00:00:24.518,084] <inf> app_main: [D9:ED:BF:85:BA:8A] AP 0: ifft: 0.58 m, phase_slope: 0.86 m, rtt: nan m
    [00:00:24.549,385] <inf> app_main: CS procedures disabled.
    [00:00:25.487,021] <inf> app_main: CS procedures enabled for C6:65:B6:3D:44:17 (random)
    [00:00:25.495,598] <inf> app_main: Ranging with C6:65:B6:3D:44:17... (attempt 1)
    [00:00:25.568,178] <inf> app_main: [C6:65:B6:3D:44:17] AP 0: ifft: 0.41 m, phase_slope: 0.66 m, rtt: nan m
    [00:00:25.606,886] <inf> app_main: CS procedures disabled.
    [00:00:25.612,996] <inf> app_main: 
    [00:00:25.617,033] <inf> app_main: 
    [00:00:25.620,934] <inf> app_main: 
    [00:00:25.624,949] <inf> app_main: === Distance Estimates (Round Robin) ===
    [00:00:25.632,463] <inf> app_main: Connected reflectors:
    [00:00:25.638,381] <inf> app_main:   1) D6:B4:FD:62:55:CC
    [00:00:25.644,182] <inf> app_main:   2) D9:ED:BF:85:BA:8A
    [00:00:25.650,179] <inf> app_main:   3) C6:65:B6:3D:44:17
    [00:00:26.299,519] <inf> app_main: CS procedures enabled for D6:B4:FD:62:55:CC (random)
    [00:00:26.308,105] <inf> app_main: Ranging with D6:B4:FD:62:55:CC... (attempt 1)
    [00:00:26.380,709] <inf> app_main: [D6:B4:FD:62:55:CC] AP 0: ifft: 0.35 m, phase_slope: 0.70 m, rtt: nan m
    [00:00:26.419,384] <inf> app_main: CS procedures disabled.
    [00:00:27.152,020] <inf> app_main: CS procedures enabled for D9:ED:BF:85:BA:8A (random)
    [00:00:27.160,597] <inf> app_main: Ranging with D9:ED:BF:85:BA:8A... (attempt 1)
    [00:00:27.240,710] <inf> app_main: [D9:ED:BF:85:BA:8A] AP 0: ifft: 0.58 m, phase_slope: 0.89 m, rtt: nan m
    [00:00:27.271,885] <inf> app_main: CS procedures disabled.
    [00:00:28.209,520] <inf> app_main: CS procedures enabled for C6:65:B6:3D:44:17 (random)
    [00:00:28.218,103] <inf> app_main: Ranging with C6:65:B6:3D:44:17... (attempt 1)
    [00:00:28.290,679] <inf> app_main: [C6:65:B6:3D:44:17] AP 0: ifft: 0.41 m, phase_slope: 0.70 m, rtt: nan m
    [00:00:28.329,386] <inf> app_main: CS procedures disabled.
    [00:00:28.335,499] <inf> app_main: 
    [00:00:28.339,525] <inf> app_main: 
    [00:00:28.343,425] <inf> app_main: 
    [00:00:28.347,449] <inf> app_main: === Distance Estimates (Round Robin) ===
    [00:00:28.354,962] <inf> app_main: Connected reflectors:
    [00:00:28.360,880] <inf> app_main:   1) D6:B4:FD:62:55:CC
    [00:00:28.366,680] <inf> app_main:   2) D9:ED:BF:85:BA:8A
    [00:00:28.372,677] <inf> app_main:   3) C6:65:B6:3D:44:17
    [00:00:29.022,018] <inf> app_main: CS procedures enabled for D6:B4:FD:62:55:CC (random)
    [00:00:29.030,602] <inf> app_main: Ranging with D6:B4:FD:62:55:CC... (attempt 1)
    [00:00:29.103,208] <inf> app_main: [D6:B4:FD:62:55:CC] AP 0: ifft: 0.37 m, phase_slope: 0.74 m, rtt: nan m
    [00:00:29.141,884] <inf> app_main: CS procedures disabled.
    [00:00:29.874,520] <inf> app_main: CS procedures enabled for D9:ED:BF:85:BA:8A (random)
    [00:00:29.883,100] <inf> app_main: Ranging with D9:ED:BF:85:BA:8A... (attempt 1)
    [00:00:29.963,243] <inf> app_main: [D9:ED:BF:85:BA:8A] AP 0: ifft: 0.58 m, phase_slope: 0.84 m, rtt: nan m
    [00:00:29.994,385] <inf> app_main: CS procedures disabled.
    [00:00:30.932,021] <inf> app_main: CS procedures enabled for C6:65:B6:3D:44:17 (random)
    [00:00:30.940,598] <inf> app_main: Ranging with C6:65:B6:3D:44:17... (attempt 1)
    [00:00:31.013,149] <inf> app_main: [C6:65:B6:3D:44:17] AP 0: ifft: 0.42 m, phase_slope: 0.72 m, rtt: nan m
    [00:00:31.051,886] <inf> app_main: CS procedures disabled.

    Not meaning to hijack the thread here, just thought we might be interested in achieving the same thing. Let me know if it is preferred that I make a new thread for this.

  • Simon Klovning said:
    Do you have a rough estimate for how fast it is possible to get distance estimates between two devices, when we have multiple connections?

    As in a theoretical number? No not really, atleast yet. I believe this might also depend on the number of devices.

    Simon Klovning said:
    I'm testing with a few devices, but ideally I'd like to have as many connections as possible working reliably (up to 20 is the soft device limitation, if I understood correctly?).

    Correct, with the zephyr controller there is no limit. Though this is rarely a limitation people run into, because the performance goes down with more connections. If you want to use as many devices as possible, I wouldn't keep all the connections, but rather connect with a given device when you need it.

    Simon Klovning said:
    Are you planning to release any sample code on this in the near future?

    I am not allowed to comment on future plans here unfortunately..

    Simon Klovning said:
    Not meaning to hijack the thread here, just thought we might be interested in achieving the same thing. Let me know if it is preferred that I make a new thread for this.

    No problem at all, glad to make this a public discussion.

    Regards

Related