#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; } }