#ifndef __BUTTONS_H
#define __BUTTONS_H

#include "at32f403a_407.h"
#include <stdbool.h>


// Кнопки
typedef enum 
{  
  BUT_RESET = 0,
  BUT_SET,

} BUTTON_t;


// Статус кнопки
typedef enum 
{  
  BUT_ON = 0,
  BUT_OFF,
  BUT_NO_DEFINE,
  
} BUTTON_STATE_t;


// Структура параметров объекта Button
typedef struct 
{  
  gpio_type         *port;          // Порт
  uint32_t 			pin;            // Пин
  uint16_t          timeDelay;      // Время задержки антидребезга (время измеряется
                                    // во временных интервалах с которыми вызывается
                                    // обработчик кнопки
  uint16_t          counterDelay;   // Счетчик антидребезга
  BUTTON_STATE_t    stateOld;       // Прошлое состояние кнопки
  BUTTON_STATE_t    stateNew;       // Текущее состояние кнопки
  void              (*pressHandler)();   // Обработчик нажатия кнопки
  void              (*unpressHandler)(uint8_t btn); // Обработчик отпускания кнопки
  uint8_t           ID;             // уникальный идентификатор (можно не использовать)
  uint32_t          counterActivation;
  uint16_t          timeActivation_1;
  uint16_t          timeActivation_2;
  bool              fActivation;
} BUTTON_NO_FIX_t; 


//
void button_init(void);
   
/**
  * @brief   Возвращает сотояние ключа
  * @retval  1 - линия разомкнута
  *          0 - линия замкнута
  */
BUTTON_STATE_t BUTTON_GetState(BUTTON_NO_FIX_t *button);

bool BUTTON_GetStateInt(BUTTON_t button);

/**
  * @brief  Обработчик кнопки без фиксации. В обработчике реализована защита
  *         от дребезга с помощью задержки. Защита срабатывает при нажатии 
  *         и при отпускании.
  * @param *button: указатель на структуру типа BUTTON_NO_FIX
  * @retval нет
  */
void BUTTON_NoFixHandler(BUTTON_NO_FIX_t *button);

// Опрос кнопок
void button_task(void *params);

// Заглушки
void void_handler(void);
void void_handler_btn(uint8_t btn);

//
void reset_handler(void);

//
void set_handler(uint8_t btn);

#endif /* #ifndef __BUTTONS_H */
