/*
 * Copyright (c) 2020 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/* PDU_ANTENNA is defined outside of the #if block below because
 * radio_df_pdu_antenna_switch_pattern_get() can get called even when
 * the preprocessor condition being tested is 0. In this case, we use
 * the default value of 0.
 */
#define PDU_ANTENNA DT_PROP_OR(RADIO_NODE, dfe_pdu_antenna, 0)

/* Function configures Radio with information about GPIO pins that may be
 * used to drive antenna switching during CTE Tx/RX.
 */
void radio_df_ant_switching_pin_sel_cfg(void);
/* Configures GPIO pins in GPIO peripheral. The pins will be used for antenna
 * switching during CTE Rx/Tx.
 */
void radio_df_ant_switching_gpios_cfg(void);
/* Provides number of available antennas for Direction Finding. */
uint8_t radio_df_ant_num_get(void);

/* Sets Direction Finding AOA mode. */
void radio_df_mode_set_aoa(void);
/* Sets Direction Finding AOD mode. */
void radio_df_mode_set_aod(void);

/* Configure CTE transmission with 2us antenna switching for AoD. */
void radio_df_cte_tx_aod_2us_set(uint8_t cte_len);
/* Configure CTE transmission with 4us antenna switching for AoD. */
void radio_df_cte_tx_aod_4us_set(uint8_t cte_len);
/* Configure CTE transmission with for AoA. */
void radio_df_cte_tx_aoa_set(uint8_t cte_len);
/* Configure CTE reception with optionall AoA mode and 2us antenna switching. */
void radio_df_cte_rx_2us_switching(bool cte_info_in_s1, uint8_t phy);
/* Configure CTE reception with optionall AoA mode and 4us antenna switching. */
void radio_df_cte_rx_4us_switching(bool cte_info_in_s1, uint8_t phy);

/* Clears antenna switch pattern. */
void radio_df_ant_switch_pattern_clear(void);
/* Set antenna switch pattern. Pay attention, patterns are added to
 * Radio internal list. Before start of new patterns clear the list
 * by call to @ref radio_df_ant_switch_pattern_clear.
 */
void radio_df_ant_switch_pattern_set(const uint8_t *patterns, uint8_t len);
/* Provides switch pattern of antenna used to transmit PDU that is used to
 * transmit CTE
 */
uint8_t radio_df_pdu_antenna_switch_pattern_get(void);
/* Resets Direction Finding radio configuration */
void radio_df_reset(void);

/* Completes switching and enables shortcut between PHYEND and TXEN events */
void radio_switch_complete_and_phy_end_b2b_tx(uint8_t phy_curr, uint8_t flags_curr,
					      uint8_t phy_next, uint8_t flags_next);

/* Set buffer to store IQ samples collected during CTE sampling */
void radio_df_iq_data_packet_set(uint8_t *buffer, size_t len);
/* Get number of stored IQ samples during CTE receive */
uint32_t radio_df_iq_samples_amount_get(void);
/* Get CTE status (CTEInfo) parsed by Radio from received PDU */
uint8_t radio_df_cte_status_get(void);
/* Get information if CTE was present in a received packet */
bool radio_df_cte_ready(void);
