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

/* NOTE: Definitions used internal to ULL implementations */

#define SCAN_HANDLE_1M        0
#define SCAN_HANDLE_PHY_CODED 1

#define EXT_SCAN_DURATION_UNIT_US 10000U
#define EXT_SCAN_PERIOD_UNIT_US   1280000U

/* Convert period in 1.28 s units to duration of 10 ms units*/
#define ULL_SCAN_PERIOD_TO_DURATION(period) \
	((uint32_t)(period) * EXT_SCAN_PERIOD_UNIT_US / \
	 EXT_SCAN_DURATION_UNIT_US)

/* Convert duration in 10 ms unit to radio events count */
#define ULL_SCAN_DURATION_TO_EVENTS(duration, interval) \
	(((uint32_t)(duration) * EXT_SCAN_DURATION_UNIT_US / \
	  SCAN_INT_UNIT_US) / (interval))

/* Convert period in 1.28 s unit to radio events count */
#define ULL_SCAN_PERIOD_TO_EVENTS(period, interval) \
	(((uint32_t)(period) * EXT_SCAN_PERIOD_UNIT_US / \
	  SCAN_INT_UNIT_US) / (interval))

int ull_scan_init(void);
int ull_scan_reset(void);

/* Set scan parameters */
void ull_scan_params_set(struct lll_scan *lll, uint8_t type, uint16_t interval,
			 uint16_t window, uint8_t filter_policy);

/* Enable and start scanning/initiating role */
uint8_t ull_scan_enable(struct ll_scan_set *scan);

/* Disable scanning/initiating role */
uint8_t ull_scan_disable(uint8_t handle, struct ll_scan_set *scan);

/* Helper function to handle scan done events */
void ull_scan_done(struct node_rx_event_done *done);

/* Helper function to dequeue scan timeout event */
void ull_scan_term_dequeue(uint8_t handle);

/* Return ll_scan_set context (unconditional) */
struct ll_scan_set *ull_scan_set_get(uint8_t handle);

/* Return the scan set handle given the scan set instance */
uint8_t ull_scan_handle_get(struct ll_scan_set *scan);

/* Helper function to check and return if a valid scan context */
struct ll_scan_set *ull_scan_is_valid_get(struct ll_scan_set *scan);

/* Return ll_scan_set context if enabled */
struct ll_scan_set *ull_scan_is_enabled_get(uint8_t handle);

/* Return ll_scan_set context if disabled */
struct ll_scan_set *ull_scan_is_disabled_get(uint8_t handle);

/* Return flags if enabled */
#define ULL_SCAN_IS_PASSIVE   BIT(0)
#define ULL_SCAN_IS_ACTIVE    BIT(1)
#define ULL_SCAN_IS_INITIATOR BIT(2)
#define ULL_SCAN_IS_SYNC      BIT(3)
uint32_t ull_scan_is_enabled(uint8_t handle);

/* Return filter policy used */
uint32_t ull_scan_filter_pol_get(uint8_t handle);

int ull_scan_aux_init(void);
int ull_scan_aux_reset(void);

/* Helper to setup scanning on auxiliary channel */
void ull_scan_aux_setup(memq_link_t *link, struct node_rx_hdr *rx);

/* Helper to clean up auxiliary channel scanning */
void ull_scan_aux_done(struct node_rx_event_done *done);

/* Return the scan aux set instance given the handle */
struct ll_scan_aux_set *ull_scan_aux_set_get(uint8_t handle);

/* Helper function to check and return if a valid aux scan context */
struct ll_scan_aux_set *ull_scan_aux_is_valid_get(struct ll_scan_aux_set *aux);

/* Helper function to flush and release incomplete auxiliary PDU chaining */
void ull_scan_aux_release(memq_link_t *link, struct node_rx_hdr *rx);

/* Helper function to stop auxiliary scan context */
int ull_scan_aux_stop(struct ll_scan_aux_set *aux);
