buttons.c 5.4 KB

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