123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- #include "button.h"
- #include "logic.h"
- #include "led.h"
- #include <stdio.h>
- but_no_fix_t but_start;
- bool start_pressed = false;
- void empty_hendler();
- static void but_start_down_handler(void);
- //
- void but_init(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct = {0};
-
- __HAL_RCC_GPIOA_CLK_ENABLE();
-
- GPIO_InitStruct.Pin = GPIO_PIN_4;
- GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
- GPIO_InitStruct.Pull = GPIO_PULLUP;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
-
- but_start.GPIOx = GPIOA;
- but_start.GPIO_Pin = GPIO_PIN_4;
- but_start.timeDelay = 2;
- but_start.pressHandler = empty_hendler;
- but_start.unpressHandler = but_start_down_handler;
- but_start.counterActivation = 0;
- but_start.timeActivation = 40;
- but_start.fActivation = false;
-
- but_start.stateOld = but_get_state(&but_start);
-
- // Переключатель "строка/одиночный"
- GPIO_InitStruct.Pin = GPIO_PIN_6;
- GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
- GPIO_InitStruct.Pull = GPIO_PULLUP;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
- }
- //
- void empty_hendler() {}
- //
- void button_run(void)
- {
- bu_no_fix_handler(&but_start);
- }
- //
- void bu_no_fix_handler(but_no_fix_t* button)
- {
- uint8_t temp;
-
- if (button->stateNew != BUT_NO_DEFINE)
- {
- temp = HAL_GPIO_ReadPin(button->GPIOx, button->GPIO_Pin);
-
- if (temp == 0) // определяем текущее (новое) состояние кнопки
- button->stateNew = BUT_ON;
- else
- button->stateNew = BUT_OFF;
-
- if (button->stateNew != button->stateOld) // зафиксирован факт нажатия/отжатия
- button->stateNew = BUT_NO_DEFINE; // переводим кнопку в неопределенное состояние
- }
- else
- {
- button->counterDelay++; // запускаем счетчик на задержку
-
- if (button->counterDelay > button->timeDelay) // задержка закончилась
- {
- button->counterDelay = 0;
- temp = HAL_GPIO_ReadPin(button->GPIOx, button->GPIO_Pin);
-
- button->counterActivation = 0;
-
- if (temp == 0) // определяем текущее (новое) состояние кнопки
- {
- button->stateNew = BUT_ON;
- button->unpressHandler();
- }
- else
- {
- button->stateNew = BUT_OFF;
- button->pressHandler();
- }
- }
- }
- button->stateOld = button->stateNew;
- }
- // Возвращает сотояние ключа
- BUTTON_STATE_t but_get_state(but_no_fix_t *button)
- {
- return (BUTTON_STATE_t)HAL_GPIO_ReadPin(button->GPIOx, button->GPIO_Pin);
- }
- static void but_start_down_handler(void)
- {
- // Режим "одиночный"
- if (but_is_string() == false) {
- logic_single();
- }
- else {
- LED_FREQ_OFF
- logic_string();
- }
-
- start_pressed = true;
-
- //printf("Button\r\n");
- }
- //
- bool but_is_string(void)
- {
- return (bool)HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_6);
- }
|