#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/uart.h"

#define UART_NUM UART_NUM_0
#define BUF_SIZE 1024

// Funções matemáticas
float soma(float a, float b) { return a + b; }
float subtracao(float a, float b) { return a - b; }
float multiplicacao(float a, float b) { return a * b; }
float divisao(float a, float b) {
    return (b != 0) ? a / b : 0;
}

void calculadora_task(void *pvParameter) {
    uint8_t data[BUF_SIZE];
    while (1) {
        int len = uart_read_bytes(UART_NUM, data, BUF_SIZE - 1, 1000 / portTICK_PERIOD_MS);
        if (len > 0) {
            data[len] = '\0';
            float num1, num2;
            char op;
            if (sscanf((char *)data, "%f %c %f", &num1, &op, &num2) == 3) {
                float resultado = 0;
                switch (op) {
                    case '+': resultado = soma(num1, num2); break;
                    case '-': resultado = subtracao(num1, num2); break;
                    case '*': resultado = multiplicacao(num1, num2); break;
                    case '/': resultado = divisao(num1, num2); break;
                    default:
                        printf("Operador inválido!\n");
                        continue;
                }
                printf("Resultado: %.2f\n", resultado);
            } else {
                printf("Entrada inválida! Formato: <num1> <operador> <num2>\n");
            }
        }
    }
}

void app_main() {
    uart_driver_install(UART_NUM, BUF_SIZE, 0, 0, NULL, 0);
    xTaskCreate(&calculadora_task, "calculadora_task", 4096, NULL, 5, NULL);
}