buttons.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. /********************************* (C) РОТЕК ***********************************
  2. * @module buttons
  3. * @file buttons.c
  4. * @version 1.0.0
  5. * @date XX.XX.XXXX
  6. * $brief buttons
  7. *******************************************************************************
  8. * @history Version Author Comment
  9. * XX.XX.XXXX 1.0.0 Telenkov D.A. First release.
  10. *******************************************************************************
  11. */
  12. #include "stm32f4xx.h"
  13. #include "buttons.h"
  14. #include "led.h"
  15. #include "settings_api.h"
  16. #include "commands_api.h"
  17. #include "FreeRTOS.h"
  18. #include "task.h"
  19. BUTTON_NO_FIX_t defButton;
  20. uint8_t DefCounter = 0;
  21. /**
  22. * @brief
  23. * @retval
  24. */
  25. void BUTTON_Init(void)
  26. {
  27. defButton.id_pin = KEY_DEF;
  28. defButton.timeDelay = 5;
  29. defButton.pressHandler = BUTTON_DEF_UpHandler;
  30. defButton.unpressHandler = BUTTON_DEF_DownHandler;
  31. defButton.counterActivation = 0;
  32. defButton.timeActivation = 40;
  33. defButton.fActivation = false;
  34. defButton.stateOld = BUTTON_GetState(&defButton);
  35. }
  36. /**
  37. * @brief Возвращает сотояние ключа
  38. */
  39. BUTTON_STATE_t BUTTON_GetState(BUTTON_NO_FIX_t *button)
  40. {
  41. return (BUTTON_STATE_t)gpio_get(button->id_pin);
  42. }
  43. /**
  44. * @brief Обработчик кнопки без фиксации. В обработчике реализована защита
  45. * от дребезга с помощью задержки. Защита срабатывает при нажатии
  46. * и при отпускании.
  47. * @param *button: указатель на структуру типа BUTTON_NO_FIX
  48. * @retval нет
  49. */
  50. void BUTTON_NoFixHandler(BUTTON_NO_FIX_t *button)
  51. {
  52. uint8_t temp;
  53. if (button->stateNew != BUT_NO_DEFINE)
  54. {
  55. temp = gpio_get(button->id_pin);
  56. if (temp == 0) // определяем текущее (новое) состояние кнопки
  57. button->stateNew = BUT_ON;
  58. else
  59. button->stateNew = BUT_OFF;
  60. if (button->stateNew != button->stateOld) // зафиксирован факт нажатия/отжатия
  61. button->stateNew = BUT_NO_DEFINE; // переводим кнопку в неопределенное состояние
  62. }
  63. else
  64. {
  65. button->counterDelay++; // запускаем счетчик на задержку
  66. if (button->counterDelay > button->timeDelay) // задержка закончилась
  67. {
  68. button->counterDelay = 0;
  69. temp = gpio_get(button->id_pin);
  70. button->counterActivation = 0;
  71. if (temp == 0) // определяем текущее (новое) состояние кнопки
  72. {
  73. button->stateNew = BUT_ON;
  74. button->unpressHandler();
  75. }
  76. else
  77. {
  78. button->stateNew = BUT_OFF;
  79. button->pressHandler();
  80. }
  81. }
  82. }
  83. button->stateOld = button->stateNew;
  84. }
  85. /**
  86. * @brief Обработчик кнопки без фиксации. Кнопка срабатывает через определеное
  87. время нажатия.
  88. * @param *button: указатель на структуру типа BUTTON_NO_FIX
  89. * @retval нет
  90. */
  91. void BUTTON_DellayHandler(BUTTON_NO_FIX_t *button)
  92. {
  93. /* Кнопка нажата. Ведем отсчет времени удержания */
  94. if (gpio_get(button->id_pin) == 0) // определяем текущее (новое) состояние кнопки
  95. {
  96. button->counterActivation++;
  97. button->fActivation = false;
  98. /* Кнопка нажата более необходимого времени - начинаем чаще мигать диодом */
  99. if (button->counterActivation > button->timeActivation)
  100. LED_SetStatusLedFreq(100);
  101. }
  102. /* Кнопку отжата. Если до этого она была нажата нужное время - вызываем хендлер */
  103. else
  104. {
  105. if ((button->counterActivation > button->timeActivation)
  106. && button->fActivation == false)
  107. {
  108. button->fActivation = true;
  109. LED_SetStatusLedFreq(1000);
  110. button->unpressHandler();
  111. }
  112. else
  113. button->counterActivation = 0;
  114. }
  115. }
  116. /**
  117. * @brief Опрос кнопок
  118. */
  119. void vTaskButtons(void *pvParameters)
  120. {
  121. for (;;)
  122. {
  123. BUTTON_DellayHandler(&defButton);
  124. vTaskDelay(100); //20
  125. }
  126. }
  127. /**
  128. * @brief Хендлер кнопки DEFAULT.
  129. */
  130. void BUTTON_DEF_UpHandler(void)
  131. {
  132. DefCounter++;
  133. LED_Off(LED_INIT_R);
  134. LED_Off(LED_MAJOR_R);
  135. LED_Off(LED_MINOR_R);
  136. }
  137. /**
  138. * @brief Хендлер кнопки DEFAULT. Сброс всех настроек, сохранение и перезагрузка
  139. */
  140. void BUTTON_DEF_DownHandler(void)
  141. {
  142. LED_On(LED_INIT_R);
  143. LED_On(LED_MAJOR_R);
  144. LED_On(LED_MINOR_R);
  145. fDefPressed = true;
  146. }
  147. /**
  148. * @brief Хендлер кнопки SET. Переход в bootloader
  149. */
  150. void BUTTON_SET_DownHandler(void)
  151. {
  152. //HTTP_StartResetTask(true);
  153. }
  154. /********************************* (C) РОТЕК **********************************/