diff --git a/README.md b/README.md index da662fe..d8815bb 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,104 @@ -TODO: + +# CAN Wizard + +CAN Wizard is a project designed for communication using the CAN (Controller Area Network) protocol, primarily targeted at embedded systems utilizing the ESP32 microcontroller family. This project is developed using ESP-IDF and supports ESP32-C3, allowing flexible development for different use cases. + +Here are more information: +- [Xa6p Article](https://habr.com/ru/articles/793326/). (in Russian) +- [Traduccion in English](https://okhsunrog.ru/articles/2024/02/15/can_bus_sniffer/). + +## Features + +- **CAN Communication**: Implements CAN communication protocols, enabling data exchange between devices over a CAN bus. +- **File System Integration**: Includes file system operations for handling configuration or logging. +- **Custom serial Console**: A custom serial console implementation for interacting with the system and issuing commands. +- **Modular Design**: Organized in components for easier maintenance and scalability, including linked lists and command utilities. + +## Requirements + +- **Hardware**: + - ESP32-C3 microcontroller + - SN65HVD230 CAN transceiver + +- **Software**: + - ESP-IDF (version x.x.x or newer) + - CMake (for project build system) + - Python (for ESP-IDF and related tools) + +## Setup and Installation + +1. **Clone the Repository**: + Clone this repository using: + ```bash + git clone --recursive git@github.com:okhsunrog/can_wizard.git + ``` + +2. **Install ESP-IDF**: + Follow the official ESP-IDF installation guide for your operating system: [ESP-IDF Setup Guide](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/) + +3. **Configure ESP-IDF**: + Set up your environment by running the following commands: + ```bash + cd + idf.py set-target esp32c3 + idf.py menuconfig + ``` + +4. **Build and Flash**: + Build the project and flash it to your microcontroller: + ```bash + idf.py build + idf.py flash + idf.py monitor + ``` + +## Usage + +### Console Commands + +The CAN Wizard project provides several commands that can be executed through a console interface: + +- `can_send `: Send CAN data over the bus. +- `can_receive`: Receive CAN data from the bus. +- `can_status`: Display the current CAN status. + +Additional commands can be explored through the console by typing `help`. + +### File System Operations + +The project includes basic file system operations to read and write configuration or log files. These operations can be accessed through the `fs_*` commands in the console. + +## Project Structure + +``` +can_wizard-main/ +├── components/ +│ └── C-Linked-List/ # Linked list implementation used in the project +├── main/ +│ ├── can.c # CAN communication implementation +│ ├── console.c # Custom console implementation +│ ├── cmd_can.c # CAN command handlers +│ ├── fs.c # File system operations +│ └── main.c # Main entry point +└── CMakeLists.txt # Project build system configuration +``` + +## TODO: - code refactoring - test dumb mode - fix prompt flickering with some commands - add standard ID filtering to cansmartfilter -An article about the project: -- in [Russian](https://habr.com/ru/articles/793326/). -- in [English](https://okhsunrog.ru/articles/2024/02/15/can_bus_sniffer/). +## License + +This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details. + +## Contributing + +Contributions are welcome! Please submit a pull request or open an issue to discuss your ideas. + +## Author + +Danila Gornushko + + diff --git a/main/cmd_can.c b/main/cmd_can.c index 906bfca..b90e5ef 100644 --- a/main/cmd_can.c +++ b/main/cmd_can.c @@ -185,6 +185,7 @@ static int canup(int argc, char **argv) { break; } switch (canup_args.speed->ival[0]) { + #if CONFIG_IDF_TARGET_ESP32C3 case 1000: t_config = (twai_timing_config_t) TWAI_TIMING_CONFIG_1KBITS(); break; @@ -203,6 +204,7 @@ static int canup(int argc, char **argv) { case 20000: t_config = (twai_timing_config_t) TWAI_TIMING_CONFIG_20KBITS(); break; + #endif case 25000: t_config = (twai_timing_config_t) TWAI_TIMING_CONFIG_25KBITS(); break; diff --git a/main/console.c b/main/console.c index d7dfaee..f691ea2 100644 --- a/main/console.c +++ b/main/console.c @@ -23,6 +23,9 @@ #include "can.h" #include "fs.h" #include "xvprintf.h" +#if CONFIG_IDF_TARGET_ESP32 + #include "driver/uart.h" +#endif #if CONFIG_LOG_COLORS static const bool use_colors = true; @@ -182,29 +185,61 @@ void console_task_interactive(void* arg) { void initialize_console(void) { /* Disable buffering on stdin */ setvbuf(stdin, NULL, _IONBF, 0); - /* Minicom, screen, idf_monitor send CR when ENTER key is pressed */ - esp_vfs_dev_usb_serial_jtag_set_rx_line_endings(ESP_LINE_ENDINGS_CR); - /* Move the caret to the beginning of the next line on '\n' */ - esp_vfs_dev_usb_serial_jtag_set_tx_line_endings(ESP_LINE_ENDINGS_CRLF); + + #if CONFIG_IDF_TARGET_ESP32 + /* Set up UART for the console */ + const uart_config_t uart_config = { + .baud_rate = 115200, + .data_bits = UART_DATA_8_BITS, + .parity = UART_PARITY_DISABLE, + .stop_bits = UART_STOP_BITS_1, + .flow_ctrl = UART_HW_FLOWCTRL_DISABLE, + }; + + /* Install the UART driver */ + uart_driver_install(UART_NUM_0, 256, 0, 0, NULL, 0); + uart_param_config(UART_NUM_0, &uart_config); + + /* Asign VFS to UART */ + //uart_vfs_dev_use_driver(UART_NUM_0); + esp_vfs_dev_uart_use_driver(UART_NUM_0); + #elif CONFIG_IDF_TARGET_ESP32C3 + /* Minicom, screen, idf_monitor send CR when ENTER key is pressed */ + esp_vfs_dev_usb_serial_jtag_set_rx_line_endings(ESP_LINE_ENDINGS_CR); + + /* Move the caret to the beginning of the next line on '\n' */ + esp_vfs_dev_usb_serial_jtag_set_tx_line_endings(ESP_LINE_ENDINGS_CRLF); + + usb_serial_jtag_driver_config_t usb_serial_jtag_config = USB_SERIAL_JTAG_DRIVER_CONFIG_DEFAULT(); + + /* Install USB-SERIAL-JTAG driver for interrupt-driven reads and writes */ + ESP_ERROR_CHECK(usb_serial_jtag_driver_install(&usb_serial_jtag_config)); + + /* Asign vfs to JTAG */ + esp_vfs_usb_serial_jtag_use_driver(); + #endif + /* Enable non-blocking mode on stdin and stdout */ fcntl(fileno(stdout), F_SETFL, 0); fcntl(fileno(stdin), F_SETFL, 0); - usb_serial_jtag_driver_config_t usb_serial_jtag_config = USB_SERIAL_JTAG_DRIVER_CONFIG_DEFAULT(); - /* Install USB-SERIAL-JTAG driver for interrupt-driven reads and writes */ - ESP_ERROR_CHECK(usb_serial_jtag_driver_install(&usb_serial_jtag_config)); - /* Tell vfs to use usb-serial-jtag driver */ - esp_vfs_usb_serial_jtag_use_driver(); + + /* Configure the console */ console_config.max_cmdline_args = CONFIG_CONSOLE_MAX_CMDLINE_ARGS; console_config.max_cmdline_length = CONFIG_CONSOLE_MAX_CMDLINE_LENGTH; if (use_colors) console_config.hint_color = atoi(LOG_COLOR_CYAN); + + /* Initializing */ ESP_ERROR_CHECK(esp_console_init(&console_config)); - // linenoiseSetMultiLine(1); + + /* Config library linenoise */ + linenoiseSetMultiLine(1); linenoiseSetCompletionCallback(&esp_console_get_completion); linenoiseSetHintsCallback((linenoiseHintsCallback*) &esp_console_get_hint); linenoiseHistorySetMaxLen(30); linenoiseSetMaxLineLen(console_config.max_cmdline_length); linenoiseHistoryLoad(HISTORY_PATH); - /* Register commands */ + + /* Record commands */ esp_console_register_help_command(); register_system(); register_can_commands();