| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212 | /********************************* (C) РОТЕК *********************************** * @module  buttons * @file    buttons.c * @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. ******************************************************************************* */#include "stm32f4xx.h"  #include "buttons.h"#include "led.h"#include "settings_api.h"#include "commands_api.h"#include "FreeRTOS.h"#include "task.h"BUTTON_NO_FIX_t defButton;BUTTON_NO_FIX_t setButton;uint8_t DefCounter = 0;uint8_t SetCounter = 0;/**  * @brief    * @retval   */void BUTTON_Init(void) {  defButton.id_pin			  = KEY_DEF;  defButton.timeDelay         = 5;  defButton.pressHandler      = BUTTON_DEF_UpHandler;  defButton.unpressHandler    = BUTTON_DEF_DownHandler;  defButton.counterActivation = 0;  defButton.timeActivation    = 40;  defButton.fActivation       = false;      defButton.stateOld     = BUTTON_GetState(&defButton);  setButton.id_pin			  = MODE_JUMPER;  setButton.timeDelay         = 5;  setButton.pressHandler      = BUTTON_SET_UpHandler;  setButton.unpressHandler    = BUTTON_SET_DownHandler;  setButton.counterActivation = 0;  setButton.timeActivation    = 40;  setButton.fActivation       = false;  setButton.stateOld     = BUTTON_GetState(&setButton);	}/**  * @brief   Возвращает сотояние ключа  */BUTTON_STATE_t BUTTON_GetState(BUTTON_NO_FIX_t *button){  return (BUTTON_STATE_t)gpio_get(button->id_pin);}/**  * @brief  Обработчик кнопки без фиксации. В обработчике реализована защита  *         от дребезга с помощью задержки. Защита срабатывает при нажатии   *         и при отпускании.  * @param *button: указатель на структуру типа BUTTON_NO_FIX  * @retval нет  */void BUTTON_NoFixHandler(BUTTON_NO_FIX_t *button){  uint8_t temp;    if (button->stateNew != BUT_NO_DEFINE)  {      temp = gpio_get(button->id_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 = gpio_get(button->id_pin);   	        button->counterActivation = 0;		      if (temp == 0)  // определяем текущее (новое) состояние кнопки              {          button->stateNew = BUT_ON;        button->unpressHandler();      }        else      {          button->stateNew = BUT_OFF;        button->pressHandler();      }	  	    }  }    button->stateOld = button->stateNew;}/**  * @brief  Обработчик кнопки без фиксации. Кнопка срабатывает через определеное            время нажатия.  * @param *button: указатель на структуру типа BUTTON_NO_FIX  * @retval нет  */void BUTTON_DellayHandler(BUTTON_NO_FIX_t *button){  /* Кнопка нажата. Ведем отсчет времени удержания */  if (gpio_get(button->id_pin) == 0)  // определяем текущее (новое) состояние кнопки  {  	button->counterActivation++;	button->fActivation = false;		/* Кнопка нажата более необходимого времени - начинаем чаще мигать диодом */	if (button->counterActivation > button->timeActivation)	  LED_SetStatusLedFreq(100);  }  /* Кнопку отжата. Если до этого она была нажата нужное время - вызываем хендлер */  else  {	if ((button->counterActivation > button->timeActivation) 	     && button->fActivation == false)	{  	  button->fActivation = true;	  LED_SetStatusLedFreq(1000);	  button->unpressHandler();	}  	else	  button->counterActivation = 0;  }		}/**  * @brief  Опрос кнопок  */void vTaskButtons(void *pvParameters) {  for (;;)   {	BUTTON_DellayHandler(&defButton);	    vTaskDelay(100);  //20  }}/**  * @brief  Хендлер кнопки DEFAULT.  */void BUTTON_DEF_UpHandler(void){    DefCounter++;    LED_Off(LED_INIT_R);	LED_Off(LED_MAJOR_R);	LED_Off(LED_MINOR_R);}/**  * @brief  Хендлер кнопки DEFAULT. Сброс всех настроек, сохранение и перезагрузка  */void BUTTON_DEF_DownHandler(void){	LED_On(LED_INIT_R);	LED_On(LED_MAJOR_R);	LED_On(LED_MINOR_R);    fDefPressed = true;}/**  * @brief  Хендлер кнопки SET.  */void BUTTON_SET_UpHandler(void){   LED_On(LED_INIT_G);	LED_On(LED_MINOR_G);}/**  * @brief  Хендлер кнопки SET  */void BUTTON_SET_DownHandler(void){	SetCounter++;    LED_Off(LED_INIT_G);	LED_Off(LED_MINOR_G);}/********************************* (C) РОТЕК **********************************/
 |