#include "init.h"
#include "terminal.hpp"
#include "uart.hpp"

using serial_t = uart::Vcp<>;
using terminal_t = Terminal<serial_t>;

static volatile bool g_error = false;

extern "C" void Error_Handler(void)
{
    g_error = true;
}

static inline void initializeHardware()
{
    terminal_t terminal;

    do {
        g_error = false;
        init();
        terminal.init();
        HAL_GPIO_WritePin(RED_LED_GPIO_Port, RED_LED_Pin, g_error ? GPIO_PIN_RESET : GPIO_PIN_SET);
    } while(g_error);

    HAL_GPIO_WritePin(RED_LED_GPIO_Port, RED_LED_Pin, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GREEN_LED_GPIO_Port, GREEN_LED_Pin, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(BLUE_LED_GPIO_Port, BLUE_LED_Pin, GPIO_PIN_RESET);

    HAL_Delay(1000);

    HAL_GPIO_WritePin(RED_LED_GPIO_Port, RED_LED_Pin, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GREEN_LED_GPIO_Port, GREEN_LED_Pin, GPIO_PIN_SET);
    HAL_GPIO_WritePin(BLUE_LED_GPIO_Port, BLUE_LED_Pin, GPIO_PIN_SET);
}

int main()
{
    initializeHardware();

    terminal_t terminal;

    while(true) {
        terminal.callback();
    }

    return 0;
}
