1 /* 2 * Copyright (c) 2018 Nordic Semiconductor ASA 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 */ 6 7 #ifndef SHELL_H__ 8 #define SHELL_H__ 9 10 #include <zephyr/kernel.h> 11 #include <zephyr/shell/shell_types.h> 12 #include <zephyr/shell/shell_history.h> 13 #include <zephyr/shell/shell_fprintf.h> 14 #include <zephyr/shell/shell_log_backend.h> 15 #include <zephyr/shell/shell_string_conv.h> 16 #include <zephyr/logging/log_instance.h> 17 #include <zephyr/logging/log.h> 18 #include <zephyr/sys/iterable_sections.h> 19 #include <zephyr/sys/util.h> 20 21 #if defined CONFIG_SHELL_GETOPT 22 #include <getopt.h> 23 #endif 24 25 #ifdef __cplusplus 26 extern "C" { 27 #endif 28 29 #ifndef CONFIG_SHELL_PROMPT_BUFF_SIZE 30 #define CONFIG_SHELL_PROMPT_BUFF_SIZE 0 31 #endif 32 33 #ifndef CONFIG_SHELL_CMD_BUFF_SIZE 34 #define CONFIG_SHELL_CMD_BUFF_SIZE 0 35 #endif 36 37 #ifndef CONFIG_SHELL_PRINTF_BUFF_SIZE 38 #define CONFIG_SHELL_PRINTF_BUFF_SIZE 0 39 #endif 40 41 #ifndef CONFIG_SHELL_HISTORY_BUFFER 42 #define CONFIG_SHELL_HISTORY_BUFFER 0 43 #endif 44 45 #define Z_SHELL_CMD_ROOT_LVL (0u) 46 47 #define SHELL_HEXDUMP_BYTES_IN_LINE 16 48 49 /** 50 * @brief Flag indicates that optional arguments will be treated as one, 51 * unformatted argument. 52 * 53 * By default, shell is parsing all arguments, treats all spaces as argument 54 * separators unless they are within quotation marks which are removed in that 55 * case. If command rely on unformatted argument then this flag shall be used 56 * in place of number of optional arguments in command definition to indicate 57 * that only mandatory arguments shall be parsed and remaining command string is 58 * passed as a raw string. 59 */ 60 #define SHELL_OPT_ARG_RAW (0xFE) 61 62 /** 63 * @brief Flag indicating that number of optional arguments is not limited. 64 */ 65 #define SHELL_OPT_ARG_CHECK_SKIP (0xFF) 66 67 /** 68 * @brief Flag indicating maximum number of optional arguments that can be 69 * validated. 70 */ 71 #define SHELL_OPT_ARG_MAX (0xFD) 72 73 /** 74 * @brief Shell API 75 * @defgroup shell_api Shell API 76 * @since 1.14 77 * @version 1.0.0 78 * @ingroup os_services 79 * @{ 80 */ 81 82 struct shell_static_entry; 83 84 /** 85 * @brief Shell dynamic command descriptor. 86 * 87 * @details Function shall fill the received shell_static_entry structure 88 * with requested (idx) dynamic subcommand data. If there is more than 89 * one dynamic subcommand available, the function shall ensure that the 90 * returned commands: entry->syntax are sorted in alphabetical order. 91 * If idx exceeds the available dynamic subcommands, the function must 92 * write to entry->syntax NULL value. This will indicate to the shell 93 * module that there are no more dynamic commands to read. 94 */ 95 typedef void (*shell_dynamic_get)(size_t idx, 96 struct shell_static_entry *entry); 97 98 /** 99 * @brief Shell command descriptor. 100 */ 101 union shell_cmd_entry { 102 /** Pointer to function returning dynamic commands.*/ 103 shell_dynamic_get dynamic_get; 104 105 /** Pointer to array of static commands. */ 106 const struct shell_static_entry *entry; 107 }; 108 109 struct shell; 110 111 struct shell_static_args { 112 uint8_t mandatory; /*!< Number of mandatory arguments. */ 113 uint8_t optional; /*!< Number of optional arguments. */ 114 }; 115 116 /** 117 * @brief Get by index a device that matches . 118 * 119 * This can be used, for example, to identify I2C_1 as the second I2C 120 * device. 121 * 122 * Devices that failed to initialize or do not have a non-empty name 123 * are excluded from the candidates for a match. 124 * 125 * @param idx the device number starting from zero. 126 * 127 * @param prefix optional name prefix used to restrict candidate 128 * devices. Indexing is done relative to devices with names that 129 * start with this text. Pass null if no prefix match is required. 130 */ 131 const struct device *shell_device_lookup(size_t idx, 132 const char *prefix); 133 134 /** 135 * @brief Filter callback type, for use with shell_device_lookup_filter 136 * 137 * This is used as an argument of shell_device_lookup_filter to only return 138 * devices that match a specific condition, implemented by the filter. 139 * 140 * @param dev pointer to a struct device. 141 * 142 * @return bool, true if the filter matches the device type. 143 */ 144 typedef bool (*shell_device_filter_t)(const struct device *dev); 145 146 /** 147 * @brief Get a device by index and filter. 148 * 149 * This can be used to return devices matching a specific type. 150 * 151 * Devices that the filter returns false for, failed to initialize or do not 152 * have a non-empty name are excluded from the candidates for a match. 153 * 154 * @param idx the device number starting from zero. 155 * 156 * @param filter a pointer to a shell_device_filter_t function that returns 157 * true if the device matches the filter. 158 */ 159 const struct device *shell_device_filter(size_t idx, 160 shell_device_filter_t filter); 161 162 /** 163 * @brief Get a @ref device reference from its @ref device.name field or label. 164 * 165 * This function iterates through the devices on the system. If a device with 166 * the given @p name field is found, and that device initialized successfully at 167 * boot time, this function returns a pointer to the device. 168 * 169 * If no device has the given @p name, this function returns `NULL`. 170 * 171 * This function also returns NULL when a device is found, but it failed to 172 * initialize successfully at boot time. (To troubleshoot this case, set a 173 * breakpoint on your device driver's initialization function.) 174 * 175 * @param name device name to search for. A null pointer, or a pointer to an 176 * empty string, will cause NULL to be returned. 177 * 178 * @return pointer to device structure with the given name; `NULL` if the device 179 * is not found or if the device with that name's initialization function 180 * failed. 181 */ 182 const struct device *shell_device_get_binding(const char *name); 183 184 /** 185 * @brief Shell command handler prototype. 186 * 187 * @param sh Shell instance. 188 * @param argc Arguments count. 189 * @param argv Arguments. 190 * 191 * @retval 0 Successful command execution. 192 * @retval 1 Help printed and command not executed. 193 * @retval -EINVAL Argument validation failed. 194 * @retval -ENOEXEC Command not executed. 195 */ 196 typedef int (*shell_cmd_handler)(const struct shell *sh, 197 size_t argc, char **argv); 198 199 /** 200 * @brief Shell dictionary command handler prototype. 201 * 202 * @param sh Shell instance. 203 * @param argc Arguments count. 204 * @param argv Arguments. 205 * @param data Pointer to the user data. 206 * 207 * @retval 0 Successful command execution. 208 * @retval 1 Help printed and command not executed. 209 * @retval -EINVAL Argument validation failed. 210 * @retval -ENOEXEC Command not executed. 211 */ 212 typedef int (*shell_dict_cmd_handler)(const struct shell *sh, size_t argc, 213 char **argv, void *data); 214 215 /* When entries are added to the memory section a padding is applied for 216 * the posix architecture with 64bits builds and x86_64 targets. Adding padding to allow handle data 217 * in the memory section as array. 218 */ 219 #if (defined(CONFIG_ARCH_POSIX) && defined(CONFIG_64BIT)) || defined(CONFIG_X86_64) 220 #define Z_SHELL_STATIC_ENTRY_PADDING 24 221 #else 222 #define Z_SHELL_STATIC_ENTRY_PADDING 0 223 #endif 224 225 /* 226 * @brief Shell static command descriptor. 227 */ 228 struct shell_static_entry { 229 const char *syntax; /*!< Command syntax strings. */ 230 const char *help; /*!< Command help string. */ 231 const union shell_cmd_entry *subcmd; /*!< Pointer to subcommand. */ 232 shell_cmd_handler handler; /*!< Command handler. */ 233 struct shell_static_args args; /*!< Command arguments. */ 234 uint8_t padding[Z_SHELL_STATIC_ENTRY_PADDING]; 235 }; 236 237 /** 238 * @brief Macro for defining and adding a root command (level 0) with required 239 * number of arguments. 240 * 241 * @note Each root command shall have unique syntax. If a command will be called 242 * with wrong number of arguments shell will print an error message and command 243 * handler will not be called. 244 * 245 * @param[in] syntax Command syntax (for example: history). 246 * @param[in] subcmd Pointer to a subcommands array. 247 * @param[in] help Pointer to a command help string. 248 * @param[in] handler Pointer to a function handler. 249 * @param[in] mandatory Number of mandatory arguments including command name. 250 * @param[in] optional Number of optional arguments. 251 */ 252 #define SHELL_CMD_ARG_REGISTER(syntax, subcmd, help, handler, \ 253 mandatory, optional) \ 254 static const struct shell_static_entry UTIL_CAT(_shell_, syntax) = \ 255 SHELL_CMD_ARG(syntax, subcmd, help, handler, mandatory, optional); \ 256 static const TYPE_SECTION_ITERABLE(union shell_cmd_entry, \ 257 UTIL_CAT(shell_cmd_, syntax), shell_root_cmds, \ 258 UTIL_CAT(shell_cmd_, syntax) \ 259 ) = { \ 260 .entry = &UTIL_CAT(_shell_, syntax) \ 261 } 262 263 /** 264 * @brief Macro for defining and adding a conditional root command (level 0) 265 * with required number of arguments. 266 * 267 * @see SHELL_CMD_ARG_REGISTER for details. 268 * 269 * Macro can be used to create a command which can be conditionally present. 270 * It is and alternative to \#ifdefs around command registration and command 271 * handler. If command is disabled handler and subcommands are removed from 272 * the application. 273 * 274 * @param[in] flag Compile time flag. Command is present only if flag 275 * exists and equals 1. 276 * @param[in] syntax Command syntax (for example: history). 277 * @param[in] subcmd Pointer to a subcommands array. 278 * @param[in] help Pointer to a command help string. 279 * @param[in] handler Pointer to a function handler. 280 * @param[in] mandatory Number of mandatory arguments including command name. 281 * @param[in] optional Number of optional arguments. 282 */ 283 #define SHELL_COND_CMD_ARG_REGISTER(flag, syntax, subcmd, help, handler, \ 284 mandatory, optional) \ 285 COND_CODE_1(\ 286 flag, \ 287 (\ 288 SHELL_CMD_ARG_REGISTER(syntax, subcmd, help, handler, \ 289 mandatory, optional) \ 290 ), \ 291 (\ 292 static shell_cmd_handler dummy_##syntax##_handler __unused = \ 293 handler;\ 294 static const union shell_cmd_entry *dummy_subcmd_##syntax \ 295 __unused = subcmd\ 296 ) \ 297 ) 298 /** 299 * @brief Macro for defining and adding a root command (level 0) with 300 * arguments. 301 * 302 * @note All root commands must have different name. 303 * 304 * @param[in] syntax Command syntax (for example: history). 305 * @param[in] subcmd Pointer to a subcommands array. 306 * @param[in] help Pointer to a command help string. 307 * @param[in] handler Pointer to a function handler. 308 */ 309 #define SHELL_CMD_REGISTER(syntax, subcmd, help, handler) \ 310 SHELL_CMD_ARG_REGISTER(syntax, subcmd, help, handler, 0, 0) 311 312 /** 313 * @brief Macro for defining and adding a conditional root command (level 0) 314 * with arguments. 315 * 316 * @see SHELL_COND_CMD_ARG_REGISTER. 317 * 318 * @param[in] flag Compile time flag. Command is present only if flag 319 * exists and equals 1. 320 * @param[in] syntax Command syntax (for example: history). 321 * @param[in] subcmd Pointer to a subcommands array. 322 * @param[in] help Pointer to a command help string. 323 * @param[in] handler Pointer to a function handler. 324 */ 325 #define SHELL_COND_CMD_REGISTER(flag, syntax, subcmd, help, handler) \ 326 SHELL_COND_CMD_ARG_REGISTER(flag, syntax, subcmd, help, handler, 0, 0) 327 328 /** 329 * @brief Macro for creating a subcommand set. It must be used outside of any 330 * function body. 331 * 332 * Example usage: 333 * @code{.c} 334 * SHELL_STATIC_SUBCMD_SET_CREATE( 335 * foo, 336 * SHELL_CMD(abc, ...), 337 * SHELL_CMD(def, ...), 338 * SHELL_SUBCMD_SET_END 339 * ) 340 * @endcode 341 * 342 * @param[in] name Name of the subcommand set. 343 * @param[in] ... List of commands created with @ref SHELL_CMD_ARG or 344 * or @ref SHELL_CMD 345 */ 346 #define SHELL_STATIC_SUBCMD_SET_CREATE(name, ...) \ 347 static const struct shell_static_entry shell_##name[] = { \ 348 __VA_ARGS__ \ 349 }; \ 350 static const union shell_cmd_entry name = { \ 351 .entry = shell_##name \ 352 } 353 354 #define Z_SHELL_UNDERSCORE(x) _##x 355 #define Z_SHELL_SUBCMD_NAME(...) \ 356 UTIL_CAT(shell_subcmds, MACRO_MAP_CAT(Z_SHELL_UNDERSCORE, __VA_ARGS__)) 357 #define Z_SHELL_SUBCMD_SECTION_TAG(...) MACRO_MAP_CAT(Z_SHELL_UNDERSCORE, __VA_ARGS__) 358 #define Z_SHELL_SUBCMD_SET_SECTION_TAG(x) \ 359 Z_SHELL_SUBCMD_SECTION_TAG(NUM_VA_ARGS_LESS_1 x, __DEBRACKET x) 360 #define Z_SHELL_SUBCMD_ADD_SECTION_TAG(x, y) \ 361 Z_SHELL_SUBCMD_SECTION_TAG(NUM_VA_ARGS_LESS_1 x, __DEBRACKET x, y) 362 363 /** @brief Create set of subcommands. 364 * 365 * Commands to this set are added using @ref SHELL_SUBCMD_ADD and @ref SHELL_SUBCMD_COND_ADD. 366 * Commands can be added from multiple files. 367 * 368 * @param[in] _name Name of the set. @p _name is used to refer the set in the parent 369 * command. 370 * 371 * @param[in] _parent Set of comma separated parent commands in parenthesis, e.g. 372 * (foo_cmd) if subcommands are for the root command "foo_cmd". 373 */ 374 375 #define SHELL_SUBCMD_SET_CREATE(_name, _parent) \ 376 static const TYPE_SECTION_ITERABLE(struct shell_static_entry, _name, shell_subcmds, \ 377 Z_SHELL_SUBCMD_SET_SECTION_TAG(_parent)) 378 379 380 /** @brief Conditionally add command to the set of subcommands. 381 * 382 * Add command to the set created with @ref SHELL_SUBCMD_SET_CREATE. 383 * 384 * @note The name of the section is formed as concatenation of number of parent 385 * commands, names of all parent commands and own syntax. Number of parent commands 386 * is added to ensure that section prefix is unique. Without it subcommands of 387 * (foo) and (foo, cmd1) would mix. 388 * 389 * @param[in] _flag Compile time flag. Command is present only if flag 390 * exists and equals 1. 391 * @param[in] _parent Parent command sequence. Comma separated in parenthesis. 392 * @param[in] _syntax Command syntax (for example: history). 393 * @param[in] _subcmd Pointer to a subcommands array. 394 * @param[in] _help Pointer to a command help string. 395 * @param[in] _handler Pointer to a function handler. 396 * @param[in] _mand Number of mandatory arguments including command name. 397 * @param[in] _opt Number of optional arguments. 398 */ 399 #define SHELL_SUBCMD_COND_ADD(_flag, _parent, _syntax, _subcmd, _help, _handler, \ 400 _mand, _opt) \ 401 COND_CODE_1(_flag, \ 402 (static const TYPE_SECTION_ITERABLE(struct shell_static_entry, \ 403 Z_SHELL_SUBCMD_NAME(__DEBRACKET _parent, _syntax), \ 404 shell_subcmds, \ 405 Z_SHELL_SUBCMD_ADD_SECTION_TAG(_parent, _syntax)) = \ 406 SHELL_EXPR_CMD_ARG(1, _syntax, _subcmd, _help, \ 407 _handler, _mand, _opt)\ 408 ), \ 409 (static shell_cmd_handler dummy_handler_##_syntax __unused = _handler;\ 410 static const union shell_cmd_entry dummy_subcmd_##_syntax __unused = { \ 411 .entry = (const struct shell_static_entry *)_subcmd\ 412 } \ 413 ) \ 414 ) 415 416 /** @brief Add command to the set of subcommands. 417 * 418 * Add command to the set created with @ref SHELL_SUBCMD_SET_CREATE. 419 * 420 * @param[in] _parent Parent command sequence. Comma separated in parenthesis. 421 * @param[in] _syntax Command syntax (for example: history). 422 * @param[in] _subcmd Pointer to a subcommands array. 423 * @param[in] _help Pointer to a command help string. 424 * @param[in] _handler Pointer to a function handler. 425 * @param[in] _mand Number of mandatory arguments including command name. 426 * @param[in] _opt Number of optional arguments. 427 */ 428 #define SHELL_SUBCMD_ADD(_parent, _syntax, _subcmd, _help, _handler, _mand, _opt) \ 429 SHELL_SUBCMD_COND_ADD(1, _parent, _syntax, _subcmd, _help, _handler, _mand, _opt) 430 431 /** 432 * @brief Define ending subcommands set. 433 * 434 */ 435 #define SHELL_SUBCMD_SET_END {NULL} 436 437 /** 438 * @brief Macro for creating a dynamic entry. 439 * 440 * @param[in] name Name of the dynamic entry. 441 * @param[in] get Pointer to the function returning dynamic commands array 442 */ 443 #define SHELL_DYNAMIC_CMD_CREATE(name, get) \ 444 static const TYPE_SECTION_ITERABLE(union shell_cmd_entry, name, \ 445 shell_dynamic_subcmds, name) = \ 446 { \ 447 .dynamic_get = get \ 448 } 449 450 /** 451 * @brief Initializes a shell command with arguments. 452 * 453 * @note If a command will be called with wrong number of arguments shell will 454 * print an error message and command handler will not be called. 455 * 456 * @param[in] syntax Command syntax (for example: history). 457 * @param[in] subcmd Pointer to a subcommands array. 458 * @param[in] help Pointer to a command help string. 459 * @param[in] handler Pointer to a function handler. 460 * @param[in] mand Number of mandatory arguments including command name. 461 * @param[in] opt Number of optional arguments. 462 */ 463 #define SHELL_CMD_ARG(syntax, subcmd, help, handler, mand, opt) \ 464 SHELL_EXPR_CMD_ARG(1, syntax, subcmd, help, handler, mand, opt) 465 466 /** 467 * @brief Initializes a conditional shell command with arguments. 468 * 469 * @see SHELL_CMD_ARG. Based on the flag, creates a valid entry or an empty 470 * command which is ignored by the shell. It is an alternative to \#ifdefs 471 * around command registration and command handler. However, empty structure is 472 * present in the flash even if command is disabled (subcommands and handler are 473 * removed). Macro internally handles case if flag is not defined so flag must 474 * be provided without any wrapper, e.g.: SHELL_COND_CMD_ARG(CONFIG_FOO, ...) 475 * 476 * @param[in] flag Compile time flag. Command is present only if flag 477 * exists and equals 1. 478 * @param[in] syntax Command syntax (for example: history). 479 * @param[in] subcmd Pointer to a subcommands array. 480 * @param[in] help Pointer to a command help string. 481 * @param[in] handler Pointer to a function handler. 482 * @param[in] mand Number of mandatory arguments including command name. 483 * @param[in] opt Number of optional arguments. 484 */ 485 #define SHELL_COND_CMD_ARG(flag, syntax, subcmd, help, handler, mand, opt) \ 486 SHELL_EXPR_CMD_ARG(IS_ENABLED(flag), syntax, subcmd, help, \ 487 handler, mand, opt) 488 489 /** 490 * @brief Initializes a conditional shell command with arguments if expression 491 * gives non-zero result at compile time. 492 * 493 * @see SHELL_CMD_ARG. Based on the expression, creates a valid entry or an 494 * empty command which is ignored by the shell. It should be used instead of 495 * @ref SHELL_COND_CMD_ARG if condition is not a single configuration flag, 496 * e.g.: 497 * SHELL_EXPR_CMD_ARG(IS_ENABLED(CONFIG_FOO) && 498 * IS_ENABLED(CONFIG_FOO_SETTING_1), ...) 499 * 500 * @param[in] _expr Expression. 501 * @param[in] _syntax Command syntax (for example: history). 502 * @param[in] _subcmd Pointer to a subcommands array. 503 * @param[in] _help Pointer to a command help string. 504 * @param[in] _handler Pointer to a function handler. 505 * @param[in] _mand Number of mandatory arguments including command name. 506 * @param[in] _opt Number of optional arguments. 507 */ 508 #define SHELL_EXPR_CMD_ARG(_expr, _syntax, _subcmd, _help, _handler, \ 509 _mand, _opt) \ 510 { \ 511 .syntax = (_expr) ? (const char *)STRINGIFY(_syntax) : "", \ 512 .help = (_expr) ? (const char *)_help : NULL, \ 513 .subcmd = (const union shell_cmd_entry *)((_expr) ? \ 514 _subcmd : NULL), \ 515 .handler = (shell_cmd_handler)((_expr) ? _handler : NULL), \ 516 .args = { .mandatory = _mand, .optional = _opt} \ 517 } 518 519 /** 520 * @brief Initializes a shell command. 521 * 522 * @param[in] _syntax Command syntax (for example: history). 523 * @param[in] _subcmd Pointer to a subcommands array. 524 * @param[in] _help Pointer to a command help string. 525 * @param[in] _handler Pointer to a function handler. 526 */ 527 #define SHELL_CMD(_syntax, _subcmd, _help, _handler) \ 528 SHELL_CMD_ARG(_syntax, _subcmd, _help, _handler, 0, 0) 529 530 /** 531 * @brief Initializes a conditional shell command. 532 * 533 * @see SHELL_COND_CMD_ARG. 534 * 535 * @param[in] _flag Compile time flag. Command is present only if flag 536 * exists and equals 1. 537 * @param[in] _syntax Command syntax (for example: history). 538 * @param[in] _subcmd Pointer to a subcommands array. 539 * @param[in] _help Pointer to a command help string. 540 * @param[in] _handler Pointer to a function handler. 541 */ 542 #define SHELL_COND_CMD(_flag, _syntax, _subcmd, _help, _handler) \ 543 SHELL_COND_CMD_ARG(_flag, _syntax, _subcmd, _help, _handler, 0, 0) 544 545 /** 546 * @brief Initializes shell command if expression gives non-zero result at 547 * compile time. 548 * 549 * @see SHELL_EXPR_CMD_ARG. 550 * 551 * @param[in] _expr Compile time expression. Command is present only if 552 * expression is non-zero. 553 * @param[in] _syntax Command syntax (for example: history). 554 * @param[in] _subcmd Pointer to a subcommands array. 555 * @param[in] _help Pointer to a command help string. 556 * @param[in] _handler Pointer to a function handler. 557 */ 558 #define SHELL_EXPR_CMD(_expr, _syntax, _subcmd, _help, _handler) \ 559 SHELL_EXPR_CMD_ARG(_expr, _syntax, _subcmd, _help, _handler, 0, 0) 560 561 /* Internal macro used for creating handlers for dictionary commands. */ 562 #define Z_SHELL_CMD_DICT_HANDLER_CREATE(_data, _handler) \ 563 static int UTIL_CAT(UTIL_CAT(cmd_dict_, UTIL_CAT(_handler, _)), \ 564 GET_ARG_N(1, __DEBRACKET _data))( \ 565 const struct shell *sh, size_t argc, char **argv) \ 566 { \ 567 return _handler(sh, argc, argv, \ 568 (void *)GET_ARG_N(2, __DEBRACKET _data)); \ 569 } 570 571 /* Internal macro used for creating dictionary commands. */ 572 #define SHELL_CMD_DICT_CREATE(_data, _handler) \ 573 SHELL_CMD_ARG(GET_ARG_N(1, __DEBRACKET _data), NULL, GET_ARG_N(3, __DEBRACKET _data), \ 574 UTIL_CAT(UTIL_CAT(cmd_dict_, UTIL_CAT(_handler, _)), \ 575 GET_ARG_N(1, __DEBRACKET _data)), 1, 0) 576 577 /** 578 * @brief Initializes shell dictionary commands. 579 * 580 * This is a special kind of static commands. Dictionary commands can be used 581 * every time you want to use a pair: (string <-> corresponding data) in 582 * a command handler. The string is usually a verbal description of a given 583 * data. The idea is to use the string as a command syntax that can be prompted 584 * by the shell and corresponding data can be used to process the command. 585 * 586 * @param[in] _name Name of the dictionary subcommand set 587 * @param[in] _handler Command handler common for all dictionary commands. 588 * @see shell_dict_cmd_handler 589 * @param[in] ... Dictionary triplets: (command_syntax, value, helper). Value will be 590 * passed to the _handler as user data. 591 * 592 * Example usage: 593 * @code{.c} 594 * static int my_handler(const struct shell *sh, 595 * size_t argc, char **argv, void *data) 596 * { 597 * int val = (int)data; 598 * 599 * shell_print(sh, "(syntax, value) : (%s, %d)", argv[0], val); 600 * return 0; 601 * } 602 * 603 * SHELL_SUBCMD_DICT_SET_CREATE(sub_dict_cmds, my_handler, 604 * (value_0, 0, "value 0"), (value_1, 1, "value 1"), 605 * (value_2, 2, "value 2"), (value_3, 3, "value 3") 606 * ); 607 * SHELL_CMD_REGISTER(dictionary, &sub_dict_cmds, NULL, NULL); 608 * @endcode 609 */ 610 #define SHELL_SUBCMD_DICT_SET_CREATE(_name, _handler, ...) \ 611 FOR_EACH_FIXED_ARG(Z_SHELL_CMD_DICT_HANDLER_CREATE, (), \ 612 _handler, __VA_ARGS__) \ 613 SHELL_STATIC_SUBCMD_SET_CREATE(_name, \ 614 FOR_EACH_FIXED_ARG(SHELL_CMD_DICT_CREATE, (,), _handler, __VA_ARGS__), \ 615 SHELL_SUBCMD_SET_END \ 616 ) 617 618 /** 619 * @internal @brief Internal shell state in response to data received from the 620 * terminal. 621 */ 622 enum shell_receive_state { 623 SHELL_RECEIVE_DEFAULT, 624 SHELL_RECEIVE_ESC, 625 SHELL_RECEIVE_ESC_SEQ, 626 SHELL_RECEIVE_TILDE_EXP 627 }; 628 629 /** 630 * @internal @brief Internal shell state. 631 */ 632 enum shell_state { 633 SHELL_STATE_UNINITIALIZED, 634 SHELL_STATE_INITIALIZED, 635 SHELL_STATE_ACTIVE, 636 SHELL_STATE_PANIC_MODE_ACTIVE, /*!< Panic activated.*/ 637 SHELL_STATE_PANIC_MODE_INACTIVE /*!< Panic requested, not supported.*/ 638 }; 639 640 /** @brief Shell transport event. */ 641 enum shell_transport_evt { 642 SHELL_TRANSPORT_EVT_RX_RDY, 643 SHELL_TRANSPORT_EVT_TX_RDY 644 }; 645 646 typedef void (*shell_transport_handler_t)(enum shell_transport_evt evt, 647 void *context); 648 649 650 typedef void (*shell_uninit_cb_t)(const struct shell *sh, int res); 651 652 /** @brief Bypass callback. 653 * 654 * @param sh Shell instance. 655 * @param data Raw data from transport. 656 * @param len Data length. 657 */ 658 typedef void (*shell_bypass_cb_t)(const struct shell *sh, 659 uint8_t *data, 660 size_t len); 661 662 struct shell_transport; 663 664 /** 665 * @struct shell_transport_api 666 * @brief Unified shell transport interface. 667 */ 668 struct shell_transport_api { 669 /** 670 * @brief Function for initializing the shell transport interface. 671 * 672 * @param[in] transport Pointer to the transfer instance. 673 * @param[in] config Pointer to instance configuration. 674 * @param[in] evt_handler Event handler. 675 * @param[in] context Pointer to the context passed to event 676 * handler. 677 * 678 * @return Standard error code. 679 */ 680 int (*init)(const struct shell_transport *transport, 681 const void *config, 682 shell_transport_handler_t evt_handler, 683 void *context); 684 685 /** 686 * @brief Function for uninitializing the shell transport interface. 687 * 688 * @param[in] transport Pointer to the transfer instance. 689 * 690 * @return Standard error code. 691 */ 692 int (*uninit)(const struct shell_transport *transport); 693 694 /** 695 * @brief Function for enabling transport in given TX mode. 696 * 697 * Function can be used to reconfigure TX to work in blocking mode. 698 * 699 * @param transport Pointer to the transfer instance. 700 * @param blocking_tx If true, the transport TX is enabled in blocking 701 * mode. 702 * 703 * @return NRF_SUCCESS on successful enabling, error otherwise (also if 704 * not supported). 705 */ 706 int (*enable)(const struct shell_transport *transport, 707 bool blocking_tx); 708 709 /** 710 * @brief Function for writing data to the transport interface. 711 * 712 * @param[in] transport Pointer to the transfer instance. 713 * @param[in] data Pointer to the source buffer. 714 * @param[in] length Source buffer length. 715 * @param[out] cnt Pointer to the sent bytes counter. 716 * 717 * @return Standard error code. 718 */ 719 int (*write)(const struct shell_transport *transport, 720 const void *data, size_t length, size_t *cnt); 721 722 /** 723 * @brief Function for reading data from the transport interface. 724 * 725 * @param[in] transport Pointer to the transfer instance. 726 * @param[in] data Pointer to the destination buffer. 727 * @param[in] length Destination buffer length. 728 * @param[out] cnt Pointer to the received bytes counter. 729 * 730 * @return Standard error code. 731 */ 732 int (*read)(const struct shell_transport *transport, 733 void *data, size_t length, size_t *cnt); 734 735 /** 736 * @brief Function called in shell thread loop. 737 * 738 * Can be used for backend operations that require longer execution time 739 * 740 * @param[in] transport Pointer to the transfer instance. 741 */ 742 void (*update)(const struct shell_transport *transport); 743 744 }; 745 746 struct shell_transport { 747 const struct shell_transport_api *api; 748 void *ctx; 749 }; 750 751 /** 752 * @brief Shell statistics structure. 753 */ 754 struct shell_stats { 755 atomic_t log_lost_cnt; /*!< Lost log counter.*/ 756 }; 757 758 #ifdef CONFIG_SHELL_STATS 759 #define Z_SHELL_STATS_DEFINE(_name) static struct shell_stats _name##_stats 760 #define Z_SHELL_STATS_PTR(_name) (&(_name##_stats)) 761 #else 762 #define Z_SHELL_STATS_DEFINE(_name) 763 #define Z_SHELL_STATS_PTR(_name) NULL 764 #endif /* CONFIG_SHELL_STATS */ 765 766 /** 767 * @internal @brief Flags for shell backend configuration. 768 */ 769 struct shell_backend_config_flags { 770 uint32_t insert_mode :1; /*!< Controls insert mode for text introduction */ 771 uint32_t echo :1; /*!< Controls shell echo */ 772 uint32_t obscure :1; /*!< If echo on, print asterisk instead */ 773 uint32_t mode_delete :1; /*!< Operation mode of backspace key */ 774 uint32_t use_colors :1; /*!< Controls colored syntax */ 775 uint32_t use_vt100 :1; /*!< Controls VT100 commands usage in shell */ 776 }; 777 778 BUILD_ASSERT((sizeof(struct shell_backend_config_flags) == sizeof(uint32_t)), 779 "Structure must fit in 4 bytes"); 780 781 /** 782 * @internal @brief Default backend configuration. 783 */ 784 #define SHELL_DEFAULT_BACKEND_CONFIG_FLAGS \ 785 { \ 786 .insert_mode = 0, \ 787 .echo = 1, \ 788 .obscure = IS_ENABLED(CONFIG_SHELL_START_OBSCURED), \ 789 .mode_delete = 1, \ 790 .use_colors = 1, \ 791 .use_vt100 = 1, \ 792 }; 793 794 struct shell_backend_ctx_flags { 795 uint32_t processing :1; /*!< Shell is executing process function */ 796 uint32_t tx_rdy :1; 797 uint32_t history_exit :1; /*!< Request to exit history mode */ 798 uint32_t last_nl :8; /*!< Last received new line character */ 799 uint32_t cmd_ctx :1; /*!< Shell is executing command */ 800 uint32_t print_noinit :1; /*!< Print request from not initialized shell */ 801 uint32_t sync_mode :1; /*!< Shell in synchronous mode */ 802 uint32_t handle_log :1; /*!< Shell is handling logger backend */ 803 }; 804 805 BUILD_ASSERT((sizeof(struct shell_backend_ctx_flags) == sizeof(uint32_t)), 806 "Structure must fit in 4 bytes"); 807 808 /** 809 * @internal @brief Union for internal shell usage. 810 */ 811 union shell_backend_cfg { 812 atomic_t value; 813 struct shell_backend_config_flags flags; 814 }; 815 816 /** 817 * @internal @brief Union for internal shell usage. 818 */ 819 union shell_backend_ctx { 820 uint32_t value; 821 struct shell_backend_ctx_flags flags; 822 }; 823 824 enum shell_signal { 825 SHELL_SIGNAL_RXRDY, 826 SHELL_SIGNAL_LOG_MSG, 827 SHELL_SIGNAL_KILL, 828 SHELL_SIGNAL_TXDONE, /* TXDONE must be last one before SHELL_SIGNALS */ 829 SHELL_SIGNALS 830 }; 831 832 /** 833 * @brief Shell instance context. 834 */ 835 struct shell_ctx { 836 #if defined(CONFIG_SHELL_PROMPT_CHANGE) && CONFIG_SHELL_PROMPT_CHANGE 837 char prompt[CONFIG_SHELL_PROMPT_BUFF_SIZE]; /*!< shell current prompt. */ 838 #else 839 const char *prompt; 840 #endif 841 842 enum shell_state state; /*!< Internal module state.*/ 843 enum shell_receive_state receive_state;/*!< Escape sequence indicator.*/ 844 845 /** Currently executed command.*/ 846 struct shell_static_entry active_cmd; 847 848 /** New root command. If NULL shell uses default root commands. */ 849 const struct shell_static_entry *selected_cmd; 850 851 /** VT100 color and cursor position, terminal width.*/ 852 struct shell_vt100_ctx vt100_ctx; 853 854 /** Callback called from shell thread context when unitialization is 855 * completed just before aborting shell thread. 856 */ 857 shell_uninit_cb_t uninit_cb; 858 859 /** When bypass is set, all incoming data is passed to the callback. */ 860 shell_bypass_cb_t bypass; 861 862 /*!< Logging level for a backend. */ 863 uint32_t log_level; 864 865 #if defined CONFIG_SHELL_GETOPT 866 /*!< getopt context for a shell backend. */ 867 struct getopt_state getopt; 868 #endif 869 870 uint16_t cmd_buff_len; /*!< Command length.*/ 871 uint16_t cmd_buff_pos; /*!< Command buffer cursor position.*/ 872 873 uint16_t cmd_tmp_buff_len; /*!< Command length in tmp buffer.*/ 874 875 /** Command input buffer.*/ 876 char cmd_buff[CONFIG_SHELL_CMD_BUFF_SIZE]; 877 878 /** Command temporary buffer.*/ 879 char temp_buff[CONFIG_SHELL_CMD_BUFF_SIZE]; 880 881 /** Printf buffer size.*/ 882 char printf_buff[CONFIG_SHELL_PRINTF_BUFF_SIZE]; 883 884 volatile union shell_backend_cfg cfg; 885 volatile union shell_backend_ctx ctx; 886 887 struct k_poll_signal signals[SHELL_SIGNALS]; 888 889 /** Events that should be used only internally by shell thread. 890 * Event for SHELL_SIGNAL_TXDONE is initialized but unused. 891 */ 892 struct k_poll_event events[SHELL_SIGNALS]; 893 894 struct k_mutex wr_mtx; 895 k_tid_t tid; 896 int ret_val; 897 }; 898 899 extern const struct log_backend_api log_backend_shell_api; 900 901 /** 902 * @brief Flags for setting shell output newline sequence. 903 */ 904 enum shell_flag { 905 SHELL_FLAG_CRLF_DEFAULT = (1<<0), /*!< Do not map CR or LF */ 906 SHELL_FLAG_OLF_CRLF = (1<<1) /*!< Map LF to CRLF on output */ 907 }; 908 909 /** 910 * @brief Shell instance internals. 911 */ 912 struct shell { 913 const char *default_prompt; /*!< shell default prompt. */ 914 915 const struct shell_transport *iface; /*!< Transport interface.*/ 916 struct shell_ctx *ctx; /*!< Internal context.*/ 917 918 struct shell_history *history; 919 920 const enum shell_flag shell_flag; 921 922 const struct shell_fprintf *fprintf_ctx; 923 924 struct shell_stats *stats; 925 926 const struct shell_log_backend *log_backend; 927 928 LOG_INSTANCE_PTR_DECLARE(log); 929 930 const char *name; 931 struct k_thread *thread; 932 k_thread_stack_t *stack; 933 }; 934 935 extern void z_shell_print_stream(const void *user_ctx, const char *data, 936 size_t data_len); 937 938 /** @brief Internal macro for defining a shell instance. 939 * 940 * As it does not create the default shell logging backend it allows to use 941 * custom approach for integrating logging with shell. 942 * 943 * @param[in] _name Instance name. 944 * @param[in] _prompt Shell default prompt string. 945 * @param[in] _transport_iface Pointer to the transport interface. 946 * @param[in] _out_buf Output buffer. 947 * @param[in] _log_backend Pointer to the log backend instance. 948 * @param[in] _shell_flag Shell output newline sequence. 949 */ 950 #define Z_SHELL_DEFINE(_name, _prompt, _transport_iface, _out_buf, _log_backend, _shell_flag) \ 951 static const struct shell _name; \ 952 static struct shell_ctx UTIL_CAT(_name, _ctx); \ 953 Z_SHELL_HISTORY_DEFINE(_name##_history, CONFIG_SHELL_HISTORY_BUFFER); \ 954 Z_SHELL_FPRINTF_DEFINE(_name##_fprintf, &_name, _out_buf, CONFIG_SHELL_PRINTF_BUFF_SIZE, \ 955 true, z_shell_print_stream); \ 956 LOG_INSTANCE_REGISTER(shell, _name, CONFIG_SHELL_LOG_LEVEL); \ 957 Z_SHELL_STATS_DEFINE(_name); \ 958 static K_KERNEL_STACK_DEFINE(_name##_stack, CONFIG_SHELL_STACK_SIZE); \ 959 static struct k_thread _name##_thread; \ 960 static const STRUCT_SECTION_ITERABLE(shell, _name) = { \ 961 .default_prompt = _prompt, \ 962 .iface = _transport_iface, \ 963 .ctx = &UTIL_CAT(_name, _ctx), \ 964 .history = IS_ENABLED(CONFIG_SHELL_HISTORY) ? &_name##_history : NULL, \ 965 .shell_flag = _shell_flag, \ 966 .fprintf_ctx = &_name##_fprintf, \ 967 .stats = Z_SHELL_STATS_PTR(_name), \ 968 .log_backend = _log_backend, \ 969 LOG_INSTANCE_PTR_INIT(log, shell, _name).name = \ 970 STRINGIFY(_name), .thread = &_name##_thread, .stack = _name##_stack} 971 972 /** 973 * @brief Macro for defining a shell instance. 974 * 975 * @param[in] _name Instance name. 976 * @param[in] _prompt Shell default prompt string. 977 * @param[in] _transport_iface Pointer to the transport interface. 978 * @param[in] _log_queue_size Logger processing queue size. 979 * @param[in] _log_timeout Logger thread timeout in milliseconds on full 980 * log queue. If queue is full logger thread is 981 * blocked for given amount of time before log 982 * message is dropped. 983 * @param[in] _shell_flag Shell output newline sequence. 984 */ 985 #define SHELL_DEFINE(_name, _prompt, _transport_iface, _log_queue_size, _log_timeout, _shell_flag) \ 986 static uint8_t _name##_out_buffer[CONFIG_SHELL_PRINTF_BUFF_SIZE]; \ 987 Z_SHELL_LOG_BACKEND_DEFINE(_name, _name##_out_buffer, CONFIG_SHELL_PRINTF_BUFF_SIZE, \ 988 _log_queue_size, _log_timeout); \ 989 Z_SHELL_DEFINE(_name, _prompt, _transport_iface, _name##_out_buffer, \ 990 Z_SHELL_LOG_BACKEND_PTR(_name), _shell_flag) 991 992 /** 993 * @brief Function for initializing a transport layer and internal shell state. 994 * 995 * @param[in] sh Pointer to shell instance. 996 * @param[in] transport_config Transport configuration during initialization. 997 * @param[in] cfg_flags Initial backend configuration flags. 998 * Shell will copy this data. 999 * @param[in] log_backend If true, the console will be used as logger 1000 * backend. 1001 * @param[in] init_log_level Default severity level for the logger. 1002 * 1003 * @return Standard error code. 1004 */ 1005 int shell_init(const struct shell *sh, const void *transport_config, 1006 struct shell_backend_config_flags cfg_flags, 1007 bool log_backend, uint32_t init_log_level); 1008 1009 /** 1010 * @brief Uninitializes the transport layer and the internal shell state. 1011 * 1012 * @param sh Pointer to shell instance. 1013 * @param cb Callback called when uninitialization is completed. 1014 */ 1015 void shell_uninit(const struct shell *sh, shell_uninit_cb_t cb); 1016 1017 /** 1018 * @brief Function for starting shell processing. 1019 * 1020 * @param sh Pointer to the shell instance. 1021 * 1022 * @return Standard error code. 1023 */ 1024 int shell_start(const struct shell *sh); 1025 1026 /** 1027 * @brief Function for stopping shell processing. 1028 * 1029 * @param sh Pointer to shell instance. 1030 * 1031 * @return Standard error code. 1032 */ 1033 int shell_stop(const struct shell *sh); 1034 1035 /** 1036 * @brief Terminal default text color for shell_fprintf function. 1037 */ 1038 #define SHELL_NORMAL SHELL_VT100_COLOR_DEFAULT 1039 1040 /** 1041 * @brief Green text color for shell_fprintf function. 1042 */ 1043 #define SHELL_INFO SHELL_VT100_COLOR_GREEN 1044 1045 /** 1046 * @brief Cyan text color for shell_fprintf function. 1047 */ 1048 #define SHELL_OPTION SHELL_VT100_COLOR_CYAN 1049 1050 /** 1051 * @brief Yellow text color for shell_fprintf function. 1052 */ 1053 #define SHELL_WARNING SHELL_VT100_COLOR_YELLOW 1054 1055 /** 1056 * @brief Red text color for shell_fprintf function. 1057 */ 1058 #define SHELL_ERROR SHELL_VT100_COLOR_RED 1059 1060 /** 1061 * @brief printf-like function which sends formatted data stream to the shell. 1062 * 1063 * This function can be used from the command handler or from threads, but not 1064 * from an interrupt context. 1065 * 1066 * @param[in] sh Pointer to the shell instance. 1067 * @param[in] color Printed text color. 1068 * @param[in] fmt Format string. 1069 * @param[in] ... List of parameters to print. 1070 */ 1071 void __printf_like(3, 4) shell_fprintf_impl(const struct shell *sh, enum shell_vt100_color color, 1072 const char *fmt, ...); 1073 1074 #define shell_fprintf(sh, color, fmt, ...) shell_fprintf_impl(sh, color, fmt, ##__VA_ARGS__) 1075 1076 /** 1077 * @brief vprintf-like function which sends formatted data stream to the shell. 1078 * 1079 * This function can be used from the command handler or from threads, but not 1080 * from an interrupt context. It is similar to shell_fprintf() but takes a 1081 * va_list instead of variable arguments. 1082 * 1083 * @param[in] sh Pointer to the shell instance. 1084 * @param[in] color Printed text color. 1085 * @param[in] fmt Format string. 1086 * @param[in] args List of parameters to print. 1087 */ 1088 void shell_vfprintf(const struct shell *sh, enum shell_vt100_color color, 1089 const char *fmt, va_list args); 1090 1091 /** 1092 * @brief Print a line of data in hexadecimal format. 1093 * 1094 * Each line shows the offset, bytes and then ASCII representation. 1095 * 1096 * For example: 1097 * 1098 * 00008010: 20 25 00 20 2f 48 00 08 80 05 00 20 af 46 00 1099 * | %. /H.. ... .F. | 1100 * 1101 * @param[in] sh Pointer to the shell instance. 1102 * @param[in] offset Offset to show for this line. 1103 * @param[in] data Pointer to data. 1104 * @param[in] len Length of data. 1105 */ 1106 void shell_hexdump_line(const struct shell *sh, unsigned int offset, 1107 const uint8_t *data, size_t len); 1108 1109 /** 1110 * @brief Print data in hexadecimal format. 1111 * 1112 * @param[in] sh Pointer to the shell instance. 1113 * @param[in] data Pointer to data. 1114 * @param[in] len Length of data. 1115 */ 1116 void shell_hexdump(const struct shell *sh, const uint8_t *data, size_t len); 1117 1118 /** 1119 * @brief Print info message to the shell. 1120 * 1121 * See @ref shell_fprintf. 1122 * 1123 * @param[in] _sh Pointer to the shell instance. 1124 * @param[in] _ft Format string. 1125 * @param[in] ... List of parameters to print. 1126 */ 1127 #define shell_info(_sh, _ft, ...) \ 1128 shell_fprintf_info(_sh, _ft "\n", ##__VA_ARGS__) 1129 void __printf_like(2, 3) shell_fprintf_info(const struct shell *sh, const char *fmt, ...); 1130 1131 /** 1132 * @brief Print normal message to the shell. 1133 * 1134 * See @ref shell_fprintf. 1135 * 1136 * @param[in] _sh Pointer to the shell instance. 1137 * @param[in] _ft Format string. 1138 * @param[in] ... List of parameters to print. 1139 */ 1140 #define shell_print(_sh, _ft, ...) \ 1141 shell_fprintf_normal(_sh, _ft "\n", ##__VA_ARGS__) 1142 void __printf_like(2, 3) shell_fprintf_normal(const struct shell *sh, const char *fmt, ...); 1143 1144 /** 1145 * @brief Print warning message to the shell. 1146 * 1147 * See @ref shell_fprintf. 1148 * 1149 * @param[in] _sh Pointer to the shell instance. 1150 * @param[in] _ft Format string. 1151 * @param[in] ... List of parameters to print. 1152 */ 1153 #define shell_warn(_sh, _ft, ...) \ 1154 shell_fprintf_warn(_sh, _ft "\n", ##__VA_ARGS__) 1155 void __printf_like(2, 3) shell_fprintf_warn(const struct shell *sh, const char *fmt, ...); 1156 1157 /** 1158 * @brief Print error message to the shell. 1159 * 1160 * See @ref shell_fprintf. 1161 * 1162 * @param[in] _sh Pointer to the shell instance. 1163 * @param[in] _ft Format string. 1164 * @param[in] ... List of parameters to print. 1165 */ 1166 #define shell_error(_sh, _ft, ...) \ 1167 shell_fprintf_error(_sh, _ft "\n", ##__VA_ARGS__) 1168 void __printf_like(2, 3) shell_fprintf_error(const struct shell *sh, const char *fmt, ...); 1169 1170 /** 1171 * @brief Process function, which should be executed when data is ready in the 1172 * transport interface. To be used if shell thread is disabled. 1173 * 1174 * @param[in] sh Pointer to the shell instance. 1175 */ 1176 void shell_process(const struct shell *sh); 1177 1178 /** 1179 * @brief Change displayed shell prompt. 1180 * 1181 * @param[in] sh Pointer to the shell instance. 1182 * @param[in] prompt New shell prompt. 1183 * 1184 * @return 0 Success. 1185 * @return -EINVAL Pointer to new prompt is not correct. 1186 */ 1187 int shell_prompt_change(const struct shell *sh, const char *prompt); 1188 1189 /** 1190 * @brief Prints the current command help. 1191 * 1192 * Function will print a help string with: the currently entered command 1193 * and subcommands (if they exist). 1194 * 1195 * @param[in] sh Pointer to the shell instance. 1196 */ 1197 void shell_help(const struct shell *sh); 1198 1199 /** @brief Command's help has been printed */ 1200 #define SHELL_CMD_HELP_PRINTED (1) 1201 1202 /** @brief Execute command. 1203 * 1204 * Pass command line to shell to execute. 1205 * 1206 * Note: This by no means makes any of the commands a stable interface, so 1207 * this function should only be used for debugging/diagnostic. 1208 * 1209 * This function must not be called from shell command context! 1210 1211 * 1212 * @param[in] sh Pointer to the shell instance. 1213 * It can be NULL when the 1214 * @kconfig{CONFIG_SHELL_BACKEND_DUMMY} option is enabled. 1215 * @param[in] cmd Command to be executed. 1216 * 1217 * @return Result of the execution 1218 */ 1219 int shell_execute_cmd(const struct shell *sh, const char *cmd); 1220 1221 /** @brief Set root command for all shell instances. 1222 * 1223 * It allows setting from the code the root command. It is an equivalent of 1224 * calling select command with one of the root commands as the argument 1225 * (e.g "select log") except it sets command for all shell instances. 1226 * 1227 * @param cmd String with one of the root commands or null pointer to reset. 1228 * 1229 * @retval 0 if root command is set. 1230 * @retval -EINVAL if invalid root command is provided. 1231 */ 1232 int shell_set_root_cmd(const char *cmd); 1233 1234 /** @brief Set bypass callback. 1235 * 1236 * Bypass callback is called whenever data is received. Shell is bypassed and 1237 * data is passed directly to the callback. Use null to disable bypass functionality. 1238 * 1239 * @param[in] sh Pointer to the shell instance. 1240 * @param[in] bypass Bypass callback or null to disable. 1241 */ 1242 void shell_set_bypass(const struct shell *sh, shell_bypass_cb_t bypass); 1243 1244 /** @brief Get shell readiness to execute commands. 1245 * 1246 * @param[in] sh Pointer to the shell instance. 1247 * 1248 * @retval true Shell backend is ready to execute commands. 1249 * @retval false Shell backend is not initialized or not started. 1250 */ 1251 bool shell_ready(const struct shell *sh); 1252 1253 /** 1254 * @brief Allow application to control text insert mode. 1255 * Value is modified atomically and the previous value is returned. 1256 * 1257 * @param[in] sh Pointer to the shell instance. 1258 * @param[in] val Insert mode. 1259 * 1260 * @retval 0 or 1: previous value 1261 * @retval -EINVAL if shell is NULL. 1262 */ 1263 int shell_insert_mode_set(const struct shell *sh, bool val); 1264 1265 /** 1266 * @brief Allow application to control whether terminal output uses colored 1267 * syntax. 1268 * Value is modified atomically and the previous value is returned. 1269 * 1270 * @param[in] sh Pointer to the shell instance. 1271 * @param[in] val Color mode. 1272 * 1273 * @retval 0 or 1: previous value 1274 * @retval -EINVAL if shell is NULL. 1275 */ 1276 int shell_use_colors_set(const struct shell *sh, bool val); 1277 1278 /** 1279 * @brief Allow application to control whether terminal is using vt100 commands. 1280 * Value is modified atomically and the previous value is returned. 1281 * 1282 * @param[in] sh Pointer to the shell instance. 1283 * @param[in] val vt100 mode. 1284 * 1285 * @retval 0 or 1: previous value 1286 * @retval -EINVAL if shell is NULL. 1287 */ 1288 int shell_use_vt100_set(const struct shell *sh, bool val); 1289 1290 /** 1291 * @brief Allow application to control whether user input is echoed back. 1292 * Value is modified atomically and the previous value is returned. 1293 * 1294 * @param[in] sh Pointer to the shell instance. 1295 * @param[in] val Echo mode. 1296 * 1297 * @retval 0 or 1: previous value 1298 * @retval -EINVAL if shell is NULL. 1299 */ 1300 int shell_echo_set(const struct shell *sh, bool val); 1301 1302 /** 1303 * @brief Allow application to control whether user input is obscured with 1304 * asterisks -- useful for implementing passwords. 1305 * Value is modified atomically and the previous value is returned. 1306 * 1307 * @param[in] sh Pointer to the shell instance. 1308 * @param[in] obscure Obscure mode. 1309 * 1310 * @retval 0 or 1: previous value. 1311 * @retval -EINVAL if shell is NULL. 1312 */ 1313 int shell_obscure_set(const struct shell *sh, bool obscure); 1314 1315 /** 1316 * @brief Allow application to control whether the delete key backspaces or 1317 * deletes. 1318 * Value is modified atomically and the previous value is returned. 1319 * 1320 * @param[in] sh Pointer to the shell instance. 1321 * @param[in] val Delete mode. 1322 * 1323 * @retval 0 or 1: previous value 1324 * @retval -EINVAL if shell is NULL. 1325 */ 1326 int shell_mode_delete_set(const struct shell *sh, bool val); 1327 1328 /** 1329 * @brief Retrieve return value of most recently executed shell command. 1330 * 1331 * @param[in] sh Pointer to the shell instance 1332 * 1333 * @retval return value of previous command 1334 */ 1335 int shell_get_return_value(const struct shell *sh); 1336 1337 /** 1338 * @} 1339 */ 1340 1341 #ifdef __cplusplus 1342 } 1343 #endif 1344 1345 #ifdef CONFIG_SHELL_CUSTOM_HEADER 1346 /* This include must always be at the end of shell.h */ 1347 #include <zephyr_custom_shell.h> 1348 #endif 1349 1350 #endif /* SHELL_H__ */ 1351