button.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. #include "button.h"
  2. #include "logic.h"
  3. #include "led.h"
  4. #include <stdio.h>
  5. but_no_fix_t but_start;
  6. bool start_pressed = false;
  7. void empty_hendler();
  8. static void but_start_down_handler(void);
  9. //
  10. void but_init(void)
  11. {
  12. GPIO_InitTypeDef GPIO_InitStruct = {0};
  13. __HAL_RCC_GPIOA_CLK_ENABLE();
  14. GPIO_InitStruct.Pin = GPIO_PIN_4;
  15. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  16. GPIO_InitStruct.Pull = GPIO_PULLUP;
  17. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  18. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  19. but_start.GPIOx = GPIOA;
  20. but_start.GPIO_Pin = GPIO_PIN_4;
  21. but_start.timeDelay = 2;
  22. but_start.pressHandler = empty_hendler;
  23. but_start.unpressHandler = but_start_down_handler;
  24. but_start.counterActivation = 0;
  25. but_start.timeActivation = 40;
  26. but_start.fActivation = false;
  27. but_start.stateOld = but_get_state(&but_start);
  28. // Переключатель "строка/одиночный"
  29. GPIO_InitStruct.Pin = GPIO_PIN_6;
  30. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  31. GPIO_InitStruct.Pull = GPIO_PULLUP;
  32. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  33. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  34. }
  35. //
  36. void empty_hendler() {}
  37. //
  38. void button_run(void)
  39. {
  40. bu_no_fix_handler(&but_start);
  41. }
  42. //
  43. void bu_no_fix_handler(but_no_fix_t* button)
  44. {
  45. uint8_t temp;
  46. if (button->stateNew != BUT_NO_DEFINE)
  47. {
  48. temp = HAL_GPIO_ReadPin(button->GPIOx, button->GPIO_Pin);
  49. if (temp == 0) // определяем текущее (новое) состояние кнопки
  50. button->stateNew = BUT_ON;
  51. else
  52. button->stateNew = BUT_OFF;
  53. if (button->stateNew != button->stateOld) // зафиксирован факт нажатия/отжатия
  54. button->stateNew = BUT_NO_DEFINE; // переводим кнопку в неопределенное состояние
  55. }
  56. else
  57. {
  58. button->counterDelay++; // запускаем счетчик на задержку
  59. if (button->counterDelay > button->timeDelay) // задержка закончилась
  60. {
  61. button->counterDelay = 0;
  62. temp = HAL_GPIO_ReadPin(button->GPIOx, button->GPIO_Pin);
  63. button->counterActivation = 0;
  64. if (temp == 0) // определяем текущее (новое) состояние кнопки
  65. {
  66. button->stateNew = BUT_ON;
  67. button->unpressHandler();
  68. }
  69. else
  70. {
  71. button->stateNew = BUT_OFF;
  72. button->pressHandler();
  73. }
  74. }
  75. }
  76. button->stateOld = button->stateNew;
  77. }
  78. // Возвращает сотояние ключа
  79. BUTTON_STATE_t but_get_state(but_no_fix_t *button)
  80. {
  81. return (BUTTON_STATE_t)HAL_GPIO_ReadPin(button->GPIOx, button->GPIO_Pin);
  82. }
  83. static void but_start_down_handler(void)
  84. {
  85. // Режим "одиночный"
  86. if (but_is_string() == false) {
  87. logic_single();
  88. }
  89. else {
  90. LED_FREQ_OFF
  91. logic_string();
  92. }
  93. start_pressed = true;
  94. //printf("Button\r\n");
  95. }
  96. //
  97. bool but_is_string(void)
  98. {
  99. return (bool)HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_6);
  100. }