/** @file * @brief Bluetooth Controller Ticker functions * */ /* * Copyright (c) 2017 Nordic Semiconductor ASA * * SPDX-License-Identifier: Apache-2.0 */ #include #include #include #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);