nRF Connect SDK API 3.3.99
Loading...
Searching...
No Matches
ras.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2024 Nordic Semiconductor ASA
3 *
4 * SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
5 */
6
7#ifndef BT_RAS_H_
8#define BT_RAS_H_
9
10#include <stdint.h>
11#include <zephyr/kernel.h>
12#include <zephyr/bluetooth/conn.h>
13#include <zephyr/bluetooth/cs.h>
14#include <zephyr/bluetooth/uuid.h>
15#include <zephyr/bluetooth/hci_types.h>
16#include <bluetooth/gatt_dm.h>
17
24#ifdef __cplusplus
25extern "C" {
26#endif
27
29#define BT_UUID_RANGING_SERVICE_VAL (0x185B)
30
32#define BT_UUID_RAS_FEATURES_VAL (0x2C14)
33
35#define BT_UUID_RAS_REALTIME_RD_VAL (0x2C15)
36
38#define BT_UUID_RAS_ONDEMAND_RD_VAL (0x2C16)
39
41#define BT_UUID_RAS_CP_VAL (0x2C17)
42
44#define BT_UUID_RAS_RD_READY_VAL (0x2C18)
45
47#define BT_UUID_RAS_RD_OVERWRITTEN_VAL (0x2C19)
48
49#define BT_UUID_RANGING_SERVICE BT_UUID_DECLARE_16(BT_UUID_RANGING_SERVICE_VAL)
50#define BT_UUID_RAS_FEATURES BT_UUID_DECLARE_16(BT_UUID_RAS_FEATURES_VAL)
51#define BT_UUID_RAS_REALTIME_RD BT_UUID_DECLARE_16(BT_UUID_RAS_REALTIME_RD_VAL)
52#define BT_UUID_RAS_ONDEMAND_RD BT_UUID_DECLARE_16(BT_UUID_RAS_ONDEMAND_RD_VAL)
53#define BT_UUID_RAS_CP BT_UUID_DECLARE_16(BT_UUID_RAS_CP_VAL)
54#define BT_UUID_RAS_RD_READY BT_UUID_DECLARE_16(BT_UUID_RAS_RD_READY_VAL)
55#define BT_UUID_RAS_RD_OVERWRITTEN BT_UUID_DECLARE_16(BT_UUID_RAS_RD_OVERWRITTEN_VAL)
56
57#define BT_RAS_RANGING_HEADER_LEN 4
58#define BT_RAS_SUBEVENT_HEADER_LEN 8
59#define BT_RAS_STEP_MODE_LEN 1
60
61#define BT_RAS_MAX_SUBEVENTS_PER_PROCEDURE 32
62#define BT_RAS_MAX_STEPS_PER_PROCEDURE 256
63
64#define BT_RAS_STEP_MODE_2_3_ANT_DEPENDENT_LEN(antenna_paths) \
65 ((antenna_paths + 1) * sizeof(struct bt_hci_le_cs_step_data_tone_info))
66
67#define BT_RAS_STEP_MODE_0_MAX_LEN \
68 MAX(sizeof(struct bt_hci_le_cs_step_data_mode_0_initiator), \
69 sizeof(struct bt_hci_le_cs_step_data_mode_0_reflector))
70#define BT_RAS_STEP_MODE_1_MAX_LEN (sizeof(struct bt_hci_le_cs_step_data_mode_1))
71#define BT_RAS_STEP_MODE_2_MAX_LEN \
72 (sizeof(struct bt_hci_le_cs_step_data_mode_2) + \
73 BT_RAS_STEP_MODE_2_3_ANT_DEPENDENT_LEN(CONFIG_BT_RAS_MAX_ANTENNA_PATHS))
74#define BT_RAS_STEP_MODE_3_MAX_LEN \
75 (sizeof(struct bt_hci_le_cs_step_data_mode_3) + \
76 BT_RAS_STEP_MODE_2_3_ANT_DEPENDENT_LEN(CONFIG_BT_RAS_MAX_ANTENNA_PATHS))
77
78#define BT_RAS_STEP_MODE_0_1_MAX_LEN MAX(BT_RAS_STEP_MODE_0_MAX_LEN, BT_RAS_STEP_MODE_1_MAX_LEN)
79#define BT_RAS_STEP_MODE_0_1_2_MAX_LEN MAX(BT_RAS_STEP_MODE_0_1_MAX_LEN, BT_RAS_STEP_MODE_2_MAX_LEN)
80
81#if defined(CONFIG_BT_RAS_MODE_3_SUPPORTED)
82#define BT_RAS_MAX_STEP_DATA_LEN MAX(BT_RAS_STEP_MODE_0_1_2_MAX_LEN, BT_RAS_STEP_MODE_3_MAX_LEN)
83#else
84#define BT_RAS_MAX_STEP_DATA_LEN BT_RAS_STEP_MODE_0_1_2_MAX_LEN
85#endif
86
87#define BT_RAS_PROCEDURE_MEM \
88 (BT_RAS_RANGING_HEADER_LEN + \
89 (BT_RAS_MAX_SUBEVENTS_PER_PROCEDURE * BT_RAS_SUBEVENT_HEADER_LEN) + \
90 (BT_RAS_MAX_STEPS_PER_PROCEDURE * BT_RAS_STEP_MODE_LEN) + \
91 (BT_RAS_MAX_STEPS_PER_PROCEDURE * BT_RAS_MAX_STEP_DATA_LEN))
92
100
106 uint16_t ranging_counter : 12;
108 uint8_t config_id : 4;
119} __packed;
120BUILD_ASSERT(sizeof(struct ras_ranging_header) == BT_RAS_RANGING_HEADER_LEN);
121
173BUILD_ASSERT(sizeof(struct ras_subevent_header) == BT_RAS_SUBEVENT_HEADER_LEN);
174
185 void (*new_ranging_data_received)(struct bt_conn *conn, uint16_t ranging_counter);
186
196 void (*ranging_data_overwritten)(struct bt_conn *conn, uint16_t ranging_counter);
197
198 sys_snode_t node;
199};
200
213 struct bt_conn *conn;
221 atomic_t refcount;
223 bool ready;
225 bool busy;
227 bool acked;
229 union {
231 struct {
232 struct ras_ranging_header ranging_header;
233 uint8_t subevents[];
234 } __packed;
236};
237
249int bt_ras_rrsp_alloc(struct bt_conn *conn);
250
261void bt_ras_rrsp_free(struct bt_conn *conn);
262
270
282bool bt_ras_rd_buffer_ready_check(struct bt_conn *conn, uint16_t ranging_counter);
283
294struct ras_rd_buffer *bt_ras_rd_buffer_claim(struct bt_conn *conn, uint16_t ranging_counter);
295
308
322int bt_ras_rd_buffer_bytes_pull(struct ras_rd_buffer *buf, uint8_t *out_buf, uint16_t max_data_len,
323 uint16_t *read_cursor, bool *empty);
324
330typedef void (*bt_ras_rreq_rd_ready_cb_t)(struct bt_conn *conn, uint16_t ranging_counter);
331
338typedef void (*bt_ras_rreq_rd_overwritten_cb_t)(struct bt_conn *conn, uint16_t ranging_counter);
339
347typedef void (*bt_ras_rreq_ranging_data_received_t)(struct bt_conn *conn, uint16_t ranging_counter,
348 int err);
349
361typedef void (*bt_ras_rreq_features_read_cb_t)(struct bt_conn *conn, uint32_t feature_bits,
362 int err);
363
375int bt_ras_rreq_alloc_and_assign_handles(struct bt_gatt_dm *dm, struct bt_conn *conn);
376
389 bt_gatt_subscribe_func_t subscription_change_cb);
390
406int bt_ras_rreq_cp_get_ranging_data(struct bt_conn *conn, struct net_buf_simple *ranging_data_out,
407 uint16_t ranging_counter,
408 bt_ras_rreq_ranging_data_received_t data_get_complete_cb);
409
416void bt_ras_rreq_free(struct bt_conn *conn);
417
428int bt_ras_rreq_cp_subscribe(struct bt_conn *conn);
429
440int bt_ras_rreq_cp_unsubscribe(struct bt_conn *conn);
441
456int bt_ras_rreq_on_demand_rd_subscribe(struct bt_conn *conn);
457
468int bt_ras_rreq_on_demand_rd_unsubscribe(struct bt_conn *conn);
469
483
494int bt_ras_rreq_rd_ready_unsubscribe(struct bt_conn *conn);
495
509
521
543int bt_ras_rreq_realtime_rd_subscribe(struct bt_conn *conn, struct net_buf_simple *ranging_data_out,
544 bt_ras_rreq_ranging_data_received_t data_received_cb);
545
556int bt_ras_rreq_realtime_rd_unsubscribe(struct bt_conn *conn);
557
570
579typedef bool (*bt_ras_rreq_ranging_header_cb_t)(struct ras_ranging_header *ranging_header,
580 void *user_data);
581
590typedef bool (*bt_ras_rreq_subevent_header_cb_t)(struct ras_subevent_header *subevent_header,
591 void *user_data);
592
602typedef bool (*bt_ras_rreq_step_data_cb_t)(struct bt_le_cs_subevent_step *local_step,
603 struct bt_le_cs_subevent_step *peer_step,
604 void *user_data);
605
623void bt_ras_rreq_rd_subevent_data_parse(struct net_buf_simple *peer_ranging_data_buf,
624 struct net_buf_simple *local_step_data_buf,
625 enum bt_conn_le_cs_role cs_role,
626 bt_ras_rreq_ranging_header_cb_t ranging_header_cb,
627 bt_ras_rreq_subevent_header_cb_t subevent_header_cb,
628 bt_ras_rreq_step_data_cb_t step_data_cb, void *user_data);
629
636static inline uint16_t bt_ras_rreq_get_ranging_counter(uint16_t procedure_counter)
637{
638 return procedure_counter & 0xFFF;
639}
640
641#ifdef __cplusplus
642}
643#endif
644
649#endif /* BT_RAS_H_ */
int bt_ras_rrsp_alloc(struct bt_conn *conn)
Allocate Ranging Responder instance for connection.
int bt_ras_rreq_rd_overwritten_unsubscribe(struct bt_conn *conn)
Unsubscribe from ranging data overwritten notifications.
void(* bt_ras_rreq_rd_ready_cb_t)(struct bt_conn *conn, uint16_t ranging_counter)
Ranging data ready callback. Called when peer has ranging data available.
Definition ras.h:330
void(* bt_ras_rreq_features_read_cb_t)(struct bt_conn *conn, uint32_t feature_bits, int err)
RAS features read callback.
Definition ras.h:361
#define BT_RAS_PROCEDURE_MEM
Definition ras.h:87
int bt_ras_rreq_cp_get_ranging_data(struct bt_conn *conn, struct net_buf_simple *ranging_data_out, uint16_t ranging_counter, bt_ras_rreq_ranging_data_received_t data_get_complete_cb)
Get ranging data for given ranging counter.
int bt_ras_rd_buffer_bytes_pull(struct ras_rd_buffer *buf, uint8_t *out_buf, uint16_t max_data_len, uint16_t *read_cursor, bool *empty)
Pull bytes from a ranging data buffer.
bool(* bt_ras_rreq_step_data_cb_t)(struct bt_le_cs_subevent_step *local_step, struct bt_le_cs_subevent_step *peer_step, void *user_data)
Provide step data for each step back to the user.
Definition ras.h:602
#define BT_RAS_SUBEVENT_HEADER_LEN
Definition ras.h:58
int bt_ras_rreq_rd_ready_subscribe(struct bt_conn *conn, bt_ras_rreq_rd_ready_cb_t cb)
Subscribe to ranging data ready notifications. These notify when on-demand ranging data is available ...
int bt_ras_rreq_cp_subscribe(struct bt_conn *conn)
Subscribe to RAS-CP. Required to be called before bt_ras_rreq_cp_get_ranging_data.
int bt_ras_rd_buffer_release(struct ras_rd_buffer *buf)
Release a claimed ranging data buffer.
#define BT_RAS_RANGING_HEADER_LEN
Definition ras.h:57
void bt_ras_rd_buffer_cb_register(struct bt_ras_rd_buffer_cb *cb)
Register ranging data buffer callbacks.
bool(* bt_ras_rreq_ranging_header_cb_t)(struct ras_ranging_header *ranging_header, void *user_data)
Provide ranging header for the ranging data back to the user.
Definition ras.h:579
static uint16_t bt_ras_rreq_get_ranging_counter(uint16_t procedure_counter)
Convert CS procedure counter to RAS ranging counter.
Definition ras.h:636
int bt_ras_rreq_subscription_change_cb_register(struct bt_conn *conn, bt_gatt_subscribe_func_t subscription_change_cb)
Register a callback for GATT subscriptions and unsubscriptions attempted by the RREQ.
int bt_ras_rreq_realtime_rd_subscribe(struct bt_conn *conn, struct net_buf_simple *ranging_data_out, bt_ras_rreq_ranging_data_received_t data_received_cb)
Subscribe to real-time ranging data notifications.
int bt_ras_rreq_rd_overwritten_subscribe(struct bt_conn *conn, bt_ras_rreq_rd_overwritten_cb_t cb)
Subscribe to ranging data overwritten notifications. These notify when on-demand ranging data is no l...
ras_feat
RAS Features as defined in RAS Specification, Table 3.3.
Definition ras.h:94
@ RAS_FEAT_REALTIME_RD
Definition ras.h:95
@ RAS_FEAT_RETRIEVE_LOST_RD_SEG
Definition ras.h:96
@ RAS_FEAT_ABORT_OP
Definition ras.h:97
@ RAS_FEAT_FILTER_RD
Definition ras.h:98
int bt_ras_rreq_cp_unsubscribe(struct bt_conn *conn)
Unsubscribe from RAS-CP.
void bt_ras_rreq_free(struct bt_conn *conn)
Free RREQ context for connection. This will unsubscribe from any remaining subscriptions.
bool bt_ras_rd_buffer_ready_check(struct bt_conn *conn, uint16_t ranging_counter)
Check if a given ranging counter is available.
void bt_ras_rrsp_free(struct bt_conn *conn)
Free Ranging Responder instance for connection.
int bt_ras_rreq_rd_ready_unsubscribe(struct bt_conn *conn)
Unsubscribe from ranging data ready notifications.
void bt_ras_rreq_rd_subevent_data_parse(struct net_buf_simple *peer_ranging_data_buf, struct net_buf_simple *local_step_data_buf, enum bt_conn_le_cs_role cs_role, bt_ras_rreq_ranging_header_cb_t ranging_header_cb, bt_ras_rreq_subevent_header_cb_t subevent_header_cb, bt_ras_rreq_step_data_cb_t step_data_cb, void *user_data)
Parse peer ranging data buffer and local step data buffer.
int bt_ras_rreq_realtime_rd_unsubscribe(struct bt_conn *conn)
Unsubscribe from real-time ranging data notifications.
void(* bt_ras_rreq_rd_overwritten_cb_t)(struct bt_conn *conn, uint16_t ranging_counter)
Ranging data overwritten callback. Called when peer has overwritten previously available ranging data...
Definition ras.h:338
void(* bt_ras_rreq_ranging_data_received_t)(struct bt_conn *conn, uint16_t ranging_counter, int err)
Ranging data complete callback. Called when complete ranging data has been received from the peer.
Definition ras.h:347
int bt_ras_rreq_on_demand_rd_unsubscribe(struct bt_conn *conn)
Unsubscribe from on-demand ranging data notifications.
bool(* bt_ras_rreq_subevent_header_cb_t)(struct ras_subevent_header *subevent_header, void *user_data)
Provide subevent header for each subevent back to the user.
Definition ras.h:590
int bt_ras_rreq_read_features(struct bt_conn *conn, bt_ras_rreq_features_read_cb_t cb)
Read supported RAS features from peer.
int bt_ras_rreq_on_demand_rd_subscribe(struct bt_conn *conn)
Subscribe to on-demand ranging data notifications. Required to be called before bt_ras_rreq_cp_get_ra...
int bt_ras_rreq_alloc_and_assign_handles(struct bt_gatt_dm *dm, struct bt_conn *conn)
Allocate a RREQ context and assign GATT handles. Takes a reference to the connection.
struct ras_rd_buffer * bt_ras_rd_buffer_claim(struct bt_conn *conn, uint16_t ranging_counter)
Claim a buffer with a given ranging counter.
void(* ranging_data_overwritten)(struct bt_conn *conn, uint16_t ranging_counter)
Ranging data has been overwritten.
Definition ras.h:196
void(* new_ranging_data_received)(struct bt_conn *conn, uint16_t ranging_counter)
New ranging data has been received from the local controller.
Definition ras.h:185
sys_snode_t node
Definition ras.h:198
RAS Ranging Data Buffer callback structure.
Definition ras.h:176
uint16_t ranging_counter
Definition ras.h:106
uint8_t antenna_paths_mask
Definition ras.h:118
uint8_t config_id
Definition ras.h:108
int8_t selected_tx_power
Definition ras.h:110
Ranging Header structure as defined in RAS Specification, Table 3.7.
Definition ras.h:102
uint16_t subevent_cursor
Definition ras.h:217
uint16_t ranging_counter
Definition ras.h:215
bool ready
Definition ras.h:223
atomic_t refcount
Definition ras.h:221
uint8_t buf[(4+(32 *8)+(256 *1)+(256 *MAX(MAX(MAX(sizeof(struct bt_hci_le_cs_step_data_mode_0_initiator), sizeof(struct bt_hci_le_cs_step_data_mode_0_reflector)),(sizeof(struct bt_hci_le_cs_step_data_mode_1))),(sizeof(struct bt_hci_le_cs_step_data_mode_2)+((CONFIG_BT_RAS_MAX_ANTENNA_PATHS+1) *sizeof(struct bt_hci_le_cs_step_data_tone_info))))))]
Definition ras.h:230
bool busy
Definition ras.h:225
struct bt_conn * conn
Definition ras.h:213
bool acked
Definition ras.h:227
union ras_rd_buffer::@164 procedure
RAS Ranging Data buffer structure.
Definition ras.h:211
uint8_t subevent_abort_reason
Definition ras.h:165
uint8_t ranging_abort_reason
Definition ras.h:154
int8_t ref_power_level
Definition ras.h:167
uint8_t subevent_done_status
Definition ras.h:143
uint8_t ranging_done_status
Definition ras.h:137
uint16_t freq_compensation
Definition ras.h:130
uint8_t num_steps_reported
Definition ras.h:171
uint16_t start_acl_conn_event
Definition ras.h:125
Subevent Header structure as defined in RAS Specification, Table 3.8.
Definition ras.h:123