/** @file
 * @brief Bluetooth Controller Ticker functions
 *
 */

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

#include <zephyr.h>
#include <shell/shell.h>
#include <misc/printk.h>

#if defined(CONFIG_SOC_FAMILY_NRF)
#include "../controller/hal/nrf5/ticker.h"
#endif /* CONFIG_SOC_FAMILY_NRF */

#include "../controller/util/memq.h"
#include "../controller/util/mayfly.h"
#include "../controller/ticker/ticker.h"

#define TICKER_SHELL_MODULE "ticker"

#if defined(CONFIG_BT_MAX_CONN)
#define TICKERS_MAX (CONFIG_BT_MAX_CONN + 2)
#else
#define TICKERS_MAX 2
#endif

static void ticker_op_done(u32_t err, void *context)
{
	*((u32_t volatile *)context) = err;
}

int cmd_ticker_info(int argc, char *argv[])
{
	struct {
		u8_t id;
		u32_t ticks_to_expire;
	} tickers[TICKERS_MAX];
	u32_t ticks_to_expire;
	u32_t ticks_current;
	u8_t tickers_count;
	u8_t ticker_id;
	u8_t retry;
	u8_t i;

	ticker_id = TICKER_NULL;
	ticks_to_expire = 0;
	ticks_current = 0;
	tickers_count = 0;
	retry = 4;
	do {
		u32_t volatile err_cb = TICKER_STATUS_BUSY;
		u32_t ticks_previous;
		u32_t err;

		ticks_previous = ticks_current;

		err = ticker_next_slot_get(0, MAYFLY_CALL_ID_PROGRAM,
					   &ticker_id, &ticks_current,
					   &ticks_to_expire,
					   ticker_op_done, (void *)&err_cb);
		if (err == TICKER_STATUS_BUSY) {
			while (err_cb == TICKER_STATUS_BUSY) {
				ticker_job_sched(0, MAYFLY_CALL_ID_PROGRAM);
			}
		}

		if ((err_cb != TICKER_STATUS_SUCCESS) ||
		    (ticker_id == TICKER_NULL)) {
			printk("Query done (0x%02x, err= %u).\n", ticker_id,
			       err);

			break;
		}

		if (ticks_current != ticks_previous) {
			retry--;
			if (!retry) {
				printk("Retry again, tickers too busy now.\n");

				return -EAGAIN;
			}

			if (tickers_count) {
				tickers_count = 0;

				printk("Query reset, %u retries remaining.\n",
				       retry);
			}
		}

		tickers[tickers_count].id = ticker_id;
		tickers[tickers_count].ticks_to_expire = ticks_to_expire;
		tickers_count++;

	} while (tickers_count < TICKERS_MAX);

	printk("Tickers: %u.\n", tickers_count);
	printk("Tick: %u (%uus).\n", ticks_current,
	       HAL_TICKER_TICKS_TO_US(ticks_current));

	if (!tickers_count) {
		return 0;
	}

	printk("---------------------\n");
	printk(" id   offset   offset\n");
	printk("      (tick)     (us)\n");
	printk("---------------------\n");
	for (i = 0; i < tickers_count; i++) {
		printk("%03u %08u %08u\n", tickers[i].id,
		       tickers[i].ticks_to_expire,
		       HAL_TICKER_TICKS_TO_US(tickers[i].ticks_to_expire));
	}
	printk("---------------------\n");

	return 0;
}

static const struct shell_cmd ticker_commands[] = {
	{ "info", cmd_ticker_info, "Enumerate active ticker details."},
	{ NULL, NULL, NULL}
};

SHELL_REGISTER(TICKER_SHELL_MODULE, ticker_commands);
