#include "wifi_hal.h"
#ifndef __WIFI_HAL_RTT_H__
#define __WIFI_HAL_RTT_H__
/* channel operating width */
/* Ranging status */
typedef enum {
RTT_STATUS_SUCCESS,
RTT_STATUS_FAILURE,
RTT_STATUS_FAIL_NO_RSP,
RTT_STATUS_FAIL_REJECTED,
RTT_STATUS_FAIL_NOT_SCHEDULED_YET,
RTT_STATUS_FAIL_TM_TIMEOUT,
RTT_STATUS_FAIL_AP_ON_DIFF_CHANNEL,
RTT_STATUS_FAIL_NO_CAPABILITY,
RTT_STATUS_ABORTED
} wifi_rtt_status;
/* RTT Type */
typedef enum {
RTT_TYPE_INVALID,
RTT_TYPE_1_SIDED,
RTT_TYPE_2_SIDED,
RTT_TYPE_AUTO, // Two sided if remote supports; one sided otherwise
} wifi_rtt_type;
/* RTT configuration */
typedef struct {
mac_addr addr; // peer device mac address
wifi_rtt_type type; // optional - rtt type hint. RTT_TYPE_INVALID implies best effort
wifi_peer_type peer; // optional - peer device hint (STA, P2P, AP)
wifi_channel_info channel; // Required for STA-AP mode, optional for P2P, NBD etc.
byte continuous; // 0 = single shot or 1 = continuous ranging
unsigned interval; // interval of RTT measurement (unit ms) when continuous = true
unsigned num_measurements; // total number of RTT measurements when continuous = true
unsigned num_samples_per_measurement; // num of packets in each RTT measurement
unsigned num_retries_per_measurement; // num of retries if sampling fails
} wifi_rtt_config;
/* RTT results */
typedef struct {
mac_addr addr; // device mac address
unsigned measurement_num; // measurement number in case of continuous ranging
wifi_rtt_status status; // ranging status
wifi_rtt_type type; // RTT type
wifi_peer_type peer; // peer device type (P2P, AP)
wifi_channel_info channel; // channel information
wifi_rssi rssi; // rssi in 0.5 dB steps e.g. 143 implies -71.5 dB
wifi_rssi rssi_spread; // rssi spread in 0.5 dB steps e.g. 5 implies 2.5 dB spread (optional)
wifi_rate tx_rate; // TX rate
wifi_timespan rtt; // round trip time in nanoseconds
wifi_timespan rtt_sd; // rtt standard deviation in nanoseconds
wifi_timespan rtt_spread; // difference between max and min rtt times recorded
int distance; // distance in cm (optional)
int distance_sd; // standard deviation in cm (optional)
int distance_spread; // difference between max and min distance recorded (optional)
wifi_timestamp ts; // time of the measurement (in microseconds since boot)
} wifi_rtt_result;
/* RTT result callback */
typedef struct {
void (*on_rtt_results) (wifi_request_id id, unsigned num_results, wifi_rtt_result rtt_result[]);
} wifi_rtt_event_handler;
/* API to request RTT measurement */
wifi_error wifi_rtt_range_request(wifi_request_id id, wifi_interface_handle iface,
unsigned num_rtt_config, wifi_rtt_config rtt_config[], wifi_rtt_event_handler handler);
/* API to cancel RTT measurements */
wifi_error wifi_rtt_range_cancel(wifi_request_id id, wifi_interface_handle iface,
unsigned num_devices, mac_addr addr[]);
/* NBD ranging channel map */
typedef struct {
wifi_channel availablity[32]; // specifies the channel map for each of the 16 TU windows
// frequency of 0 => unspecified; which means firmware is
// free to do whatever it wants in this window.
} wifi_channel_map;
/* API to start publishing the channel map on responder device in a NBD cluster.
Responder device will take this request and schedule broadcasting the channel map
in a NBD ranging attribute in a SDF. DE will automatically remove the ranging
attribute from the OTA queue after number of DW specified by num_dw
where Each DW is 512 TUs apart */
wifi_error wifi_rtt_channel_map_set(wifi_request_id id,
wifi_interface_handle iface, wifi_channel_map *params, unsigned num_dw);
/* API to clear the channel map on the responder device in a NBD cluster.
Responder device will cancel future ranging channel request, starting from next
DW interval and will also stop broadcasting NBD ranging attribute in SDF */
wifi_error wifi_rtt_channel_map_clear(wifi_request_id id, wifi_interface_handle iface);
/* RTT Capabilities */
typedef struct {
byte rtt_one_sided_supported; // if 1-sided rtt data collection is supported
byte rtt_11v_supported; // if 11v rtt data collection is supported
byte rtt_ftm_supported; // if ftm rtt data collection is supported
} wifi_rtt_capabilities;
/* RTT capabilities of the device */
wifi_error wifi_get_rtt_capabilities(wifi_interface_handle iface, wifi_rtt_capabilities *capabilities);
#endif