buttons.c 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  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 "web_params_api.h"
  17. #include "FreeRTOS.h"
  18. #include "task.h"
  19. BUTTON_NO_FIX_t defButton;
  20. /**
  21. * @brief
  22. * @retval
  23. */
  24. void BUTTON_Init(void)
  25. {
  26. defButton.id_pin = KEY_DEF;
  27. defButton.timeDelay = 5;
  28. defButton.pressHandler = BUTTON_VoidHandler;
  29. defButton.unpressHandler = BUTTON_DEF_DownHandler;
  30. defButton.counterActivation = 0;
  31. defButton.timeActivation = 40;
  32. defButton.fActivation = false;
  33. defButton.stateOld = BUTTON_GetState(&defButton);
  34. }
  35. /**
  36. * @brief Возвращает сотояние ключа
  37. */
  38. BUTTON_STATE_t BUTTON_GetState(BUTTON_NO_FIX_t *button)
  39. {
  40. return (BUTTON_STATE_t)gpio_get(button->id_pin);
  41. }
  42. /**
  43. * @brief Обработчик кнопки без фиксации. В обработчике реализована защита
  44. * от дребезга с помощью задержки. Защита срабатывает при нажатии
  45. * и при отпускании.
  46. * @param *button: указатель на структуру типа BUTTON_NO_FIX
  47. * @retval нет
  48. */
  49. void BUTTON_NoFixHandler(BUTTON_NO_FIX_t *button)
  50. {
  51. uint8_t temp;
  52. if (button->stateNew != BUT_NO_DEFINE)
  53. {
  54. temp = gpio_get(button->id_pin);
  55. if (temp == 0) // определяем текущее (новое) состояние кнопки
  56. button->stateNew = BUT_ON;
  57. else
  58. button->stateNew = BUT_OFF;
  59. if (button->stateNew != button->stateOld) // зафиксирован факт нажатия/отжатия
  60. button->stateNew = BUT_NO_DEFINE; // переводим кнопку в неопределенное состояние
  61. }
  62. else
  63. {
  64. button->counterDelay++; // запускаем счетчик на задержку
  65. if (button->counterDelay > button->timeDelay) // задержка закончилась
  66. {
  67. button->counterDelay = 0;
  68. temp = gpio_get(button->id_pin);
  69. button->counterActivation = 0;
  70. if (temp == 0) // определяем текущее (новое) состояние кнопки
  71. {
  72. button->stateNew = BUT_ON;
  73. button->unpressHandler();
  74. }
  75. else
  76. {
  77. button->stateNew = BUT_OFF;
  78. button->pressHandler();
  79. }
  80. }
  81. }
  82. button->stateOld = button->stateNew;
  83. }
  84. /**
  85. * @brief Обработчик кнопки без фиксации. Кнопка срабатывает через определеное
  86. время нажатия.
  87. * @param *button: указатель на структуру типа BUTTON_NO_FIX
  88. * @retval нет
  89. */
  90. void BUTTON_DellayHandler(BUTTON_NO_FIX_t *button)
  91. {
  92. /* Кнопка нажата. Ведем отсчет времени удержания */
  93. if (gpio_get(button->id_pin) == 0) // определяем текущее (новое) состояние кнопки
  94. {
  95. button->counterActivation++;
  96. button->fActivation = false;
  97. /* Кнопка нажата более необходимого времени - начинаем чаще мигать диодом */
  98. if (button->counterActivation > button->timeActivation)
  99. LED_SetStatusLedFreq(100);
  100. }
  101. /* Кнопку отжата. Если до этого она была нажата нужное время - вызываем хендлер */
  102. else
  103. {
  104. if ((button->counterActivation > button->timeActivation)
  105. && button->fActivation == false)
  106. {
  107. button->fActivation = true;
  108. LED_SetStatusLedFreq(1000);
  109. button->unpressHandler();
  110. }
  111. else
  112. button->counterActivation = 0;
  113. }
  114. }
  115. /**
  116. * @brief Опрос кнопок
  117. */
  118. void vTaskButtons(void *pvParameters)
  119. {
  120. for (;;)
  121. {
  122. BUTTON_DellayHandler(&defButton);
  123. vTaskDelay(100); //20
  124. }
  125. }
  126. /**
  127. * @brief Заглушка
  128. */
  129. void BUTTON_VoidHandler(void)
  130. {
  131. }
  132. /**
  133. * @brief Хендлер кнопки DEFAULT. Сброс всех настроек, сохранение и перезагрузка
  134. */
  135. void BUTTON_DEF_DownHandler(void)
  136. {
  137. //taskENTER_CRITICAL();
  138. SETTINGS_SetDefaultDebug();
  139. SETTINGS_Save();
  140. vTaskDelay(1010);
  141. NVIC_SystemReset();
  142. //taskEXIT_CRITICAL();
  143. }
  144. /**
  145. * @brief Хендлер кнопки SET. Переход в bootloader
  146. */
  147. void BUTTON_SET_DownHandler(void)
  148. {
  149. HTTP_StartResetTask(true);
  150. }
  151. /********************************* (C) РОТЕК **********************************/