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


char dado, recebido;

// Função auxiliar para limpar o FIFO de recebimento da UART
void flush_uart(uart_inst_t *uart) {
  while (uart_is_readable(uart)) {
    (void)uart_getc(uart);  // descarta o dado lido
  }
}

int main(void) {
  stdio_init_all();
  sleep_ms(1000);

  // Configura UART0 (TX: GP0, RX: GP1)
  uart_init(uart0, 115200);
  gpio_set_function(0, GPIO_FUNC_UART); // TX UART0
  gpio_set_function(1, GPIO_FUNC_UART); // RX UART0
  
  // Configura UART1 (TX: GP4, RX: GP5)
  uart_init(uart1, 115200);
  gpio_set_function(4, GPIO_FUNC_UART); // TX UART1
  gpio_set_function(5, GPIO_FUNC_UART); // RX UART1
  
  sleep_ms(500); // Tempo necessário para conexão estável

  // Desabilita controle de fluxo de hardware
  uart_set_hw_flow(uart0, false, false);
  uart_set_hw_flow(uart1, false, false);

  // Habilita o FIFO para evitar sobrecarga de buffer
  uart_set_fifo_enabled(uart0, true);
  uart_set_fifo_enabled(uart1, true);

  while (true) {
    // Antes de iniciar a nova iteração, limpa o FIFO das UARTs
    flush_uart(uart0);
    flush_uart(uart1);

    // Lê caractere do console
    printf("\nDigite um caractere: ");
    scanf(" %c", &dado); // Usa scanf() conforme solicitado

    // Envia o dado da UART0 para a UART1
    uart_putc(uart0, dado);
    printf("\nDado enviado: '%c'", dado);
    sleep_ms(1000);  // Pequena pausa antes da próxima iteração

    // Aguarda um dado da UART1 (recebendo o que foi enviado)
    while (!uart_is_readable(uart1)) {
      tight_loop_contents();  // Aguarda sem travar o processador
    }

    // Lê o dado recebido da UART1
    recebido = uart_getc(uart1);
    printf("\nDado recebido: '%c'\n", recebido);
  }

  return 0;
}