13extern "C" int _write(
int file,
char *ptr,
int len);
53 UART(UART_HandleTypeDef *huart,
size_t rx_queue_size = 64)
54 : huart_{huart}, rx_queue_{rx_queue_size} {
56 std::find(get_instances().begin(), get_instances().end(),
nullptr);
59 TUTRCOS_VERIFY(HAL_UART_Receive_IT(huart_, &rx_buf_, 1) == HAL_OK);
64 auto uart = std::find(get_instances().begin(), get_instances().end(),
this);
69 bool transmit(
const uint8_t *data,
size_t size, uint32_t timeout) {
70 std::lock_guard lock{mtx_};
71 if (HAL_UART_Transmit_IT(huart_, data, size) != HAL_OK) {
75 while (huart_->gState != HAL_UART_STATE_READY) {
77 if (elapsed >= timeout) {
85 bool receive(uint8_t *data,
size_t size, uint32_t timeout) {
86 std::lock_guard lock{mtx_};
88 while (rx_queue_.
size() < size) {
90 if (elapsed >= timeout) {
95 for (
size_t i = 0; i < size; ++i) {
96 rx_queue_.
pop(data[i], 0);
102 std::lock_guard lock{mtx_};
111 UART_HandleTypeDef *huart_;
115 static inline uint8_t rx_buf_;
117 static inline std::array<UART *, 20> &get_instances() {
118 static std::array<UART *, 20> instances{};
122 static inline UART *&get_uart_stdout() {
123 static UART *uart =
nullptr;
127 friend void ::HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
128 friend void ::HAL_UART_AbortCpltCallback(UART_HandleTypeDef *huart);
129 friend int ::_write(
int file,
char *ptr,
int len);
static uint32_t get_ticks()
Definition kernel.hpp:14
bool pop(T &value, uint32_t timeout)
Definition queue.hpp:33
void clear()
Definition queue.hpp:37
size_t size()
Definition queue.hpp:39
static void delay(uint32_t ticks)
Definition thread.hpp:32
void enable_stdout()
Definition uart.hpp:106
~UART()
Definition uart.hpp:62
UART_HandleTypeDef * get_hal_handle()
Definition uart.hpp:108
UART(UART_HandleTypeDef *huart, size_t rx_queue_size=64)
Definition uart.hpp:53
bool receive(uint8_t *data, size_t size, uint32_t timeout)
Definition uart.hpp:85
bool transmit(const uint8_t *data, size_t size, uint32_t timeout)
Definition uart.hpp:69
void flush()
Definition uart.hpp:101
int _write(int file, char *ptr, int len)
#define TUTRCOS_VERIFY(expr)
Definition utility.hpp:16