OVMS3-idf/examples/system/console
Ivan Grokhotkov bc04b1f53b examples: don't enable buffering on stdout in console examples
newlib uses significantly more stack space when printing to an
unbuffered stream. To reduce the amount of stack space required to
use the console, don’t disable buffering. linenoise should support
unbuffered stdout instead.
2019-03-15 11:31:22 +08:00
..
components Added support for NVS in console example 2019-01-11 09:51:50 +08:00
main examples: don't enable buffering on stdout in console examples 2019-03-15 11:31:22 +08:00
CMakeLists.txt cmake: make main a component again 2018-09-11 09:44:12 +08:00
Makefile add console component and example 2017-08-21 15:58:27 +08:00
partitions_example.csv add console component and example 2017-08-21 15:58:27 +08:00
README.md add console component and example 2017-08-21 15:58:27 +08:00
sdkconfig.defaults partition_table: Check configured flash size fits in partition table 2018-04-26 09:51:55 +10:00

Console example

This example illustrates usage of console component to create an interactive shell.

Configuring UART and VFS

initialize_console function configures some aspects of UART and VFS relevant to the operation of console:

  • By default stdin and stdout are buffered streams. This means that the text written to stdout will not be immediately sent to UART. This is not the desirable behavior for the console, so buffering for stdin and stdout is disabled using setvbuf function.

  • Line endings are configured to match those expected/generated by common serial monitor programs, such as screen, minicom, and the idf_monitor.py included in the SDK. The default behavior for these commands is:

    • When 'enter' key is pressed on the keyboard, CR (0x13) code is sent to the serial device.
    • To move the cursor to the beginning of the next line, serial device needs to send CR LF (0x13 0x10) sequence.
  • UART driver is initialized, and VFS is configured to use UART driver's interrupt-driver read and write functions.

Line editing

The main source file of the example illustrates how to use linenoise library, including line completion, hints, and history.

Commands

Several commands are registered using esp_console_cmd_register function. See register_wifi and register_system functions in cmd_wifi.c and cmd_system.c files.

Command handling

Main loop inside app_main function illustrates how to use linenoise and esp_console_run to implement read/eval loop.

Argument parsing

Several commands implemented in cmd_wifi.c and cmd_system.c use Argtable3 library to parse and check the arguments.

Command history

Each time a new command line is obtained from linenoise, it is written into history and the history is saved into a file in flash memory. On reset, history is initialized from that file.

Example output

Here is an sample session with the console example. GPIO15 is connected to GND to remove boot log output.

This is an example of ESP-IDF console component.
Type 'help' to get the list of commands.
Use UP/DOWN arrows to navigate through command history.
Press TAB when typing command name to auto-complete.
[esp32]> help
help 
  Print the list of registered commands

free 
  Get the total size of heap memory available

restart 
  Restart the program

deep_sleep  [-t <t>] [--io=<n>] [--io_level=<0|1>]
  Enter deep sleep mode. Two wakeup modes are supported: timer and GPIO. If no
  wakeup option is specified, will sleep indefinitely.
  -t, --time=<t>  Wake up time, ms
      --io=<n>  If specified, wakeup using GPIO with given number
  --io_level=<0|1>  GPIO level to trigger wakeup

join  [--timeout=<t>] <ssid> [<pass>]
  Join WiFi AP as a station
  --timeout=<t>  Connection timeout, ms
        <ssid>  SSID of AP
        <pass>  PSK of AP

[esp32]> free
257200
[esp32]> deep_sleep -t 1000
I (146929) deep_sleep: Enabling timer wakeup, timeout=1000000us
I (619) heap_init: Initializing. RAM available for dynamic allocation:
I (620) heap_init: At 3FFAE2A0 len 00001D60 (7 KiB): DRAM
I (626) heap_init: At 3FFB7EA0 len 00028160 (160 KiB): DRAM
I (645) heap_init: At 3FFE0440 len 00003BC0 (14 KiB): D/IRAM
I (664) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (684) heap_init: At 40093EA8 len 0000C158 (48 KiB): IRAM

This is an example of ESP-IDF console component.
Type 'help' to get the list of commands.
Use UP/DOWN arrows to navigate through command history.
Press TAB when typing command name to auto-complete.
[esp32]> join --timeout 10000 test_ap test_password
I (182639) connect: Connecting to 'test_ap'
I (184619) connect: Connected
[esp32]> free
212328
[esp32]> restart
I (205639) restart: Restarting
I (616) heap_init: Initializing. RAM available for dynamic allocation:
I (617) heap_init: At 3FFAE2A0 len 00001D60 (7 KiB): DRAM
I (623) heap_init: At 3FFB7EA0 len 00028160 (160 KiB): DRAM
I (642) heap_init: At 3FFE0440 len 00003BC0 (14 KiB): D/IRAM
I (661) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (681) heap_init: At 40093EA8 len 0000C158 (48 KiB): IRAM

This is an example of ESP-IDF console component.
Type 'help' to get the list of commands.
Use UP/DOWN arrows to navigate through command history.
Press TAB when typing command name to auto-complete.
[esp32]> 


See the README.md file in the upper level 'examples' directory for more information about examples.