Skip to content

File syn_uart.c

File List > drivers > syn_uart.c

Go to the documentation of this file

#if __has_include("syn_config.h")
#include "syn_config.h"
#endif

#if !defined(SYN_USE_UART) || SYN_USE_UART

#include "../util/syn_assert.h"
#include "syn_uart.h"

#include <string.h>

/* ── API ────────────────────────────────────────────────────────────────── */

SYN_Status syn_uart_init(SYN_UART *uart, SYN_UARTInstance instance, uint32_t baudrate)
{
    SYN_ASSERT(uart != NULL);

    uart->instance = instance;
    uart->initialized = false;

    syn_ringbuf_init(&uart->tx_rb, uart->tx_buf, sizeof(uart->tx_buf));
    syn_ringbuf_init(&uart->rx_rb, uart->rx_buf, sizeof(uart->rx_buf));

    SYN_Status status = syn_port_uart_init(instance, baudrate);
    if (status != SYN_OK) {
        return status;
    }

    uart->initialized = true;
    return SYN_OK;
}

SYN_Status syn_uart_deinit(SYN_UART *uart)
{
    SYN_ASSERT(uart != NULL);

    if (!uart->initialized) {
        return SYN_OK;
    }

    SYN_Status status = syn_port_uart_deinit(uart->instance);
    uart->initialized = false;
    syn_ringbuf_reset(&uart->tx_rb);
    syn_ringbuf_reset(&uart->rx_rb);

    return status;
}

SYN_Status syn_uart_write_str(const SYN_UART *uart, const char *str, uint32_t timeout_ms)
{
    SYN_ASSERT(uart != NULL);
    SYN_ASSERT(str != NULL);
    SYN_ASSERT(uart->initialized);

    size_t len = strlen(str);
    if (len == 0) {
        return SYN_OK;
    }

    return syn_port_uart_transmit(uart->instance, (const uint8_t *)str, len, timeout_ms);
}

SYN_Status syn_uart_write(const SYN_UART *uart, const uint8_t *data, size_t len,
                          uint32_t timeout_ms)
{
    SYN_ASSERT(uart != NULL);
    SYN_ASSERT(data != NULL || len == 0);
    SYN_ASSERT(uart->initialized);

    if (len == 0) {
        return SYN_OK;
    }

    return syn_port_uart_transmit(uart->instance, data, len, timeout_ms);
}

size_t syn_uart_read(SYN_UART *uart, uint8_t *data, size_t max_len)
{
    SYN_ASSERT(uart != NULL);
    SYN_ASSERT(data != NULL || max_len == 0);

    size_t count = 0;
    while (count < max_len) {
        uint8_t byte;
        if (!syn_ringbuf_get(&uart->rx_rb, &byte)) {
            break;
        }
        data[count++] = byte;
    }
    return count;
}

bool syn_uart_rx_isr_feed(SYN_UART *uart, uint8_t byte)
{
    SYN_ASSERT(uart != NULL);
    return syn_ringbuf_put(&uart->rx_rb, byte);
}

#endif /* SYN_USE_UART */