#include "system/lwesp_ll.h" #include "lwesp/lwesp.h" #include "lwesp/lwesp_input.h" #include "lwesp/lwesp_mem.h" #include "stm32h7xx_hal.h" #include "cmsis_os.h" #define UART_TIMEOUT 1000 #define UART_BUFFER_SIZE 1024 #define HEAP_SIZE 4096 #define UART_HANDLE huart4 extern UART_HandleTypeDef UART_HANDLE; static uint8_t s_uart_rxbuf[UART_BUFFER_SIZE]; static uint8_t s_lwesp_heap[HEAP_SIZE]; static uint8_t s_initialized; static osThreadId_t usart_ll_thread_id; static osMessageQueueId_t usart_ll_mbox_id; void usart_rx_event_callback(UART_HandleTypeDef *huart, uint16_t Pos) { // Count pos in buffer, notify UART LL thread. } void usart_rx_cplt_callback(UART_HandleTypeDef *huart) { // Circular DMA is used, so no complete event will be received normally } void usart_error_callback(UART_HandleTypeDef *huart) { // Error encountered, DMA aborted. } static void usart_ll_thread(void *arg) { for (;;) { } } static void configure_uart(uint32_t baudrate) { // Register callbacks HAL_UART_RegisterCallback(&UART_HANDLE, HAL_UART_RX_COMPLETE_CB_ID, usart_rx_cplt_callback); HAL_UART_RegisterCallback(&UART_HANDLE, HAL_UART_ERROR_CB_ID, usart_error_callback); HAL_UART_RegisterRxEventCallback(&UART_HANDLE, usart_rx_event_callback); // Enable DMA Rx HAL_UART_Receive_DMA(&UART_HANDLE, s_uart_rxbuf, UART_BUFFER_SIZE); } static size_t send_data(const void *data, size_t len) { HAL_UART_Transmit(&UART_HANDLE, (uint8_t *)data, len, 1000); return len; } lwespr_t lwesp_ll_init(lwesp_ll_t *ll) { lwesp_mem_region_t mem_regions[] = {{s_lwesp_heap, HEAP_SIZE}}; if (!s_initialized) { // Internal heap management lwesp_mem_assignmemory(mem_regions, LWESP_ARRAYSIZE(mem_regions)); // Initialize callbacks ll->send_fn = send_data; } // Configure UART device and RX ring buffer configure_uart(ll->uart.baudrate); if(!s_initialized) { const osThreadAttr_t attr = { .stack_size = 1024 }; usart_ll_mbox_id = osMessageQueueNew(10, sizeof(void *), NULL); usart_ll_thread_id = osThreadNew(usart_ll_thread, usart_ll_mbox_id, &attr); } s_initialized = 1; return lwespOK; } lwespr_t lwesp_ll_deinit(lwesp_ll_t *ll) { // return lwespOK; }