1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/RT-Thread-Mirror-FlexibleButton

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Пример кода демонстрирует привязку всех событий кнопок к функции 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, которая включает в себя:

  1. Указатель на следующий элемент списка.
  2. Функцию чтения пользовательских кнопок.
  3. Обработчик событий.
  4. Счётчик сканирования.
  5. Количество кликов.
  6. Максимальное количество интервалов между кликами.
  7. Время устранения дребезга контактов.
  8. Начало короткого нажатия.
  9. Начало длинного нажатия.
  10. Начало длительного удержания.
  11. Идентификатор кнопки.
  12. Логический уровень нажатия кнопки.
  13. Текущее событие кнопки.
  14. Статус кнопки.

Для использования полей 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 мс) и перевести процессор в режим пониженного энергопотребления во время интервала сканирования. Библиотека кнопок не реализует функции энергосбережения на низком уровне, поэтому разработчики должны самостоятельно управлять энергопотреблением, используя один из следующих подходов:

  1. Приостановить сканирование перед переходом в режим низкого энергопотребления и возобновить его после выхода из режима.
  2. Использовать прерывания для каждой кнопки, вызывая сканирование при каждом прерывании.

Прерывания могут быть реализованы аппаратно или программно. Аппаратное решение требует использования чипа с логическим элементом «ИЛИ», который объединяет входные условия в одно выходное условие, что позволяет использовать внешние прерывания для обнаружения всех нажатий кнопок. Программное обеспечение

Необходимо настроить каждый ключ в режим прерывания, а затем выполнять сканирование ключа в функции обработки прерываний каждого ключа.

Чтобы уменьшить задержку при выполнении сканирования клавиш в функции обработки прерываний, можно использовать асинхронную обработку через семафоры: в функции обработки прерывания освобождать только один семафор для сканирования клавиши, а в потоке сканирования клавиш отслеживать этот семафор.

О комбинированных клавишах

Эта библиотека клавиш выполняет только базовую обработку сканирования клавиш, и одно сканирование может определить все состояния клавиш и сообщить о соответствующих событиях нажатия клавиш. Если требуется поддержка комбинированных клавиш, необходимо добавить дополнительный уровень и упаковать необходимые комбинированные клавиши на основе событий, возвращаемых библиотекой клавиш. Пример программы предоставляет простую реализацию.

О матричной клавиатуре

Независимо от того, как ваша матричная клавиатура получает состояние клавиш, просто подключите функцию чтения состояния клавиш к функции 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 )

Вы можете оставить комментарий после Вход в систему

Введение

FlexibleButton — это компактная и гибкая библиотека обработки кнопок, написанная на стандартном языке C. Поддерживает одиночное нажатие, двойное нажатие, короткое нажатие, длинное нажатие и автоотмену двойного нажатия. Можно свободно устанавливать комбинации клавиш. Может использоваться в сценариях прерывания и с низким энергопотреблением. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/RT-Thread-Mirror-FlexibleButton.git
git@api.gitlife.ru:oschina-mirror/RT-Thread-Mirror-FlexibleButton.git
oschina-mirror
RT-Thread-Mirror-FlexibleButton
RT-Thread-Mirror-FlexibleButton
master