ESP32/main/metrics_serial.c
2026-06-23 20:38:23 +08:00

123 lines
3.2 KiB
C

#include "metrics_serial.h"
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
#include "driver/uart.h"
#include "driver/usb_serial_jtag.h"
#include "esp_err.h"
#include "esp_log.h"
#include "freertos/FreeRTOS.h"
#include "freertos/queue.h"
#include "freertos/task.h"
#include "metrics_protocol.h"
#include "ui_screen.h"
static const char *TAG = "metrics_serial";
static QueueHandle_t s_serial_metrics_queue;
static void consume_byte(char ch, char *line, size_t *length)
{
if (ch == '\r') {
return;
}
if (ch == '\n') {
line[*length] = '\0';
*length = 0;
ui_metrics_t metrics;
if (metrics_parse_line(line, &metrics)) {
if (s_serial_metrics_queue != NULL) {
xQueueOverwrite(s_serial_metrics_queue, &metrics);
}
}
return;
}
if (*length < 511) {
line[*length] = ch;
*length += 1;
} else {
*length = 0;
}
}
static void usb_serial_task(void *arg)
{
(void)arg;
char line[512];
size_t length = 0;
uint8_t buffer[64];
while (1) {
int read = usb_serial_jtag_read_bytes(buffer, sizeof(buffer), pdMS_TO_TICKS(100));
for (int i = 0; i < read; i++) {
consume_byte((char)buffer[i], line, &length);
}
}
}
static void uart_serial_task(void *arg)
{
(void)arg;
char line[512];
size_t length = 0;
uint8_t buffer[64];
while (1) {
int read = uart_read_bytes(UART_NUM_0, buffer, sizeof(buffer), pdMS_TO_TICKS(100));
for (int i = 0; i < read; i++) {
consume_byte((char)buffer[i], line, &length);
}
}
}
void metrics_serial_start(void)
{
if (s_serial_metrics_queue == NULL) {
s_serial_metrics_queue = xQueueCreate(1, sizeof(ui_metrics_t));
if (s_serial_metrics_queue == NULL) {
ESP_LOGW(TAG, "serial metrics queue unavailable");
return;
}
}
usb_serial_jtag_driver_config_t usb_config = {
.tx_buffer_size = 256,
.rx_buffer_size = 1024,
};
esp_err_t usb_ret = usb_serial_jtag_driver_install(&usb_config);
if (usb_ret != ESP_OK && usb_ret != ESP_ERR_INVALID_STATE) {
ESP_LOGW(TAG, "USB Serial/JTAG install failed: %s", esp_err_to_name(usb_ret));
} else {
xTaskCreate(usb_serial_task, "metrics_usb", 4096, NULL, 4, NULL);
}
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,
.source_clk = UART_SCLK_DEFAULT,
};
uart_param_config(UART_NUM_0, &uart_config);
esp_err_t uart_ret = uart_driver_install(UART_NUM_0, 1024, 0, 0, NULL, 0);
if (uart_ret != ESP_OK && uart_ret != ESP_ERR_INVALID_STATE) {
ESP_LOGW(TAG, "UART0 install failed: %s", esp_err_to_name(uart_ret));
} else {
xTaskCreate(uart_serial_task, "metrics_uart", 4096, NULL, 4, NULL);
}
}
bool metrics_serial_take_latest(ui_metrics_t *metrics)
{
if (metrics == NULL || s_serial_metrics_queue == NULL) {
return false;
}
return xQueueReceive(s_serial_metrics_queue, metrics, 0) == pdTRUE;
}