#include "stm32f0xx_hal.h"
#include "gpio.h"


#define SET_OUT_1   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET)
#define SET_OUT_2   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET)
#define SET_OUT_3   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_SET)
#define SET_OUT_4   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_SET)

#define RESET_OUT_1   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET)
#define RESET_OUT_2   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET)
#define RESET_OUT_3   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_RESET)
#define RESET_OUT_4   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_RESET)


static uint8_t next_out_number = 0;
static uint8_t current_out_number = 0;



//
void gpio_init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOB_CLK_ENABLE();
    
    GPIO_InitStruct.Pin = GPIO_PIN_12;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_PULLDOWN;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    
    GPIO_InitStruct.Pin = GPIO_PIN_12;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    // GPIO_PIN_5 - инфракрасный LED
    GPIO_InitStruct.Pin = GPIO_PIN_1 | GPIO_PIN_3 | GPIO_PIN_4;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1 | GPIO_PIN_3 | GPIO_PIN_4, GPIO_PIN_RESET);
}


//
void gpio_set_output(bool state)
{
    if (state == true) 
    {
        current_out_number = next_out_number;
      
        switch (next_out_number)
        {
            case 0:
                SET_OUT_1;
            break;
        
            case 1:
                SET_OUT_2;
            break;
        
            case 2:
                SET_OUT_3;
            break;
        
            case 3:
                SET_OUT_4;
            break;
        
            default : break;
        }
        
        // При включении переключаемся на следующий выход
        if (state == true)
            next_out_number = next_out_number == 3 ? 0 : next_out_number + 1;
    }
    else
    {
        switch (current_out_number)
        {
            case 0:
                RESET_OUT_1;
            break;
        
            case 1:
                RESET_OUT_2;
            break;
        
            case 2:
                RESET_OUT_3;
            break;
        
            case 3:
                RESET_OUT_4;
            break;
        
            default : break;
        }
    }
    
    
}



#if 0
//
void led_togle(void)
{
    HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_1);
}


// Индикация нажатия курка
void led_signal_on(void)
{
    HAL_GPIO_WritePin(GPIOF, GPIO_PIN_1, GPIO_PIN_RESET);
}


// Индикация нажатия курка
void led_signal_off(void)
{
    HAL_GPIO_WritePin(GPIOF, GPIO_PIN_1, GPIO_PIN_SET);
}


// Инфракрасный диод
void led_inf_on(void)
{
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
}


// Инфракрасный диод
void led_inf_off(void)
{
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
}


// Индикация напряжения АКБ
void led_but_on(void)
{
    HAL_GPIO_WritePin(GPIOF, GPIO_PIN_0, GPIO_PIN_RESET);
}


// Индикация напряжения АКБ
void led_but_toggle(void)
{
    HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_0);
}
#endif