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