/* * * Copyright (c) 2021 Project CHIP Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include "sdkconfig.h" #include "esp_console.h" #include "esp_vfs_dev.h" #include "linenoise/linenoise.h" #include #include #include #include #if defined(CONFIG_ESP_CONSOLE_UART_DEFAULT) || defined(CONFIG_ESP_CONSOLE_UART_CUSTOM) #include "driver/uart.h" #endif #ifdef CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG #include "driver/usb_serial_jtag.h" #include "esp_vfs_usb_serial_jtag.h" #endif namespace chip { namespace Shell { static int chip_command_handler(int argc, char ** argv) { CHIP_ERROR err; if (argc > 0) { err = Engine::Root().ExecCommand(argc - 1, argv + 1); } else { err = CHIP_ERROR_INVALID_ARGUMENT; } return static_cast(err.AsInteger()); } int streamer_esp32_init(streamer_t * streamer) { fflush(stdout); fsync(fileno(stdout)); setvbuf(stdin, NULL, _IONBF, 0); #if defined(CONFIG_ESP_CONSOLE_UART_DEFAULT) || defined(CONFIG_ESP_CONSOLE_UART_CUSTOM) esp_vfs_dev_uart_port_set_rx_line_endings((uart_port_t) CONFIG_ESP_CONSOLE_UART_NUM, ESP_LINE_ENDINGS_CR); esp_vfs_dev_uart_port_set_tx_line_endings((uart_port_t) CONFIG_ESP_CONSOLE_UART_NUM, ESP_LINE_ENDINGS_CRLF); if (!uart_is_driver_installed((uart_port_t) CONFIG_ESP_CONSOLE_UART_NUM)) { ESP_ERROR_CHECK(uart_driver_install((uart_port_t) CONFIG_ESP_CONSOLE_UART_NUM, 256, 0, 0, NULL, 0)); } uart_config_t uart_config = { .baud_rate = CONFIG_ESP_CONSOLE_UART_BAUDRATE, .data_bits = UART_DATA_8_BITS, .parity = UART_PARITY_DISABLE, .stop_bits = UART_STOP_BITS_1, .flow_ctrl = UART_HW_FLOWCTRL_DISABLE, .rx_flow_ctrl_thresh = 0, #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0) .source_clk = UART_SCLK_DEFAULT, #else .source_clk = UART_SCLK_APB, #endif }; ESP_ERROR_CHECK(uart_param_config((uart_port_t) CONFIG_ESP_CONSOLE_UART_NUM, &uart_config)); esp_vfs_dev_uart_use_driver(0); #endif // CONFIG_ESP_CONSOLE_UART_DEFAULT || CONFIG_ESP_CONSOLE_UART_CUSTOM #ifdef CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG esp_vfs_dev_usb_serial_jtag_set_rx_line_endings(ESP_LINE_ENDINGS_CR); esp_vfs_dev_usb_serial_jtag_set_tx_line_endings(ESP_LINE_ENDINGS_CRLF); fcntl(fileno(stdout), F_SETFL, O_NONBLOCK); fcntl(fileno(stdin), F_SETFL, O_NONBLOCK); usb_serial_jtag_driver_config_t usb_serial_jtag_config = { .tx_buffer_size = 256, .rx_buffer_size = 256, }; usb_serial_jtag_driver_install(&usb_serial_jtag_config); esp_vfs_usb_serial_jtag_use_driver(); esp_vfs_dev_uart_register(); #endif // CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG esp_console_config_t console_config = { .max_cmdline_length = CONFIG_CHIP_SHELL_CMD_LINE_BUF_MAX_LENGTH, .max_cmdline_args = CONFIG_CHIP_SHELL_CMD_LINE_ARG_MAX_COUNT, }; ESP_ERROR_CHECK(esp_console_init(&console_config)); linenoiseSetMultiLine(1); linenoiseHistorySetMaxLen(100); if (linenoiseProbe()) { // Set if terminal does not recognize escape sequences. linenoiseSetDumbMode(1); } esp_console_cmd_t command = { .command = "matter", .help = "Matter utilities", .func = chip_command_handler }; ESP_ERROR_CHECK(esp_console_cmd_register(&command)); ESP_ERROR_CHECK(esp_console_register_help_command()); return 0; } ssize_t streamer_esp32_read(streamer_t * streamer, char * buf, size_t len) { return 0; } ssize_t streamer_esp32_write(streamer_t * streamer, const char * buf, size_t len) { #if defined(CONFIG_ESP_CONSOLE_UART_DEFAULT) || defined(CONFIG_ESP_CONSOLE_UART_CUSTOM) return uart_write_bytes((uart_port_t) CONFIG_ESP_CONSOLE_UART_NUM, buf, len); #endif #ifdef CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG return usb_serial_jtag_write_bytes(buf, len, 0); #endif #if CONFIG_ESP_CONSOLE_NONE return len; #endif } static streamer_t streamer_stdio = { .init_cb = streamer_esp32_init, .read_cb = streamer_esp32_read, .write_cb = streamer_esp32_write, }; streamer_t * streamer_get() { return &streamer_stdio; } } // namespace Shell } // namespace chip