Пример кода демонстрирует привязку всех событий кнопок к функции common_btn_evt_cb
, которая выводит на печать идентификатор кнопки и её событие, а также количество кликов. В примере показано использование комбинации кнопок.
В коде используется определение событий кнопок, которое не основано на определении Windows, что может быть удобно для встраиваемых устройств. Определены следующие события кнопок:
FLEX_BTN_PRESS_DOWN
— нажатие кнопки;FLEX_BTN_PRESS_CLICK
— одиночный клик;FLEX_BTN_PRESS_DOUBLE_CLICK
— двойной клик;FLEX_BTN_PRESS_REPEAT_CLICK
— серия кликов, количество которых определяется с помощью поля click_cnt
;FLEX_BTN_PRESS_SHORT_START
— начало короткого нажатия;FLEX_BTN_PRESS_SHORT_UP
— завершение короткого нажатия;FLEX_BTN_PRESS_LONG_START
— начало длинного нажатия;FLEX_BTN_PRESS_LONG_UP
— завершение длинного нажатия;FLEX_BTN_PRESS_LONG_HOLD
— длительное удержание кнопки;FLEX_BTN_PRESS_MAX
— максимальное событие;FLEX_BTN_PRESS_NONE
— отсутствие события.Событие FLEX_BTN_PRESS_LONG_HOLD
можно использовать для реализации сценариев с накоплением длительного удержания.
Также в коде представлена структура данных flex_button
, которая включает в себя:
Для использования полей max_multiple_clicks_interval
, debounce_tick
, short_press_start_tick
, long_press_start_tick
и long_hold_start_tick
необходимо использовать макрос **FLEX_MS_TO_SCAN_CNT(ms)**
, который преобразует значение в миллисекундах в счётчик сканирования, так как библиотека кнопок работает на основе этого счётчика. Например:
user_button[1].short_press_start_tick = FLEX_MS_TO_SCAN_CNT(1500); // 1500 毫秒
Это означает, что после нажатия кнопки начинается отсчёт времени. Если через 1500 миллисекунд кнопка всё ещё нажата, то это считается началом короткого нажатия и сообщается событие FLEX_BTN_PRESS_SHORT_START
.
Интерфейс регистрации кнопок flex_button_register
позволяет зарегистрировать пользовательскую кнопку, передавая адрес структуры flex_button_t
.
Функция чтения событий кнопок flex_button_event_read
используется для получения события указанной кнопки.
Основная функция сканирования кнопок flex_button_scan
должна быть включена в приложение с интервалом сканирования около 20 миллисекунд.
Следует избегать использования блокирующих функций и операций с задержкой в функциях обратного вызова событий кнопок и чтения значений кнопок, чтобы избежать блокировки. Также необходимо учитывать требования к стеку функций обратного вызова и чтения значений.
Библиотека кнопок использует непрерывное сканирование для проверки состояния кнопок, что приводит к постоянному использованию ресурсов процессора. Для снижения энергопотребления рекомендуется настроить интервал сканирования (от 5 до 20 мс) и перевести процессор в режим пониженного энергопотребления во время интервала сканирования. Библиотека кнопок не реализует функции энергосбережения на низком уровне, поэтому разработчики должны самостоятельно управлять энергопотреблением, используя один из следующих подходов:
Прерывания могут быть реализованы аппаратно или программно. Аппаратное решение требует использования чипа с логическим элементом «ИЛИ», который объединяет входные условия в одно выходное условие, что позволяет использовать внешние прерывания для обнаружения всех нажатий кнопок. Программное обеспечение
Необходимо настроить каждый ключ в режим прерывания, а затем выполнять сканирование ключа в функции обработки прерываний каждого ключа.
Чтобы уменьшить задержку при выполнении сканирования клавиш в функции обработки прерываний, можно использовать асинхронную обработку через семафоры: в функции обработки прерывания освобождать только один семафор для сканирования клавиши, а в потоке сканирования клавиш отслеживать этот семафор.
Эта библиотека клавиш выполняет только базовую обработку сканирования клавиш, и одно сканирование может определить все состояния клавиш и сообщить о соответствующих событиях нажатия клавиш. Если требуется поддержка комбинированных клавиш, необходимо добавить дополнительный уровень и упаковать необходимые комбинированные клавиши на основе событий, возвращаемых библиотекой клавиш. Пример программы предоставляет простую реализацию.
Независимо от того, как ваша матричная клавиатура получает состояние клавиш, просто подключите функцию чтения состояния клавиш к функции uint8_t (*usr_button_read)(void*)
в структуре данных Flexible_button.
См. обсуждение в issue 2.
Если у вас есть какие-либо проблемы или предложения, пожалуйста, отправьте их на Issue для обсуждения.
— MurphyZhao (https://github.com/murphyzhao)
Спасибо всем друзьям, которые обсуждали вместе, спасибо всем друзьям, использующим flexible_button, спасибо за ваши звёзды и форки, спасибо за вашу поддержку.
— Спасибо BOBBOM за обнаружение логической проблемы в функции flex_button_register. — Спасибо BOBBOM за снятие ограничения на количество клавиш в flexible_button. — Спасибо rt-thread за поддержку. — Спасибо «электронный друг с лихорадкой» за поддержку. — Спасибо «Вейчи электроникс» за поддержку.
— RT-Thread IoT Board (https://github.com/RT-Thread/IoT_Board) — плата разработки.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )