Skip to content

Commit

Permalink
upd
Browse files Browse the repository at this point in the history
  • Loading branch information
GyverLibs committed Dec 20, 2024
1 parent b939c16 commit 6a25cec
Show file tree
Hide file tree
Showing 9 changed files with 287 additions and 81 deletions.
81 changes: 68 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,7 @@
#define EB_HOLD_TIME 600 // таймаут удержания (кнопка)
#define EB_STEP_TIME 200 // таймаут импульсного удержания (кнопка)
#define EB_FAST_TIME 30 // таймаут быстрого поворота (энкодер)
#define EB_TOUT_TIME 1000 // таймаут действия (кнопка и энкодер)
```
<a id="class"></a>
Expand Down Expand Up @@ -190,11 +191,12 @@
| setStepTimeout | ✔ | ✔ | ✔ | ✔ |
| setClickTimeout | ✔ | ✔ | ✔ | ✔ |
| setDebTimeout | ✔ | ✔ | ✔ | ✔ |
| setTimeout | ✔ | ✔ | ✔ | ✔ |
| setBtnLevel | ✔ | ✔ | ✔ | ✔ |
| pressISR | ✔ | ✔ | ✔ | ✔ |
| reset | ✔ | ✔ | ✔ | ✔ |
| clear | ✔ | ✔ | ✔ | ✔ |
| skipEvents | ✔ | ✔ | ✔ | ✔ |
| skipEvents | ✔ | ✔ | ✔ | ✔ |
| attach | ✔ | ✔ | ✔ | ✔ |
| detach | ✔ | ✔ | ✔ | ✔ |
| press | ✔ | ✔ | ✔ | ✔ |
Expand All @@ -213,6 +215,7 @@
| waiting | ✔ | ✔ | ✔ | ✔ |
| busy | ✔ | ✔ | ✔ | ✔ |
| action | ✔ | ✔ | ✔ | ✔ |
| getAction | ✔ | ✔ | ✔ | ✔ |
| timeout | ✔ | ✔ | ✔ | ✔ |
| pressFor | ✔ | ✔ | ✔ | ✔ |
| holdFor | ✔ | ✔ | ✔ | ✔ |
Expand Down Expand Up @@ -243,6 +246,7 @@
| rightH | | | ✔ | ✔ |
| leftH | | | ✔ | ✔ |
| action | | | ✔ | ✔ |
| getAction | | | ✔ | ✔ |
| timeout | | | ✔ | ✔ |
| attach | | | ✔ | ✔ |
| detach | | | ✔ | ✔ |
Expand All @@ -265,6 +269,9 @@ void setClickTimeout(uint16_t tout);
// установить таймаут антидребезга, умолч. 50 (макс. 255 мс)
void setDebTimeout(uint8_t tout);
// установить время таймаута, умолч. 1000 (макс. 4000 мс)
void setTimeout(const uint16_t tout);
// установить уровень кнопки (HIGH - кнопка замыкает VCC, LOW - замыкает GND)
// умолч. HIGH, то есть true - кнопка нажата
void setBtnLevel(bool level);
Expand All @@ -280,7 +287,7 @@ void detach();
void reset();
// принудительно сбросить флаги событий
void clear();
void clear(bool resetTout = false);
// игнорировать все события до отпускания кнопки
void skipEvents();
Expand Down Expand Up @@ -357,10 +364,14 @@ bool busy();
// было действие с кнопки, вернёт код события [событие]
uint16_t action();
EBAction getAction();
// ================== ВРЕМЯ ==================
// после взаимодействия с кнопкой (или энкодером EncButton) прошло указанное время, мс [событие]
bool timeout(uint16_t ms);
// после взаимодействия с кнопкой (или энкодером EncButton) время setTimeout, мс [событие]
bool timeout();
// после взаимодействия с кнопкой (или энкодером EncButton) время setTimeout, мс [состояние]
bool timeoutState();
// время, которое кнопка удерживается (с начала нажатия), мс
uint16_t pressFor();
Expand Down Expand Up @@ -446,7 +457,7 @@ int8_t pollEnc(int8_t state);
void setFastTimeout(uint8_t tout);
// сбросить флаги энкодера и кнопки
void clear();
void clear(bool resetTout = false);
// ==================== ОПРОС ====================
// ЛЮБОЙ поворот энкодера [событие]
Expand All @@ -472,6 +483,7 @@ bool leftH();
// было действие с кнопки или энкодера, вернёт код события [событие]
uint16_t action();
EBAction getAction();
// ==================== ОБРАБОТКА ====================
// обработка в прерывании (только энкодер). Вернёт 0 в покое, 1 или -1 при повороте
Expand Down Expand Up @@ -652,7 +664,7 @@ int8_t readEnc();
- Есть отдельные функции для вызова в прерывании, они имеют суффикс `ISR`, см. документацию ниже
Библиотека обрабатывает сигнал внутри этой функции, результат можно получить из **функций опроса** событий. Они бывают двух типов:
- `[событие]` - функция вернёт `true` однократно при наступлении события. Сбросится после следующего вызова функции обработки (например клик, поворот энкодера)
- `[событие]` - функция вернёт `true` однократно при наступлении события. Сбросится после следующего вызова функции обработки (например клик, поворот энкодера). За исключением события `timeout`
- `[состояние]` - функция возвращает `true`, пока активно это состояние (например кнопка удерживается)
Для простоты восприятия функцию обработки нужно размещать в начале цикла, а опросы делать ниже:
Expand Down Expand Up @@ -800,7 +812,7 @@ void loop() {
- Если кнопка снова нажата - обработка нового клика
- Счётчик кликов `getClicks()` сбрасывается после событий `releaseHold`/`releaseStep`, которые проверяют предварительные клики. В общем обработчике `action()` это события `EB_REL_HOLD_C` или `EB_REL_STEP_C`
- Количество сделанных кликов нужно проверять по событию `hasClicks`, а также можно опросить внутри почти всех событий кнопки, которые идут до `releaseXxx`
- Если ожидается `timeout` - событие timeout с указанным периодом от текущего момента
- Если ожидается `timeout` - событие timeout периодом из `setTimeout`
- Обработка кнопки в прерывании сообщает библиотеке о факте нажатия, вся остальная обработка выполняется штатно в `tick()`

> Отличие `click(n)` от `hasClicks(n)`: `click(n)` вернёт `true` в любом случае при совпадении количества кликов, даже если будет сделано больше кликов. `hasClicks(n)` вернёт `true` только в том случае, если было сделано ровно указанное количество кликов и больше кликов не было!
Expand Down Expand Up @@ -904,20 +916,32 @@ do {
<a id="timeout"></a>

### Timeout
В связанных с кнопкой классах (Button, EncButton) есть функция `timeout(time)` - она однократно вернёт `true`, если после окончания действий с кнопкой/энкодером прошло указанное время. Это можно использовать для сохранения параметров после ввода, например:
В связанных с кнопкой классах (Button, EncButton) есть функция `timeout()` - она однократно вернёт `true`, если после окончания действий с кнопкой/энкодером прошло указанное в `setTimeout` время. Это можно использовать для сохранения параметров после ввода, например:
```cpp
void setup() {
//eb.setTimeout(1500); // умолч. 1000
}
void loop() {
eb.tick();

// ...

if (eb.timeout(2000)) {
// после взаимодействия с энкодером прошло 2 секунды
if (eb.timeout()) {
// после взаимодействия с энкодером прошло 1000 мс
// EEPROM.put(0, settings);
}
}
```

В текущей версии обработка таймаута реализована не очень красиво ради экономии места: системный флаг таймаута активен всё время (`action` будет возвращать событие таймаута), сбрасывается в следующих случаях:

- Вызов `timeout()` - данный метод однократно вернёт `true`, последующие вызовы будут возвращать `false` до нового действия
- Автоматически сбросится после вызова обработчика, если он подключен
- При вызове `clear(true)` - с флагом очистки таймаута
- При вызове `reset()`

Если нужно пробросить опрос таймаута через несколько вызовов - можно использовать `timeoutState()`, но последний вызов должен быть `timeout()`.

<a id="busy"></a>

### Busy
Expand Down Expand Up @@ -955,8 +979,7 @@ void loop() {
- `EB_REL_HOLD_C` - кнопка отпущена после удержания с предв. кликами
- `EB_REL_STEP` - кнопка отпущена после степа
- `EB_REL_STEP_C` - кнопка отпущена после степа с предв. кликами

> Результат функции `action()` сбрасывается после следующего вызова `tick()`, то есть доступен на всей текущей итерации основного цикла
- `EB_TIMEOUT` - прошёл таймаут после нажатия кнопки или поворота энкодера

Полученный код события можно обработать через `switch`:
```cpp
Expand All @@ -971,6 +994,36 @@ switch (eb.action()) {
}
```

Есть аналогичная функция `getAction()`, вернёт то же самое, но с более читаемыми константами (удобно с автодополнением):

- `EBAction::Press`
- `EBAction::Hold`
- `EBAction::Step`
- `EBAction::Release`
- `EBAction::Click`
- `EBAction::Clicks`
- `EBAction::Turn`
- `EBAction::ReleaseHold`
- `EBAction::ReleaseHoldClicks`
- `EBAction::ReleaseStep`
- `EBAction::ReleaseStepClicks`
- `EBAction::Timeout`

Полученный код события можно обработать через `switch`:
```cpp
switch (eb.getAction()) {
case EBAction::Press:
// ...
break;
case EBAction::Hold:
// ...
break;
// ...
}
```

> Результат функций `action()`/`getAction()` сбрасывается после следующего вызова `tick()`, то есть доступен на всей текущей итерации основного цикла
<a id="optimise"></a>

### Оптимизация
Expand All @@ -986,6 +1039,7 @@ switch (eb.action()) {
#define EB_HOLD_TIME 600 // таймаут удержания (кнопка)
#define EB_STEP_TIME 200 // таймаут импульсного удержания (кнопка)
#define EB_FAST_TIME 30 // таймаут быстрого поворота (энкодер)
#define EB_TOUT_TIME 1000 // таймаут действия (кнопка и энкодер)
#include <EncButton.h>
EncButtonT<2, 3, 4> eb;
```
Expand Down Expand Up @@ -1472,6 +1526,7 @@ EncoderT<enc0, enc1> e(mode); // + режим пинов энкодера (у
// #define EB_HOLD_TIME 600 // таймаут удержания (кнопка)
// #define EB_STEP_TIME 200 // таймаут импульсного удержания (кнопка)
// #define EB_FAST_TIME 30 // таймаут быстрого поворота (энкодер)
// #define EB_TOUT_TIME 1000 // таймаут действия (кнопка и энкодер)
#include <EncButton.h>
EncButton eb(2, 3, 4);
Expand Down Expand Up @@ -1546,7 +1601,7 @@ void loop() {
// Serial.println(eb.waiting());
// таймаут
if (eb.timeout(1000)) Serial.println("timeout!");
if (eb.timeout()) Serial.println("timeout!");
// удержание
if (eb.hold()) Serial.println("hold");
Expand Down
6 changes: 3 additions & 3 deletions README_EN.md
Original file line number Diff line number Diff line change
Expand Up @@ -896,8 +896,8 @@ VOID loop () {

// ...

if.timeout (2000)) {
// after interaction with encoder 2 seconds passed
if.timeout ()) {
// after interaction with encoder 1 second passed
// eeprom.put (0, settings);
}
}
Expand Down Expand Up @@ -1516,7 +1516,7 @@ VOID loop () {
// serial.println (eb.waiting ());

// Timesout
if (eb.timeout (1000)) serial.println ("Timeout!");
if (eb.timeout ()) serial.println ("Timeout!");

// Holding
if.hold ()) serial.println ("Hold");
Expand Down
75 changes: 75 additions & 0 deletions examples/callback2/callback2.ino
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
// опрос событий через функцию-обработчик

#include <Arduino.h>
#include <EncButton.h>

EncButton eb(2, 3, 4);

void cb() {
// здесь EB_self - указатель на сам объект

Serial.print("callback: ");
switch (eb.getAction()) {
case EBAction::Press:
Serial.println("press");
break;
case EBAction::Hold:
Serial.println("hold");
break;
case EBAction::Step:
Serial.println("step");
break;
case EBAction::Release:
Serial.print("release. steps: ");
Serial.print(eb.getSteps());
Serial.print(", press for: ");
Serial.print(eb.pressFor());
Serial.print(", hold for: ");
Serial.print(eb.holdFor());
Serial.print(", step for: ");
Serial.println(eb.stepFor());
break;
case EBAction::Click:
Serial.println("click");
break;
case EBAction::Clicks:
Serial.print("clicks ");
Serial.println(eb.getClicks());
break;
case EBAction::Turn:
Serial.print("turn ");
Serial.print(eb.dir());
Serial.print(" ");
Serial.print(eb.fast());
Serial.print(" ");
Serial.println(eb.pressing());
break;
case EBAction::ReleaseHold:
Serial.println("release hold");
break;
case EBAction::ReleaseHoldClicks:
Serial.print("release hold clicks ");
Serial.println(eb.getClicks());
break;
case EBAction::ReleaseStep:
Serial.println("release step");
break;
case EBAction::ReleaseStepClicks:
Serial.print("release step clicks ");
Serial.println(eb.getClicks());
break;
case EBAction::Timeout:
Serial.println("timeout");
break;
default: break;
}
}

void setup() {
Serial.begin(115200);
eb.attach(cb);
}

void loop() {
eb.tick();
}
4 changes: 3 additions & 1 deletion examples/demo/demo.ino
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
// #define EB_HOLD_TIME 600 // таймаут удержания (кнопка)
// #define EB_STEP_TIME 200 // таймаут импульсного удержания (кнопка)
// #define EB_FAST_TIME 30 // таймаут быстрого поворота (энкодер)
// #define EB_TOUT_TIME 1000 // таймаут действия (кнопка и энкодер)

#include <EncButton.h>
EncButton eb(2, 3, 4);
Expand All @@ -25,6 +26,7 @@ void setup() {
eb.setDebTimeout(50);
eb.setHoldTimeout(600);
eb.setStepTimeout(200);
eb.setTimeout(1000);

eb.setEncReverse(0);
eb.setEncType(EB_STEP4_LOW);
Expand Down Expand Up @@ -83,7 +85,7 @@ void loop() {
// Serial.println(eb.waiting());

// таймаут
if (eb.timeout(1000)) Serial.println("timeout!");
if (eb.timeout()) Serial.println("timeout!");

// удержание
if (eb.hold()) Serial.println("hold");
Expand Down
Loading

0 comments on commit 6a25cec

Please sign in to comment.