diff options
Diffstat (limited to 'thirdparty/nRF5_SDK_15.0.0_a53641a/examples/peripheral/cli/demo_cli_cmds.c')
-rw-r--r-- | thirdparty/nRF5_SDK_15.0.0_a53641a/examples/peripheral/cli/demo_cli_cmds.c | 445 |
1 files changed, 445 insertions, 0 deletions
diff --git a/thirdparty/nRF5_SDK_15.0.0_a53641a/examples/peripheral/cli/demo_cli_cmds.c b/thirdparty/nRF5_SDK_15.0.0_a53641a/examples/peripheral/cli/demo_cli_cmds.c new file mode 100644 index 0000000..3890c12 --- /dev/null +++ b/thirdparty/nRF5_SDK_15.0.0_a53641a/examples/peripheral/cli/demo_cli_cmds.c @@ -0,0 +1,445 @@ +/** + * Copyright (c) 2018 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ +#include "nrf_cli.h" +#include "nrf_log.h" +#include <ctype.h> + +#define CLI_EXAMPLE_MAX_CMD_CNT (20u) +#define CLI_EXAMPLE_MAX_CMD_LEN (33u) + +/* buffer holding dynamicly created user commands */ +static char m_dynamic_cmd_buffer[CLI_EXAMPLE_MAX_CMD_CNT][CLI_EXAMPLE_MAX_CMD_LEN]; +/* commands counter */ +static uint8_t m_dynamic_cmd_cnt; + +uint32_t m_counter; +bool m_counter_active = false; + +/* Command handlers */ +static void cmd_print_param(nrf_cli_t const * p_cli, size_t argc, char **argv) +{ + for (size_t i = 1; i < argc; i++) + { + nrf_cli_fprintf(p_cli, NRF_CLI_NORMAL, "argv[%d] = %s\r\n", i, argv[i]); + } +} + +static void cmd_print_all(nrf_cli_t const * p_cli, size_t argc, char **argv) +{ + for (size_t i = 1; i < argc; i++) + { + nrf_cli_fprintf(p_cli, NRF_CLI_NORMAL, "%s ", argv[i]); + } + nrf_cli_fprintf(p_cli, NRF_CLI_NORMAL, "\r\n"); +} + +static void cmd_print(nrf_cli_t const * p_cli, size_t argc, char **argv) +{ + ASSERT(p_cli); + ASSERT(p_cli->p_ctx && p_cli->p_iface && p_cli->p_name); + + if ((argc == 1) || nrf_cli_help_requested(p_cli)) + { + nrf_cli_help_print(p_cli, NULL, 0); + return; + } + + if (argc != 2) + { + nrf_cli_fprintf(p_cli, NRF_CLI_ERROR, "%s: bad parameter count\r\n", argv[0]); + return; + } + + nrf_cli_fprintf(p_cli, NRF_CLI_ERROR, "%s: unknown parameter: %s\r\n", argv[0], argv[1]); +} + +static void cmd_python(nrf_cli_t const * p_cli, size_t argc, char **argv) +{ + UNUSED_PARAMETER(argc); + UNUSED_PARAMETER(argv); + + nrf_cli_fprintf(p_cli, NRF_CLI_ERROR, "Nice joke ;)\r\n"); +} + +static void cmd_dynamic(nrf_cli_t const * p_cli, size_t argc, char **argv) +{ + if ((argc == 1) || nrf_cli_help_requested(p_cli)) + { + nrf_cli_help_print(p_cli, NULL, 0); + return; + } + + if (argc > 2) + { + nrf_cli_fprintf(p_cli, NRF_CLI_ERROR, "%s: bad parameter count\r\n", argv[0]); + } + else + { + nrf_cli_fprintf(p_cli, NRF_CLI_ERROR, "%s: please specify subcommand\r\n", argv[0]); + } +} + +/* function required by qsort */ +static int string_cmp(const void * p_a, const void * p_b) +{ + ASSERT(p_a); + ASSERT(p_b); + return strcmp((const char *)p_a, (const char *)p_b); +} + +static void cmd_dynamic_add(nrf_cli_t const * p_cli, size_t argc, char **argv) +{ + if (nrf_cli_help_requested(p_cli)) + { + nrf_cli_help_print(p_cli, NULL, 0); + return; + } + + if (argc != 2) + { + nrf_cli_fprintf(p_cli, NRF_CLI_ERROR, "%s: bad parameter count\r\n", argv[0]); + return; + } + + if (m_dynamic_cmd_cnt >= CLI_EXAMPLE_MAX_CMD_CNT) + { + nrf_cli_fprintf(p_cli, NRF_CLI_ERROR, "command limit reached\r\n"); + return; + } + + uint8_t idx; + nrf_cli_cmd_len_t cmd_len = strlen(argv[1]); + + if (cmd_len >= CLI_EXAMPLE_MAX_CMD_LEN) + { + nrf_cli_fprintf(p_cli, NRF_CLI_ERROR, "too long command\r\n"); + return; + } + + for (idx = 0; idx < cmd_len; idx++) + { + if (!isalnum((int)(argv[1][idx]))) + { + nrf_cli_fprintf(p_cli, + NRF_CLI_ERROR, + "bad command name - please use only alphanumerical characters\r\n"); + return; + } + } + + for (idx = 0; idx < CLI_EXAMPLE_MAX_CMD_CNT; idx++) + { + if (!strcmp(m_dynamic_cmd_buffer[idx], argv[1])) + { + nrf_cli_fprintf(p_cli, NRF_CLI_ERROR, "duplicated command\r\n"); + return; + } + } + + sprintf(m_dynamic_cmd_buffer[m_dynamic_cmd_cnt++], "%s", argv[1]); + + qsort(m_dynamic_cmd_buffer, + m_dynamic_cmd_cnt, + sizeof (m_dynamic_cmd_buffer[0]), + string_cmp); + + nrf_cli_fprintf(p_cli, NRF_CLI_NORMAL, "command added successfully\r\n"); +} + +static void cmd_dynamic_show(nrf_cli_t const * p_cli, size_t argc, char **argv) +{ + if (nrf_cli_help_requested(p_cli)) + { + nrf_cli_help_print(p_cli, NULL, 0); + return; + } + + if (argc != 1) + { + nrf_cli_fprintf(p_cli, NRF_CLI_ERROR, "%s: bad parameter count\r\n", argv[0]); + return; + } + + if (m_dynamic_cmd_cnt == 0) + { + nrf_cli_fprintf(p_cli, NRF_CLI_WARNING, "Please add some commands first.\r\n"); + return; + } + nrf_cli_fprintf(p_cli, NRF_CLI_NORMAL, "Dynamic command list:\r\n"); + for (uint8_t i = 0; i < m_dynamic_cmd_cnt; i++) + { + nrf_cli_fprintf(p_cli, NRF_CLI_NORMAL, "[%3d] %s\r\n", i, m_dynamic_cmd_buffer[i]); + } +} + +static void cmd_dynamic_execute(nrf_cli_t const * p_cli, size_t argc, char **argv) +{ + if (nrf_cli_help_requested(p_cli)) + { + nrf_cli_help_print(p_cli, NULL, 0); + return; + } + + if (argc != 2) + { + nrf_cli_fprintf(p_cli, NRF_CLI_ERROR, "%s: bad parameter count\r\n", argv[0]); + return; + } + + for (uint8_t idx = 0; idx < m_dynamic_cmd_cnt; idx++) + { + if (!strcmp(m_dynamic_cmd_buffer[idx], argv[1])) + { + nrf_cli_fprintf(p_cli, NRF_CLI_NORMAL, "dynamic command: %s\r\n", argv[1]); + return; + } + } + nrf_cli_fprintf(p_cli, NRF_CLI_ERROR, "%s: uknown parameter: %s\r\n", argv[0], argv[1]); +} + +static void cmd_dynamic_remove(nrf_cli_t const * p_cli, size_t argc, char **argv) +{ + if ((argc == 1) || nrf_cli_help_requested(p_cli)) + { + nrf_cli_help_print(p_cli, NULL, 0); + return; + } + + if (argc != 2) + { + nrf_cli_fprintf(p_cli, NRF_CLI_ERROR, "%s: bad parameter count\r\n", argv[0]); + return; + } + + for (uint8_t idx = 0; idx < m_dynamic_cmd_cnt; idx++) + { + if (!strcmp(m_dynamic_cmd_buffer[idx], argv[1])) + { + if (idx == CLI_EXAMPLE_MAX_CMD_CNT - 1) + { + m_dynamic_cmd_buffer[idx][0] = '\0'; + } + else + { + memmove(m_dynamic_cmd_buffer[idx], + m_dynamic_cmd_buffer[idx + 1], + sizeof(m_dynamic_cmd_buffer[idx]) * (m_dynamic_cmd_cnt - idx)); + } + --m_dynamic_cmd_cnt; + nrf_cli_fprintf(p_cli, NRF_CLI_NORMAL, "command removed successfully\r\n"); + return; + } + } + nrf_cli_fprintf(p_cli, NRF_CLI_ERROR, "did not find command: %s\r\n", argv[1]); +} + +static void cmd_counter_start(nrf_cli_t const * p_cli, size_t argc, char **argv) +{ + if (argc != 1) + { + nrf_cli_fprintf(p_cli, NRF_CLI_ERROR, "%s: bad parameter count\r\n", argv[0]); + return; + } + + m_counter_active = true; +} + +static void cmd_counter_stop(nrf_cli_t const * p_cli, size_t argc, char **argv) +{ + if (argc != 1) + { + nrf_cli_fprintf(p_cli, NRF_CLI_ERROR, "%s: bad parameter count\r\n", argv[0]); + return; + } + + m_counter_active = false; +} + +static void cmd_counter_reset(nrf_cli_t const * p_cli, size_t argc, char **argv) +{ + if (argc != 1) + { + nrf_cli_fprintf(p_cli, NRF_CLI_ERROR, "%s: bad parameter count\r\n", argv[0]); + return; + } + + m_counter = 0; +} + +static void cmd_counter(nrf_cli_t const * p_cli, size_t argc, char **argv) +{ + ASSERT(p_cli); + ASSERT(p_cli->p_ctx && p_cli->p_iface && p_cli->p_name); + + /* Extra defined dummy option */ + static const nrf_cli_getopt_option_t opt[] = { + NRF_CLI_OPT( + "--test", + "-t", + "dummy option help string" + ) + }; + + if ((argc == 1) || nrf_cli_help_requested(p_cli)) + { + nrf_cli_help_print(p_cli, opt, ARRAY_SIZE(opt)); + return; + } + + if (argc != 2) + { + nrf_cli_fprintf(p_cli, NRF_CLI_ERROR, "%s: bad parameter count\r\n", argv[0]); + return; + } + + if (!strcmp(argv[1], "-t") || !strcmp(argv[1], "--test")) + { + nrf_cli_fprintf(p_cli, NRF_CLI_NORMAL, "Dummy test option.\r\n"); + return; + } + + /* subcommands have their own handlers and they are not processed here */ + nrf_cli_fprintf(p_cli, NRF_CLI_ERROR, "%s: unknown parameter: %s\r\n", argv[0], argv[1]); +} + +static void cmd_nordic(nrf_cli_t const * p_cli, size_t argc, char **argv) +{ + UNUSED_PARAMETER(argc); + UNUSED_PARAMETER(argv); + + if (nrf_cli_help_requested(p_cli)) + { + nrf_cli_help_print(p_cli, NULL, 0); + return; + } + + nrf_cli_fprintf(p_cli, NRF_CLI_OPTION, + "\r\n" + " .co:. 'xo, \r\n" + " .,collllc,. 'ckOOo::,.. \r\n" + " .:ooooollllllll:'. .;dOOOOOOo:::;;;'. \r\n" + " 'okxddoooollllllllllll;'ckOOOOOOOOOo:::;;;,,,' \r\n" + " OOOkxdoooolllllllllllllllldxOOOOOOOo:::;;;,,,'.\r\n" + " OOOOOOkdoolllllllllllllllllllldxOOOo:::;;;,,,'.\r\n" + " OOOOOOOOOkxollllllllllllllllllcccldl:::;;;,,,'.\r\n" + " OOOOOOOOOOOOOxdollllllllllllllccccc::::;;;,,,'.\r\n" + " OOOOOOOOOOOOOOOOkxdlllllllllllccccc::::;;;,,,'.\r\n" + " kOOOOOOOOOOOOOOOOOOOkdolllllllccccc::::;;;,,,'.\r\n" + " kOOOOOOOOOOOOOOOOOOOOOOOxdllllccccc::::;;;,,,'.\r\n" + " kOOOOOOOOOOOOOOOOOOOOOOOOOOkxolcccc::::;;;,,,'.\r\n" + " kOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOkdlc::::;;;,,,'.\r\n" + " xOOOOOOOOOOOxdkOOOOOOOOOOOOOOOOOOOOxoc:;;;,,,'.\r\n" + " xOOOOOOOOOOOdc::ldkOOOOOOOOOOOOOOOOOOOkdc;,,,''\r\n" + " xOOOOOOOOOOOdc::;;,;cdkOOOOOOOOOOOOOOOOOOOxl;''\r\n" + " .lkOOOOOOOOOdc::;;,,''..;oOOOOOOOOOOOOOOOOOOOx'\r\n" + " .;oOOOOOOdc::;;,. .:xOOOOOOOOOOOOd;. \r\n" + " .:xOOdc:,. 'ckOOOOkl' \r\n" + " .od' 'xk, \r\n" + "\r\n"); + + nrf_cli_fprintf(p_cli,NRF_CLI_NORMAL, + " Nordic Semiconductor \r\n\r\n"); +} + +/** + * @brief Command set array + * */ +NRF_CLI_CMD_REGISTER(nordic, NULL, "Print Nordic Semiconductor logo.", cmd_nordic); + +NRF_CLI_CREATE_STATIC_SUBCMD_SET(m_sub_print) +{ + NRF_CLI_CMD(all, NULL, "Print all entered parameters.", cmd_print_all), + NRF_CLI_CMD(param, NULL, "Print each parameter in new line.", cmd_print_param), + NRF_CLI_SUBCMD_SET_END +}; +NRF_CLI_CMD_REGISTER(print, &m_sub_print, "print", cmd_print); + +NRF_CLI_CMD_REGISTER(python, NULL, "python", cmd_python); + +NRF_CLI_CREATE_STATIC_SUBCMD_SET(m_sub_counter) +{ + NRF_CLI_CMD(reset, NULL, "Reset seconds counter.", cmd_counter_reset), + NRF_CLI_CMD(start, NULL, "Start seconds counter.", cmd_counter_start), + NRF_CLI_CMD(stop, NULL, "Stop seconds counter.", cmd_counter_stop), + NRF_CLI_SUBCMD_SET_END +}; +NRF_CLI_CMD_REGISTER(counter, + &m_sub_counter, + "Display seconds on terminal screen", + cmd_counter); + +/* dynamic command creation */ +static void dynamic_cmd_get(size_t idx, nrf_cli_static_entry_t * p_static) +{ + ASSERT(p_static); + + if (idx < m_dynamic_cmd_cnt) + { + /* m_dynamic_cmd_buffer must be sorted alphabetically to ensure correct CLI completion */ + p_static->p_syntax = m_dynamic_cmd_buffer[idx]; + p_static->handler = NULL; + p_static->p_subcmd = NULL; + p_static->p_help = "Show dynamic command name."; + } + else + { + /* if there are no more dynamic commands available p_syntax must be set to NULL */ + p_static->p_syntax = NULL; + } +} + +NRF_CLI_CREATE_DYNAMIC_CMD(m_sub_dynamic_set, dynamic_cmd_get); +NRF_CLI_CREATE_STATIC_SUBCMD_SET(m_sub_dynamic) +{ + NRF_CLI_CMD(add, NULL, + "Add a new dynamic command.\nExample usage: [ dynamic add test ] will add " + "a dynamic command 'test'.\nIn this example, command name length is limited to 32 chars. " + "You can add up to 20 commands. Commands are automatically sorted to ensure correct " + "CLI completion.", + cmd_dynamic_add), + NRF_CLI_CMD(execute, &m_sub_dynamic_set, "Execute a command.", cmd_dynamic_execute), + NRF_CLI_CMD(remove, &m_sub_dynamic_set, "Remove a command.", cmd_dynamic_remove), + NRF_CLI_CMD(show, NULL, "Show all added dynamic commands.", cmd_dynamic_show), + NRF_CLI_SUBCMD_SET_END +}; +NRF_CLI_CMD_REGISTER(dynamic, + &m_sub_dynamic, + "Demonstrate dynamic command usage.", + cmd_dynamic); |