You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// обработка в прерывании (только энкодер). Вернёт 0 в покое, 1 или -1 при повороте
@@ -652,7 +664,7 @@ int8_t readEnc();
652
664
- Есть отдельные функции для вызова в прерывании, они имеют суффикс `ISR`, см. документацию ниже
653
665
654
666
Библиотека обрабатывает сигнал внутри этой функции, результат можно получить из **функций опроса** событий. Они бывают двух типов:
655
-
- `[событие]` - функция вернёт `true` однократно при наступлении события. Сбросится после следующего вызова функции обработки (например клик, поворот энкодера)
667
+
- `[событие]` - функция вернёт `true` однократно при наступлении события. Сбросится после следующего вызова функции обработки (например клик, поворот энкодера). За исключением события `timeout`
656
668
- `[состояние]` - функция возвращает `true`, пока активно это состояние (например кнопка удерживается)
657
669
658
670
Для простоты восприятия функцию обработки нужно размещать в начале цикла, а опросы делать ниже:
@@ -800,7 +812,7 @@ void loop() {
800
812
- Если кнопка снова нажата - обработка нового клика
801
813
- Счётчик кликов `getClicks()` сбрасывается после событий `releaseHold`/`releaseStep`, которые проверяют предварительные клики. В общем обработчике `action()` это события `EB_REL_HOLD_C` или `EB_REL_STEP_C`
802
814
- Количество сделанных кликов нужно проверять по событию `hasClicks`, а также можно опросить внутри почти всех событий кнопки, которые идут до `releaseXxx`
803
-
- Если ожидается `timeout` - событие timeout с указанным периодом от текущего момента
815
+
- Если ожидается `timeout` - событие timeout периодом из `setTimeout`
804
816
- Обработка кнопки в прерывании сообщает библиотеке о факте нажатия, вся остальная обработка выполняется штатно в `tick()`
805
817
806
818
> Отличие `click(n)` от `hasClicks(n)`: `click(n)` вернёт `true` в любом случае при совпадении количества кликов, даже если будет сделано больше кликов. `hasClicks(n)` вернёт `true` только в том случае, если было сделано ровно указанное количество кликов и больше кликов не было!
@@ -904,20 +916,32 @@ do {
904
916
<aid="timeout"></a>
905
917
906
918
### Timeout
907
-
В связанных с кнопкой классах (Button, EncButton) есть функция `timeout(time)` - она однократно вернёт `true`, если после окончания действий с кнопкой/энкодером прошло указанное время. Это можно использовать для сохранения параметров после ввода, например:
919
+
В связанных с кнопкой классах (Button, EncButton) есть функция `timeout()` - она однократно вернёт `true`, если после окончания действий с кнопкой/энкодером прошло указанное в `setTimeout` время. Это можно использовать для сохранения параметров после ввода, например:
908
920
```cpp
921
+
voidsetup() {
922
+
//eb.setTimeout(1500); // умолч. 1000
923
+
}
909
924
voidloop() {
910
925
eb.tick();
911
926
912
927
// ...
913
928
914
-
if (eb.timeout(2000)) {
915
-
// после взаимодействия с энкодером прошло 2 секунды
929
+
if (eb.timeout()) {
930
+
// после взаимодействия с энкодером прошло 1000 мс
916
931
// EEPROM.put(0, settings);
917
932
}
918
933
}
919
934
```
920
935
936
+
В текущей версии обработка таймаута реализована не очень красиво ради экономии места: системный флаг таймаута активен всё время (`action` будет возвращать событие таймаута), сбрасывается в следующих случаях:
937
+
938
+
- Вызов `timeout()` - данный метод однократно вернёт `true`, последующие вызовы будут возвращать `false` до нового действия
939
+
- Автоматически сбросится после вызова обработчика, если он подключен
940
+
- При вызове `clear(true)` - с флагом очистки таймаута
941
+
- При вызове `reset()`
942
+
943
+
Если нужно пробросить опрос таймаута через несколько вызовов - можно использовать `timeoutState()`, но последний вызов должен быть `timeout()`.
944
+
921
945
<aid="busy"></a>
922
946
923
947
### Busy
@@ -955,8 +979,7 @@ void loop() {
955
979
-`EB_REL_HOLD_C` - кнопка отпущена после удержания с предв. кликами
956
980
-`EB_REL_STEP` - кнопка отпущена после степа
957
981
-`EB_REL_STEP_C` - кнопка отпущена после степа с предв. кликами
958
-
959
-
> Результат функции `action()` сбрасывается после следующего вызова `tick()`, то есть доступен на всей текущей итерации основного цикла
982
+
-`EB_TIMEOUT` - прошёл таймаут после нажатия кнопки или поворота энкодера
960
983
961
984
Полученный код события можно обработать через `switch`:
962
985
```cpp
@@ -971,6 +994,36 @@ switch (eb.action()) {
971
994
}
972
995
```
973
996
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()`, то есть доступен на всей текущей итерации основного цикла
0 commit comments