#include "button.h"
#include "logic.h"
#include "led.h"
#include <stdio.h>



but_no_fix_t but_start;
bool start_pressed = false;

void empty_hendler();


static void but_start_down_handler(void);



//
void but_init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    
    __HAL_RCC_GPIOA_CLK_ENABLE();
        
    GPIO_InitStruct.Pin = GPIO_PIN_4;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    
    but_start.GPIOx             = GPIOA;
    but_start.GPIO_Pin          = GPIO_PIN_4;
    but_start.timeDelay         = 2;
    but_start.pressHandler      = empty_hendler;
    but_start.unpressHandler    = but_start_down_handler;
    but_start.counterActivation = 0;
    but_start.timeActivation    = 40;
    but_start.fActivation       = false;
    
    but_start.stateOld   = but_get_state(&but_start);
    
    // Переключатель "строка/одиночный"
    GPIO_InitStruct.Pin = GPIO_PIN_6;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}


//
void empty_hendler() {}


//
void button_run(void)
{
    bu_no_fix_handler(&but_start);
}


//
void bu_no_fix_handler(but_no_fix_t* button)
{
    uint8_t temp;
  
    if (button->stateNew != BUT_NO_DEFINE)
    {  
        temp = HAL_GPIO_ReadPin(button->GPIOx, button->GPIO_Pin);
    
        if (temp == 0)  // определяем текущее (новое) состояние кнопки        
            button->stateNew = BUT_ON;
        else
            button->stateNew = BUT_OFF;
  
        if (button->stateNew != button->stateOld)  // зафиксирован факт нажатия/отжатия
            button->stateNew = BUT_NO_DEFINE;  // переводим кнопку в неопределенное состояние
    }
    else
    {
        button->counterDelay++;             // запускаем счетчик на задержку
    
        if (button->counterDelay > button->timeDelay)  // задержка закончилась
        {
            button->counterDelay = 0;

            temp = HAL_GPIO_ReadPin(button->GPIOx, button->GPIO_Pin);
   	  
            button->counterActivation = 0;
		
            if (temp == 0)  // определяем текущее (новое) состояние кнопки        
            {  
                button->stateNew = BUT_ON;
                button->unpressHandler();
            }  
            else
            {  
                button->stateNew = BUT_OFF;
                button->pressHandler();
            }
        }
    }
    button->stateOld = button->stateNew;
}


// Возвращает сотояние ключа
BUTTON_STATE_t but_get_state(but_no_fix_t *button)
{
  return (BUTTON_STATE_t)HAL_GPIO_ReadPin(button->GPIOx, button->GPIO_Pin);
}


static void but_start_down_handler(void)
{
    // Режим "одиночный"
    if (but_is_string() == false) {
        logic_single();
    }
    else {
        LED_FREQ_OFF
        logic_string();  
    }
      
    start_pressed = true;
    
    //printf("Button\r\n");
}





//
bool but_is_string(void)
{
    return (bool)HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_6);
}