#include "board_support.h"

#include <stm32h7xx_hal.h>

void leds_init() {
    __HAL_RCC_GPIOC_CLK_ENABLE();

    GPIO_InitTypeDef init;
    init.Mode = GPIO_MODE_OUTPUT_PP;
    init.Pin = GPIO_PIN_2 | GPIO_PIN_3;
    init.Pull = GPIO_NOPULL;
    init.Alternate = 0;
    init.Speed = GPIO_SPEED_LOW;
    HAL_GPIO_Init(GPIOC, &init);

    HAL_GPIO_WritePin(GPIOC, init.Pin, GPIO_PIN_SET);
}

void leds_write(uint8_t idx, bool state) {
    GPIO_TypeDef *gpio;
    uint16_t pin;

    switch (idx) {
    case LEDS_USER1_GREEN:
        gpio = GPIOC;
        pin = GPIO_PIN_3;
        break;
    case LEDS_USER2_RED:
        gpio = GPIOC;
        pin = GPIO_PIN_2;
        break;
    default:
        break;
    }

    HAL_GPIO_WritePin(gpio, pin, state ? GPIO_PIN_SET : GPIO_PIN_RESET);
}

static EXTI_HandleTypeDef hEXTI13;

void btn_init() {
    // pin initialization
    __HAL_RCC_GPIOC_CLK_ENABLE();

    GPIO_InitTypeDef init;
    init.Mode = GPIO_MODE_INPUT;
    init.Pin = GPIO_PIN_13;
    init.Pull = GPIO_NOPULL;
    init.Alternate = 0;
    init.Speed = GPIO_SPEED_LOW;
    HAL_GPIO_Init(GPIOC, &init);

    // EXTI13 initialization
    EXTI_ConfigTypeDef extiConf;
    extiConf.Line = EXTI_LINE_13;
    extiConf.GPIOSel = EXTI_GPIOC;
    extiConf.Trigger = EXTI_TRIGGER_RISING;
    extiConf.Mode = EXTI_MODE_INTERRUPT;
    HAL_EXTI_SetConfigLine(&hEXTI13, &extiConf);

    // enable interrupt source
    HAL_NVIC_SetPriority(EXTI15_10_IRQn, 12, 0); // some medium-low priority
    HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
}

__weak void btn_cb() {
    return;
}

void EXTI15_10_IRQHandler() {
    HAL_EXTI_ClearPending(&hEXTI13, EXTI_TRIGGER_RISING); // clear interrupt
    btn_cb();
}