diff options
author | Alexander <trotsenkoa@gmail.com> | 2022-06-29 11:03:02 +0300 |
---|---|---|
committer | Alexander <trotsenkoa@gmail.com> | 2022-06-29 11:03:02 +0300 |
commit | 1702ce6ce430a66bb7af51644b91b7c196e719d9 (patch) | |
tree | 6039acbdf047873d32aaf55969286c5f0d55958f /Libraries/Button/button_handler.c |
Создаю новый репозиторий. Программа для версии NixieClock_v2. Работает, часы тикают. Есть проблема, что скачет вторая сеносрная кнопка (она в другом канале). Поэтому на нее собираюсь сделать антидребезг.
Diffstat (limited to 'Libraries/Button/button_handler.c')
-rw-r--r-- | Libraries/Button/button_handler.c | 253 |
1 files changed, 253 insertions, 0 deletions
diff --git a/Libraries/Button/button_handler.c b/Libraries/Button/button_handler.c new file mode 100644 index 0000000..e25c2c8 --- /dev/null +++ b/Libraries/Button/button_handler.c @@ -0,0 +1,253 @@ +#include "button_handler.h" +#include "ltimers.h" + +#include "nixie_driver_process.h" + +// FreeRTOS includes +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" + +// +// , +// + + +#define TIME_BUTTON_LONG_PRESS 1000 // 3 + + +// +typedef enum { + + BUTTON_STATE_START = 0, + BUTTON_STATE_ONE_BUT_IS_PRESSING_NOW, + BUTTON_STATE_TWO_BUTS_AND_TIMER, + BUTTON_STATE_TWO_BUTS_AFTER_TIMER + +} Button_FSMStates_t; + +// ( , .) +enum { + + BUT_COMB_NONE = 0, + BUT_COMB_BUT1 = 1, + BUT_COMB_BUT2 = 2, + BUT_COMB_BOTH = 3 + +} ; + + +//extern const uint8_t tube_digits [MAX_DIGITS]; +//static uint8_t test_button_bufer[MAX_TUBES] = {TUBE_DIGIT_0}; +//static uint8_t cnt [6] = {0}; + +QueueHandle_t queue_but_comb; + +// - , +// , + + +// ---------------------------------------------------------------------------- +// +// ---------------------------------------------------------------------------- +void ButtonInit ( void ) +{ + queue_but_comb = xQueueCreate ( 1, sizeof (ButtonCombName_t) ); + configASSERT( queue_but_comb ); +} + + +// ---------------------------------------------------------------------------- +// - +// Note: +// , .. +// +// ---------------------------------------------------------------------------- +void Button_ProcessFSM ( void ) +{ + static Button_FSMStates_t state_fsm_button = BUTTON_STATE_START; + static uint8_t still_pushed = 0; + + static uint8_t prev_button_comb; + static uint8_t curr_button_comb; + static ButtonCombName_t msg_but_comb_name; + + switch ( state_fsm_button ) + { + // ------------------------------------------------------------------------- + case BUTTON_STATE_START: + + curr_button_comb = Button_GetCurrButtons(); + + if ( curr_button_comb != BUT_COMB_NONE ) + { + prev_button_comb = curr_button_comb; + state_fsm_button = BUTTON_STATE_ONE_BUT_IS_PRESSING_NOW; + still_pushed = 0; + } + + break; + // ------------------------------------------------------------------------- + case BUTTON_STATE_ONE_BUT_IS_PRESSING_NOW: + // - 1 + // - 2 + // - 3 , () + + curr_button_comb = Button_GetCurrButtons(); + + // , + if ( (curr_button_comb == BUT_COMB_NONE) && (still_pushed == 0) ) + { + // - .: " " + + switch ( prev_button_comb ) + { + case BUT_COMB_BUT1: + +// test_button_bufer[0] == TUBE_DIGIT_9 ? cnt[0] = 0 : cnt[0]++; +// test_button_bufer[0] = tube_digits [cnt[0]]; +// NixieDriver_SendValue ( &test_button_bufer[0] ); + xQueueReceive ( queue_but_comb, &msg_but_comb_name, 0 ); + msg_but_comb_name = BUTTON_SINGLE_FORWARD; + xQueueSend ( queue_but_comb, &msg_but_comb_name, 0 ); + + break; + case BUT_COMB_BUT2: +// test_button_bufer[1] == TUBE_DIGIT_9 ? cnt[1] = 0 : cnt[1]++; +// test_button_bufer[1] = tube_digits [cnt[1]]; +// NixieDriver_SendValue ( &test_button_bufer[0] ); + xQueueReceive ( queue_but_comb, &msg_but_comb_name, 0 ); + msg_but_comb_name = BUTTON_SINGLE_BACKWARD; + xQueueSend ( queue_but_comb, &msg_but_comb_name, 0 ); + + break; + + default: + break; + } + + state_fsm_button = BUTTON_STATE_START; + + return; + } + + if ( (curr_button_comb == BUT_COMB_NONE) && (still_pushed == 1) ) + { + state_fsm_button = BUTTON_STATE_START; + return; + } + + switch ( prev_button_comb ) + { + case BUT_COMB_BUT1: + + if ( curr_button_comb == BUT_COMB_BOTH ) + { + // - .: " " +// test_button_bufer[2] == TUBE_DIGIT_9 ? cnt[2] = 0 : cnt[2]++; +// test_button_bufer[2] = tube_digits [cnt[2]]; +// +// NixieDriver_SendValue ( &test_button_bufer[0] ); + xQueueReceive ( queue_but_comb, &msg_but_comb_name, 0 ); + //msg_but_comb_name = BUTTON_HOLD_FORWARD; + msg_but_comb_name = BUTTON_HOLD_BACKWARD; + xQueueSend ( queue_but_comb, &msg_but_comb_name, 0 ); + + StartLTimer ( LTIMER_BUTTON_LONG_PRESS ); + state_fsm_button = BUTTON_STATE_TWO_BUTS_AND_TIMER; + still_pushed = 1; + } + + break; + + case BUT_COMB_BUT2: + + if ( curr_button_comb == BUT_COMB_BOTH ) + { + // - .: " " +// test_button_bufer[3] == TUBE_DIGIT_9 ? cnt[3] = 0 : cnt[3]++; +// test_button_bufer[3] = tube_digits [cnt[3]]; +// +// NixieDriver_SendValue ( &test_button_bufer[0] ); + xQueueReceive ( queue_but_comb, &msg_but_comb_name, 0 ); + //msg_but_comb_name = BUTTON_HOLD_BACKWARD; + msg_but_comb_name = BUTTON_HOLD_FORWARD; + xQueueSend ( queue_but_comb, &msg_but_comb_name, 0 ); + + StartLTimer ( LTIMER_BUTTON_LONG_PRESS ); + state_fsm_button = BUTTON_STATE_TWO_BUTS_AND_TIMER; + still_pushed = 1; + } + + break; + + default: + state_fsm_button = BUTTON_STATE_START; + break; + } + + break; + + // ------------------------------------------------------------------------- + case BUTTON_STATE_TWO_BUTS_AND_TIMER: + + curr_button_comb = Button_GetCurrButtons(); + + if ( curr_button_comb == BUT_COMB_BOTH ) + { + if ( GetLTimer (LTIMER_BUTTON_LONG_PRESS) == TIME_BUTTON_LONG_PRESS ) + { + // - .: " " +// test_button_bufer[4] == TUBE_DIGIT_9 ? cnt[4] = 0 : cnt[4]++; +// test_button_bufer[4] = tube_digits [cnt[4]]; +// +// NixieDriver_SendValue ( &test_button_bufer[0] ); + xQueueReceive ( queue_but_comb, &msg_but_comb_name, 0 ); + msg_but_comb_name = BUTTON_LONG; + xQueueSend ( queue_but_comb, &msg_but_comb_name, 0 ); + + state_fsm_button = BUTTON_STATE_TWO_BUTS_AFTER_TIMER; + } + } + else + { + prev_button_comb = curr_button_comb; + state_fsm_button = BUTTON_STATE_ONE_BUT_IS_PRESSING_NOW; + } + + break; + + // ------------------------------------------------------------------------- + case BUTTON_STATE_TWO_BUTS_AFTER_TIMER: + + curr_button_comb = Button_GetCurrButtons(); + + if ( curr_button_comb == BUT_COMB_NONE ) + { + state_fsm_button = BUTTON_STATE_START; + } + else if ( curr_button_comb != BUT_COMB_BOTH ) + { + prev_button_comb = curr_button_comb; + state_fsm_button = BUTTON_STATE_ONE_BUT_IS_PRESSING_NOW; + } + + break; + + default: + break; + } +} + + + + + + + + + + + + + |