ESPAsyncButton - асинхронная библиотека для "кнопок" на основе обработки событий

vortigont

★★★★★✩✩
24 Апр 2020
910
489
Saint-Petersburg, Russia
Написал себе библиотеку для кнопок, делюсь.
ESPAsyncButton
Библиотека предназначенна для работы под платформой ESP32 для IDF/Arduino
Принцип работы - регистрация событий, обработка событий.
Библиотека полностью асинхронная, построена на использовании RTOS функций генерации/передачи сообщений между тредами. Предназначена для работы в многопоточных проектах на основе тредов/тасок/очередей и т.п. сценариях.
  • не имеет никаких завязок на ардуино loop()
  • не выполняет опроса пинов, не требует периодического вызова по таймеру, миллисам и пр.
  • не выполняет пользовательский код в обработчиках прерываний
Написана в виде шаблонов классов где функционал генерации событий "кнопки" (обработка изменений состояния пина) отделен от функции обработки сообщений. Т.е. обрабаткой состояния гпио и обработкой логических состояний "кнопки" занимаются разные расширяемые классы.
Например регистрация срабатывания кнопки выполняется по прерыванию, а вызов связанного с "нажатием" коллбека осуществляется из другого треда.

Реализованные функции:
  • обработка состояния гпио по аппаратным прерываниям
  • настраиваемый антидребезг
  • обработка различных логических состояний кнопки
- нажатие/отпуск​
- долгое нажатие/удержание​
- клик (быстрое нажатие/отпуск)​
- автоповтор нажатий по удержанию​
- многократные последовательные быстрые нажатия (мультиклики)​
  • получение информации о количестве последовательных нажатий, выполненных автоповторов
  • возможность обрабатывать связанные события от нескольких кнопок
  • референсный класс реализующий многоуровневые коллбеки в виде "страничного меню" для произвольного числа "кнопок".
  • тесная интеграция с ESP Event Loop Library
  • простой класс для быстрой настроки одиночной кнопки через коллбеки
  • класс псевдо-энкодера на двух тактовых кнопках
- относительный счет "поворотов" (инкремент/декремент)​
- настраиваемый шаг, текущее значение счетчика​
- настраиваемый верхний/нижний предел счетчика​
- функция перескока от минимума к максимуму и обратно​
- автоинкремент/декремент при удержании кнопок​
- прогрессивный инкремент/декремент при многократных нажатиях​

Диаграммы состояний кнопки и примеры использования можно найти в репозитории.

Внимание! При работе с библиотекой желательно иметь представление о том что такое асинхронное многопоточное программирование, базовые принципы работы RTOS. Нужно отдавать себе отчет что библиотека может обрабатывать вашу кнопку в весьма неожиданных "местах" вашего кода, там где вы можете себе меньше всего этого ожидать.
 
Изменено:
  • Лойс +1
Реакции: dina и Геннадий П

Геннадий П

★★★★★★✩
14 Апр 2021
1,837
592
44
На сколько понял, библиотека не привязана к Ардуиновской среде и может использоваться в другой?
 

vortigont

★★★★★✩✩
24 Апр 2020
910
489
Saint-Petersburg, Russia
@Геннадий П, да, верно, специфичный для Ардуино АПИ не используется. Либу можно собрать и спользовать под чистым ESP IDF. CMake файл под ИДФ компонент добавлю позже.
 

vortigont

★★★★★✩✩
24 Апр 2020
910
489
Saint-Petersburg, Russia
Добавлен класс-обертка AsyncEventButton для использования в самых простых случаях где нужна обычная кнопка с коллбеками на разные действия. Очень прост в использовании и при этом наследует все функции базовых классов по настройке таймингов поведения пина и получении информации о числе кликов/автоповторов.
 

vortigont

★★★★★✩✩
24 Апр 2020
910
489
Saint-Petersburg, Russia
Обновление
- относительный счет "поворотов" (инкремент/декремент)
- настраиваемый шаг, текущее значение счетчика
- настраиваемый верхний/нижний предел счетчика
- функция перескока от минимума к максимуму и обратно
- автоинкремент/декремент при удержании кнопок
- прогрессивный инкремент/декремент при многократных нажатиях