#include "driver/gpio.h" #include "driver/uart.h" #include "esp_log.h" #include "esp_log_buffer.h" #include "freertos/idf_additions.h" #include "hal/uart_types.h" #include "message_handler.h" #include "message_parser.h" #include "nvs_flash.h" #include "portmacro.h" #include #include #include "message_parser.h" #include "uart_handler.h" static const char *TAG = "ALOX - UART"; static QueueHandle_t parsed_message_queue; void init_uart(QueueHandle_t msg_queue_handle) { 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}; uart_driver_install(MASTER_UART, BUF_SIZE * 2, 0, 0, NULL, 0); uart_param_config(MASTER_UART, &uart_config); uart_set_pin(MASTER_UART, TXD_PIN, RXD_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE); parsed_message_queue = msg_queue_handle; register_message_callback(HandleMessageReceivedCallback); register_message_fail_callback(HandleMessageFailCallback); xTaskCreate(uart_read_task, "Read Uart", 4096, NULL, 1, NULL); } void uart_read_task(void *param) { // Send all Input from Uart to the Message Handler for Parsing struct MessageReceive mr = InitMessageReceive(); uint8_t *data = (uint8_t *)malloc(BUF_SIZE); int len = 0; while (1) { len = 0; len = uart_read_bytes(MASTER_UART, data, BUF_SIZE, (20 / portTICK_PERIOD_MS)); if (len > 0) { for (int i = 0; i < len; ++i) { parse_byte(&mr, data[i]); } } } } // TODO: Remove this? or handle message sending in any other way reduce // abstraction hell void send_message_hook(const uint8_t *buffer, size_t length) { uart_write_bytes(MASTER_UART, buffer, length); } void HandleMessageReceivedCallback(uint8_t msgid, const uint8_t *payload, size_t payload_len) { ESP_LOGI(TAG, "GOT UART MESSAGE MSGID: %02X, Len: %u bytes \nMSG: ", msgid, payload_len, payload); ESP_LOG_BUFFER_HEX(TAG, payload, payload_len); ParsedMessage_t msg_to_send; msg_to_send.msgid = msgid; msg_to_send.payload_len = payload_len; memcpy(msg_to_send.data, payload, payload_len); if (xQueueSend(parsed_message_queue, &msg_to_send, portMAX_DELAY) != pdPASS) { // Fehlerbehandlung: Queue voll oder Senden fehlgeschlagen ESP_LOGE(TAG, "Failed to send parsed message to queue."); } return; } void HandleMessageFailCallback(uint8_t msgid, const uint8_t *payload, size_t payload_len, enum ParserError error) { ESP_LOGE( TAG, "UART MESSAGE Parsing Failed MSGID: %02X, Len: %u, ERROR: %X, \nMSG: ", msgid, payload_len, error); ESP_LOG_BUFFER_HEX(TAG, payload, payload_len); return; }