button.c 3.2 KB

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