/* * serial.c * * Version 2.0 * * Created on: 15.03.2021 * Author: harry */ #include "usart.h" #include "fifo.h" #include "serial.h" static SerialDriverHandle_t SerialDriver[MAX_SERIALS + 1]; static uint8_t used_ports = 0; /******************************************************************** * Serial API-Fuctions ********************************************************************/ void serial_init() { for (int i = 0; i < (MAX_SERIALS + 1); i++) SerialDriver[i].Driver->PortHandle = NULL; } SerialDriverHandle_t* AddSerial(UART_HandleTypeDef *uart_handle, SerialDriverLink_t *driver, uint8_t *tx_buf, uint16_t tx_bufsize) { if (used_ports < MAX_SERIALS) { SerialDriver[used_ports].Driver->PortHandle = uart_handle; SerialDriver[used_ports].Driver = driver; SerialDriver[used_ports].tx_idle = TRUE; SerialDriver[used_ports].Driver->InitInstance(&SerialDriver[used_ports].Driver); fifo_init(&SerialDriver[used_ports].txbuf, (uint8_t*) tx_buf, tx_bufsize); HAL_UART_Receive_IT(SerialDriver[used_ports].Driver->PortHandle, &SerialDriver[used_ports].rxcharb, 1); used_ports++; return &SerialDriver[used_ports - 1]; } else return NULL; } void serial_putc(SerialDriverHandle_t *handle, char c) { static uint8_t ci; while (!fifo_put(&handle->txbuf, c)) // we are blocking until room in FIFO ; if (handle->tx_idle == TRUE) { handle->tx_idle = FALSE; fifo_get(&handle->txbuf, &ci); HAL_UART_Transmit_IT(handle->Driver->PortHandle, (uint8_t*) &ci, 1); } } /******************************************************************** * Serial Iterrupt-Handler ********************************************************************/ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { int i; for (i = 0; (SerialDriver[i].Driver->PortHandle != NULL) && (huart != SerialDriver[i].Driver->PortHandle); i++) ; if (SerialDriver[i].Driver->PortHandle != NULL) { SerialDriver[i].Driver->CharReceived(SerialDriver[i].Driver->Instance, SerialDriver[i].rxcharb); HAL_UART_Receive_IT(SerialDriver[i].Driver->PortHandle, &SerialDriver[i].rxcharb, 1); } } void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) { static uint8_t c; int i; for (i = 0; (SerialDriver[i].Driver->PortHandle != NULL) && (huart != SerialDriver[i].Driver->PortHandle); i++) ; if (SerialDriver[i].Driver->PortHandle != NULL) { if (fifo_get(&SerialDriver[i].txbuf, &c)) { HAL_UART_Transmit_IT(SerialDriver[i].Driver->PortHandle, (uint8_t*) &c, 1); } else SerialDriver[i].tx_idle = TRUE; } }