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

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

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

#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,
	       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,
		       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);
