Skip to content

Commit 6a25cec

Browse files
committed
upd
1 parent b939c16 commit 6a25cec

File tree

9 files changed

+287
-81
lines changed

9 files changed

+287
-81
lines changed

README.md

Lines changed: 68 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@
155155
#define EB_HOLD_TIME 600 // таймаут удержания (кнопка)
156156
#define EB_STEP_TIME 200 // таймаут импульсного удержания (кнопка)
157157
#define EB_FAST_TIME 30 // таймаут быстрого поворота (энкодер)
158+
#define EB_TOUT_TIME 1000 // таймаут действия (кнопка и энкодер)
158159
```
159160
160161
<a id="class"></a>
@@ -190,11 +191,12 @@
190191
| setStepTimeout | ✔ | ✔ | ✔ | ✔ |
191192
| setClickTimeout | ✔ | ✔ | ✔ | ✔ |
192193
| setDebTimeout | ✔ | ✔ | ✔ | ✔ |
194+
| setTimeout | ✔ | ✔ | ✔ | ✔ |
193195
| setBtnLevel | ✔ | ✔ | ✔ | ✔ |
194196
| pressISR | ✔ | ✔ | ✔ | ✔ |
195197
| reset | ✔ | ✔ | ✔ | ✔ |
196198
| clear | ✔ | ✔ | ✔ | ✔ |
197-
| skipEvents | ✔ | ✔ | ✔ | ✔ |
199+
| skipEvents | ✔ | ✔ | ✔ | ✔ |
198200
| attach | ✔ | ✔ | ✔ | ✔ |
199201
| detach | ✔ | ✔ | ✔ | ✔ |
200202
| press | ✔ | ✔ | ✔ | ✔ |
@@ -213,6 +215,7 @@
213215
| waiting | ✔ | ✔ | ✔ | ✔ |
214216
| busy | ✔ | ✔ | ✔ | ✔ |
215217
| action | ✔ | ✔ | ✔ | ✔ |
218+
| getAction | ✔ | ✔ | ✔ | ✔ |
216219
| timeout | ✔ | ✔ | ✔ | ✔ |
217220
| pressFor | ✔ | ✔ | ✔ | ✔ |
218221
| holdFor | ✔ | ✔ | ✔ | ✔ |
@@ -243,6 +246,7 @@
243246
| rightH | | | ✔ | ✔ |
244247
| leftH | | | ✔ | ✔ |
245248
| action | | | ✔ | ✔ |
249+
| getAction | | | ✔ | ✔ |
246250
| timeout | | | ✔ | ✔ |
247251
| attach | | | ✔ | ✔ |
248252
| detach | | | ✔ | ✔ |
@@ -265,6 +269,9 @@ void setClickTimeout(uint16_t tout);
265269
// установить таймаут антидребезга, умолч. 50 (макс. 255 мс)
266270
void setDebTimeout(uint8_t tout);
267271
272+
// установить время таймаута, умолч. 1000 (макс. 4000 мс)
273+
void setTimeout(const uint16_t tout);
274+
268275
// установить уровень кнопки (HIGH - кнопка замыкает VCC, LOW - замыкает GND)
269276
// умолч. HIGH, то есть true - кнопка нажата
270277
void setBtnLevel(bool level);
@@ -280,7 +287,7 @@ void detach();
280287
void reset();
281288
282289
// принудительно сбросить флаги событий
283-
void clear();
290+
void clear(bool resetTout = false);
284291
285292
// игнорировать все события до отпускания кнопки
286293
void skipEvents();
@@ -357,10 +364,14 @@ bool busy();
357364
358365
// было действие с кнопки, вернёт код события [событие]
359366
uint16_t action();
367+
EBAction getAction();
360368
361369
// ================== ВРЕМЯ ==================
362-
// после взаимодействия с кнопкой (или энкодером EncButton) прошло указанное время, мс [событие]
363-
bool timeout(uint16_t ms);
370+
// после взаимодействия с кнопкой (или энкодером EncButton) время setTimeout, мс [событие]
371+
bool timeout();
372+
373+
// после взаимодействия с кнопкой (или энкодером EncButton) время setTimeout, мс [состояние]
374+
bool timeoutState();
364375
365376
// время, которое кнопка удерживается (с начала нажатия), мс
366377
uint16_t pressFor();
@@ -446,7 +457,7 @@ int8_t pollEnc(int8_t state);
446457
void setFastTimeout(uint8_t tout);
447458
448459
// сбросить флаги энкодера и кнопки
449-
void clear();
460+
void clear(bool resetTout = false);
450461
451462
// ==================== ОПРОС ====================
452463
// ЛЮБОЙ поворот энкодера [событие]
@@ -472,6 +483,7 @@ bool leftH();
472483
473484
// было действие с кнопки или энкодера, вернёт код события [событие]
474485
uint16_t action();
486+
EBAction getAction();
475487
476488
// ==================== ОБРАБОТКА ====================
477489
// обработка в прерывании (только энкодер). Вернёт 0 в покое, 1 или -1 при повороте
@@ -652,7 +664,7 @@ int8_t readEnc();
652664
- Есть отдельные функции для вызова в прерывании, они имеют суффикс `ISR`, см. документацию ниже
653665
654666
Библиотека обрабатывает сигнал внутри этой функции, результат можно получить из **функций опроса** событий. Они бывают двух типов:
655-
- `[событие]` - функция вернёт `true` однократно при наступлении события. Сбросится после следующего вызова функции обработки (например клик, поворот энкодера)
667+
- `[событие]` - функция вернёт `true` однократно при наступлении события. Сбросится после следующего вызова функции обработки (например клик, поворот энкодера). За исключением события `timeout`
656668
- `[состояние]` - функция возвращает `true`, пока активно это состояние (например кнопка удерживается)
657669
658670
Для простоты восприятия функцию обработки нужно размещать в начале цикла, а опросы делать ниже:
@@ -800,7 +812,7 @@ void loop() {
800812
- Если кнопка снова нажата - обработка нового клика
801813
- Счётчик кликов `getClicks()` сбрасывается после событий `releaseHold`/`releaseStep`, которые проверяют предварительные клики. В общем обработчике `action()` это события `EB_REL_HOLD_C` или `EB_REL_STEP_C`
802814
- Количество сделанных кликов нужно проверять по событию `hasClicks`, а также можно опросить внутри почти всех событий кнопки, которые идут до `releaseXxx`
803-
- Если ожидается `timeout` - событие timeout с указанным периодом от текущего момента
815+
- Если ожидается `timeout` - событие timeout периодом из `setTimeout`
804816
- Обработка кнопки в прерывании сообщает библиотеке о факте нажатия, вся остальная обработка выполняется штатно в `tick()`
805817

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

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

912927
// ...
913928

914-
if (eb.timeout(2000)) {
915-
// после взаимодействия с энкодером прошло 2 секунды
929+
if (eb.timeout()) {
930+
// после взаимодействия с энкодером прошло 1000 мс
916931
// EEPROM.put(0, settings);
917932
}
918933
}
919934
```
920935

936+
В текущей версии обработка таймаута реализована не очень красиво ради экономии места: системный флаг таймаута активен всё время (`action` будет возвращать событие таймаута), сбрасывается в следующих случаях:
937+
938+
- Вызов `timeout()` - данный метод однократно вернёт `true`, последующие вызовы будут возвращать `false` до нового действия
939+
- Автоматически сбросится после вызова обработчика, если он подключен
940+
- При вызове `clear(true)` - с флагом очистки таймаута
941+
- При вызове `reset()`
942+
943+
Если нужно пробросить опрос таймаута через несколько вызовов - можно использовать `timeoutState()`, но последний вызов должен быть `timeout()`.
944+
921945
<a id="busy"></a>
922946

923947
### Busy
@@ -955,8 +979,7 @@ void loop() {
955979
- `EB_REL_HOLD_C` - кнопка отпущена после удержания с предв. кликами
956980
- `EB_REL_STEP` - кнопка отпущена после степа
957981
- `EB_REL_STEP_C` - кнопка отпущена после степа с предв. кликами
958-
959-
> Результат функции `action()` сбрасывается после следующего вызова `tick()`, то есть доступен на всей текущей итерации основного цикла
982+
- `EB_TIMEOUT` - прошёл таймаут после нажатия кнопки или поворота энкодера
960983

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

997+
Есть аналогичная функция `getAction()`, вернёт то же самое, но с более читаемыми константами (удобно с автодополнением):
998+
999+
- `EBAction::Press`
1000+
- `EBAction::Hold`
1001+
- `EBAction::Step`
1002+
- `EBAction::Release`
1003+
- `EBAction::Click`
1004+
- `EBAction::Clicks`
1005+
- `EBAction::Turn`
1006+
- `EBAction::ReleaseHold`
1007+
- `EBAction::ReleaseHoldClicks`
1008+
- `EBAction::ReleaseStep`
1009+
- `EBAction::ReleaseStepClicks`
1010+
- `EBAction::Timeout`
1011+
1012+
Полученный код события можно обработать через `switch`:
1013+
```cpp
1014+
switch (eb.getAction()) {
1015+
case EBAction::Press:
1016+
// ...
1017+
break;
1018+
case EBAction::Hold:
1019+
// ...
1020+
break;
1021+
// ...
1022+
}
1023+
```
1024+
1025+
> Результат функций `action()`/`getAction()` сбрасывается после следующего вызова `tick()`, то есть доступен на всей текущей итерации основного цикла
1026+
9741027
<a id="optimise"></a>
9751028

9761029
### Оптимизация
@@ -986,6 +1039,7 @@ switch (eb.action()) {
9861039
#define EB_HOLD_TIME 600 // таймаут удержания (кнопка)
9871040
#define EB_STEP_TIME 200 // таймаут импульсного удержания (кнопка)
9881041
#define EB_FAST_TIME 30 // таймаут быстрого поворота (энкодер)
1042+
#define EB_TOUT_TIME 1000 // таймаут действия (кнопка и энкодер)
9891043
#include <EncButton.h>
9901044
EncButtonT<2, 3, 4> eb;
9911045
```
@@ -1472,6 +1526,7 @@ EncoderT<enc0, enc1> e(mode); // + режим пинов энкодера (у
14721526
// #define EB_HOLD_TIME 600 // таймаут удержания (кнопка)
14731527
// #define EB_STEP_TIME 200 // таймаут импульсного удержания (кнопка)
14741528
// #define EB_FAST_TIME 30 // таймаут быстрого поворота (энкодер)
1529+
// #define EB_TOUT_TIME 1000 // таймаут действия (кнопка и энкодер)
14751530
14761531
#include <EncButton.h>
14771532
EncButton eb(2, 3, 4);
@@ -1546,7 +1601,7 @@ void loop() {
15461601
// Serial.println(eb.waiting());
15471602
15481603
// таймаут
1549-
if (eb.timeout(1000)) Serial.println("timeout!");
1604+
if (eb.timeout()) Serial.println("timeout!");
15501605
15511606
// удержание
15521607
if (eb.hold()) Serial.println("hold");

README_EN.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -896,8 +896,8 @@ VOID loop () {
896896

897897
// ...
898898

899-
if.timeout (2000)) {
900-
// after interaction with encoder 2 seconds passed
899+
if.timeout ()) {
900+
// after interaction with encoder 1 second passed
901901
// eeprom.put (0, settings);
902902
}
903903
}
@@ -1516,7 +1516,7 @@ VOID loop () {
15161516
// serial.println (eb.waiting ());
15171517

15181518
// Timesout
1519-
if (eb.timeout (1000)) serial.println ("Timeout!");
1519+
if (eb.timeout ()) serial.println ("Timeout!");
15201520

15211521
// Holding
15221522
if.hold ()) serial.println ("Hold");

examples/callback2/callback2.ino

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
// опрос событий через функцию-обработчик
2+
3+
#include <Arduino.h>
4+
#include <EncButton.h>
5+
6+
EncButton eb(2, 3, 4);
7+
8+
void cb() {
9+
// здесь EB_self - указатель на сам объект
10+
11+
Serial.print("callback: ");
12+
switch (eb.getAction()) {
13+
case EBAction::Press:
14+
Serial.println("press");
15+
break;
16+
case EBAction::Hold:
17+
Serial.println("hold");
18+
break;
19+
case EBAction::Step:
20+
Serial.println("step");
21+
break;
22+
case EBAction::Release:
23+
Serial.print("release. steps: ");
24+
Serial.print(eb.getSteps());
25+
Serial.print(", press for: ");
26+
Serial.print(eb.pressFor());
27+
Serial.print(", hold for: ");
28+
Serial.print(eb.holdFor());
29+
Serial.print(", step for: ");
30+
Serial.println(eb.stepFor());
31+
break;
32+
case EBAction::Click:
33+
Serial.println("click");
34+
break;
35+
case EBAction::Clicks:
36+
Serial.print("clicks ");
37+
Serial.println(eb.getClicks());
38+
break;
39+
case EBAction::Turn:
40+
Serial.print("turn ");
41+
Serial.print(eb.dir());
42+
Serial.print(" ");
43+
Serial.print(eb.fast());
44+
Serial.print(" ");
45+
Serial.println(eb.pressing());
46+
break;
47+
case EBAction::ReleaseHold:
48+
Serial.println("release hold");
49+
break;
50+
case EBAction::ReleaseHoldClicks:
51+
Serial.print("release hold clicks ");
52+
Serial.println(eb.getClicks());
53+
break;
54+
case EBAction::ReleaseStep:
55+
Serial.println("release step");
56+
break;
57+
case EBAction::ReleaseStepClicks:
58+
Serial.print("release step clicks ");
59+
Serial.println(eb.getClicks());
60+
break;
61+
case EBAction::Timeout:
62+
Serial.println("timeout");
63+
break;
64+
default: break;
65+
}
66+
}
67+
68+
void setup() {
69+
Serial.begin(115200);
70+
eb.attach(cb);
71+
}
72+
73+
void loop() {
74+
eb.tick();
75+
}

examples/demo/demo.ino

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
// #define EB_HOLD_TIME 600 // таймаут удержания (кнопка)
1111
// #define EB_STEP_TIME 200 // таймаут импульсного удержания (кнопка)
1212
// #define EB_FAST_TIME 30 // таймаут быстрого поворота (энкодер)
13+
// #define EB_TOUT_TIME 1000 // таймаут действия (кнопка и энкодер)
1314

1415
#include <EncButton.h>
1516
EncButton eb(2, 3, 4);
@@ -25,6 +26,7 @@ void setup() {
2526
eb.setDebTimeout(50);
2627
eb.setHoldTimeout(600);
2728
eb.setStepTimeout(200);
29+
eb.setTimeout(1000);
2830

2931
eb.setEncReverse(0);
3032
eb.setEncType(EB_STEP4_LOW);
@@ -83,7 +85,7 @@ void loop() {
8385
// Serial.println(eb.waiting());
8486

8587
// таймаут
86-
if (eb.timeout(1000)) Serial.println("timeout!");
88+
if (eb.timeout()) Serial.println("timeout!");
8789

8890
// удержание
8991
if (eb.hold()) Serial.println("hold");

0 commit comments

Comments
 (0)