91 lines
2.9 KiB
C
91 lines
2.9 KiB
C
#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 <stdbool.h>
|
|
#include <string.h>
|
|
|
|
#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 = 921600, // 921600, 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;
|
|
}
|