buttons.c 5.3 KB

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