buttons.c 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  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. BUTTON_NO_FIX_t setButton;
  21. uint8_t DefCounter = 0;
  22. uint8_t SetCounter = 0;
  23. /**
  24. * @brief
  25. * @retval
  26. */
  27. void BUTTON_Init(void)
  28. {
  29. defButton.id_pin = KEY_DEF;
  30. defButton.timeDelay = 5;
  31. defButton.pressHandler = BUTTON_DEF_UpHandler;
  32. defButton.unpressHandler = BUTTON_DEF_DownHandler;
  33. defButton.counterActivation = 0;
  34. defButton.timeActivation = 40;
  35. defButton.fActivation = false;
  36. defButton.stateOld = BUTTON_GetState(&defButton);
  37. setButton.id_pin = MODE_JUMPER;
  38. setButton.timeDelay = 5;
  39. setButton.pressHandler = BUTTON_SET_UpHandler;
  40. setButton.unpressHandler = BUTTON_SET_DownHandler;
  41. setButton.counterActivation = 0;
  42. setButton.timeActivation = 40;
  43. setButton.fActivation = false;
  44. setButton.stateOld = BUTTON_GetState(&setButton);
  45. }
  46. /**
  47. * @brief Возвращает сотояние ключа
  48. */
  49. BUTTON_STATE_t BUTTON_GetState(BUTTON_NO_FIX_t *button)
  50. {
  51. return (BUTTON_STATE_t)gpio_get(button->id_pin);
  52. }
  53. /**
  54. * @brief Обработчик кнопки без фиксации. В обработчике реализована защита
  55. * от дребезга с помощью задержки. Защита срабатывает при нажатии
  56. * и при отпускании.
  57. * @param *button: указатель на структуру типа BUTTON_NO_FIX
  58. * @retval нет
  59. */
  60. void BUTTON_NoFixHandler(BUTTON_NO_FIX_t *button)
  61. {
  62. uint8_t temp;
  63. if (button->stateNew != BUT_NO_DEFINE)
  64. {
  65. temp = gpio_get(button->id_pin);
  66. if (temp == 0) // определяем текущее (новое) состояние кнопки
  67. button->stateNew = BUT_ON;
  68. else
  69. button->stateNew = BUT_OFF;
  70. if (button->stateNew != button->stateOld) // зафиксирован факт нажатия/отжатия
  71. button->stateNew = BUT_NO_DEFINE; // переводим кнопку в неопределенное состояние
  72. }
  73. else
  74. {
  75. button->counterDelay++; // запускаем счетчик на задержку
  76. if (button->counterDelay > button->timeDelay) // задержка закончилась
  77. {
  78. button->counterDelay = 0;
  79. temp = gpio_get(button->id_pin);
  80. button->counterActivation = 0;
  81. if (temp == 0) // определяем текущее (новое) состояние кнопки
  82. {
  83. button->stateNew = BUT_ON;
  84. button->unpressHandler();
  85. }
  86. else
  87. {
  88. button->stateNew = BUT_OFF;
  89. button->pressHandler();
  90. }
  91. }
  92. }
  93. button->stateOld = button->stateNew;
  94. }
  95. /**
  96. * @brief Обработчик кнопки без фиксации. Кнопка срабатывает через определеное
  97. время нажатия.
  98. * @param *button: указатель на структуру типа BUTTON_NO_FIX
  99. * @retval нет
  100. */
  101. void BUTTON_DellayHandler(BUTTON_NO_FIX_t *button)
  102. {
  103. /* Кнопка нажата. Ведем отсчет времени удержания */
  104. if (gpio_get(button->id_pin) == 0) // определяем текущее (новое) состояние кнопки
  105. {
  106. button->counterActivation++;
  107. button->fActivation = false;
  108. /* Кнопка нажата более необходимого времени - начинаем чаще мигать диодом */
  109. if (button->counterActivation > button->timeActivation)
  110. LED_SetStatusLedFreq(100);
  111. }
  112. /* Кнопку отжата. Если до этого она была нажата нужное время - вызываем хендлер */
  113. else
  114. {
  115. if ((button->counterActivation > button->timeActivation)
  116. && button->fActivation == false)
  117. {
  118. button->fActivation = true;
  119. LED_SetStatusLedFreq(1000);
  120. button->unpressHandler();
  121. }
  122. else
  123. button->counterActivation = 0;
  124. }
  125. }
  126. /**
  127. * @brief Опрос кнопок
  128. */
  129. void vTaskButtons(void *pvParameters)
  130. {
  131. for (;;)
  132. {
  133. BUTTON_DellayHandler(&defButton);
  134. vTaskDelay(100); //20
  135. }
  136. }
  137. /**
  138. * @brief Хендлер кнопки DEFAULT.
  139. */
  140. void BUTTON_DEF_UpHandler(void)
  141. {
  142. DefCounter++;
  143. #ifdef LED_INIT_ERR
  144. LED_Off(LED_INIT_ERR);
  145. #endif
  146. #ifdef LED_ALARM
  147. LED_Off(LED_ALARM);
  148. #endif
  149. #ifdef LED_RED_MINOR
  150. LED_Off(LED_RED_MINOR);
  151. #endif
  152. }
  153. /**
  154. * @brief Хендлер кнопки DEFAULT. Сброс всех настроек, сохранение и перезагрузка
  155. */
  156. void BUTTON_DEF_DownHandler(void)
  157. {
  158. #ifdef LED_INIT_ERR
  159. LED_On(LED_INIT_ERR);
  160. #endif
  161. #ifdef LED_ALARM
  162. LED_On(LED_ALARM);
  163. #endif
  164. #ifdef LED_RED_MINOR
  165. LED_On(LED_RED_MINOR);
  166. #endif
  167. fDefPressed = true;
  168. }
  169. /**
  170. * @brief Хендлер кнопки SET.
  171. */
  172. void BUTTON_SET_UpHandler(void)
  173. {
  174. #ifdef LED_INIT_OK
  175. LED_On(LED_INIT_OK);
  176. #endif
  177. #ifdef LED_GREEN_MINOR
  178. LED_On(LED_GREEN_MINOR);
  179. #endif
  180. }
  181. /**
  182. * @brief Хендлер кнопки SET
  183. */
  184. void BUTTON_SET_DownHandler(void)
  185. {
  186. SetCounter++;
  187. #ifdef LED_INIT_OK
  188. LED_Off(LED_INIT_OK);
  189. #endif
  190. #ifdef LED_GREEN_MINOR
  191. LED_Off(LED_GREEN_MINOR);
  192. #endif
  193. }
  194. /********************************* (C) РОТЕК **********************************/