#include "pico/stdlib.h"
#include "hardware/uart.h"
#include <stdio.h>

#define UART0_ID uart0
#define UART0_PINO_TX 0
#define UART0_PINO_RX 1
#define UART1_ID uart1
#define UART1_PINO_TX 4
#define UART1_PINO_RX 5
#define TAXA_BAUD 115200

// Função para limpar buffers de UART
void limpar_buffer_uart(uart_inst_t *uart) {
    while (uart_is_readable(uart)) {
        uart_getc(uart); // Lê e descarta dados residuais
    }
}

int main(void) {
    // Inicializa UART0 e UART1
    uart_init(UART0_ID, TAXA_BAUD);
    gpio_set_function(UART0_PINO_TX, GPIO_FUNC_UART);
    gpio_set_function(UART0_PINO_RX, GPIO_FUNC_UART);

    uart_init(UART1_ID, TAXA_BAUD);
    gpio_set_function(UART1_PINO_TX, GPIO_FUNC_UART);
    gpio_set_function(UART1_PINO_RX, GPIO_FUNC_UART);

    // Inicializa a saída padrão para printf
    stdio_init_all();
    sleep_ms(2000); // Aguarda a inicialização

    // Loop principal
    while (true) {
        char caractere;
        printf("Digite um caractere para transmitir: ");
        scanf(" %c", &caractere);  

        limpar_buffer_uart(UART1_ID); // Limpa buffer UART1 antes de enviar

        uart_putc(UART0_ID, caractere); // Envia o caractere via UART0
        printf("\n");

        // Aguarda o caractere ser recebido na UART1
        while (!uart_is_readable(UART1_ID)) {
            tight_loop_contents(); // Aguardar ativamente
        }

        // Lê e exibe o caractere recebido
        char recebido = uart_getc(UART1_ID);
        printf("Dado recebido da UART1: %c\n", recebido);

        limpar_buffer_uart(UART0_ID); // Limpa buffer UART0 depois de receber
    }

    return 0;
}