summaryrefslogtreecommitdiff
path: root/Libraries/Button/button_handler.c
diff options
context:
space:
mode:
Diffstat (limited to 'Libraries/Button/button_handler.c')
-rw-r--r--Libraries/Button/button_handler.c253
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;
+ }
+}
+
+
+
+
+
+
+
+
+
+
+
+
+