/******************************* (C) LiteMesh **********************************
 * @module  buttons
 * @file    buttons.h
 * @version 1.0.0
 * @date    XX.XX.XXXX
 * $brief   buttons
 *******************************************************************************
 * @history     Version  Author         Comment
 * XX.XX.XXXX   1.0.0    Telenkov D.A.  First release.
 *******************************************************************************
 */

/* Define to prevent recursive  ----------------------------------------------*/
#ifndef BUTTONS_H
#define BUTTONS_H

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

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

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

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

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

/**
  * @brief  Опрос кнопок
  */
void vTaskButtons(void *pvParameters);

/**
  * @brief  Заглушка
  */
void BUTTON_VoidHandler(void);

/**
  * @brief  Хендлер кнопки DEFAULT
  */
void BUTTON_DEF_DownHandler(void);

/**
  * @brief  Хендлер кнопки SET
  */
void BUTTON_SET_DownHandler(void);

#endif /* #ifndef BUTTONS_H */

/****************************** (C) LiteMesh ***************** end of file ****/
