Skip to content

Commit 12e458d

Browse files
committed
upd
1 parent d93fa7f commit 12e458d

File tree

12 files changed

+189
-102
lines changed

12 files changed

+189
-102
lines changed

README.md

Lines changed: 48 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,6 @@
227227
228228
| | VirtEncoder | Encoder | VirtEncButton | EncButton |
229229
| -------------- | :---------: | :-----: | :-----------: | :-------: |
230-
| readEnc | | | | ✔ |
231230
| initEnc | ✔ | ✔ | ✔ | ✔ |
232231
| setEncReverse | ✔ | ✔ | ✔ | ✔ |
233232
| setEncType | ✔ | ✔ | ✔ | ✔ |
@@ -518,6 +517,9 @@ bool tick();
518517
519518
// обработка кнопки без сброса событий и вызова коллбэка
520519
bool tickRaw();
520+
521+
// получить пин кнопки
522+
uint8_t getPin();
521523
```
522524
</details>
523525
<details>
@@ -561,6 +563,12 @@ int8_t tickISR();
561563

562564
// функция обработки для вызова в loop
563565
int8_t tick();
566+
567+
// получить пин энкодера
568+
uint8_t getPinA();
569+
570+
// получить пин энкодера
571+
uint8_t getPinB();
564572
```
565573
</details>
566574
<details>
@@ -612,8 +620,14 @@ bool tick();
612620
// прочитать значение кнопки с учётом setBtnLevel
613621
bool readBtn();
614622

615-
// прочитать значение энкодера
616-
int8_t readEnc();
623+
// получить пин кнопки
624+
uint8_t getPin();
625+
626+
// получить пин энкодера
627+
uint8_t getPinA();
628+
629+
// получить пин энкодера
630+
uint8_t getPinB();
617631
```
618632
</details>
619633
<details>
@@ -642,9 +656,6 @@ bool tick();
642656

643657
// прочитать значение кнопки
644658
bool readBtn();
645-
646-
// прочитать значение энкодера
647-
int8_t readEnc();
648659
```
649660
</details>
650661
@@ -1116,8 +1127,10 @@ void loop() {
11161127
11171128
### Одновременное нажатие
11181129
Библиотека нативно поддерживает работу с двумя одновременно нажатыми кнопками как с третьей кнопкой. Для этого нужно:
1130+
1131+
#### Новый способ (v3)
11191132
1. Cоздать специальную кнопку `MultiButton`
1120-
2. Передать виртуальной кнопке в обработку свои кнопки (это могут быть объекты классов `VirtButton`, `Button`, `EncButton` + их `T`-версии). **Мульти-кнопка сама опросит обе кнопки!**
1133+
2. Передать виртуальной кнопке в обработку свои кнопки (это могут быть объекты классов `Button` и `EncButton` + их `T`-версии). **Мульти-кнопка сама опросит обе кнопки!**
11211134
3. Опрашивать события или слушать обработчик
11221135
11231136
```cpp
@@ -1137,6 +1150,34 @@ void loop() {
11371150

11381151
Библиотека сама "сбросит" лишние события с реальных кнопок, если они были нажаты вместе, за исключением события `press`. Таким образом получается полноценная третья кнопка из двух других с удобным опросом.
11391152

1153+
#### Старый способ
1154+
1. Создать дополнительную виртуальную кнопку
1155+
2. Вызвать тикеры у отдельных кнопок
1156+
3. Вызвать тикер у виртуальной кнопки, передав в него отдельные кнопки
1157+
1158+
Данный способ не работает с обработчиком - он будет вызван у отдельных кнопок в любом случае
1159+
1160+
```cpp
1161+
Button b0(4);
1162+
Button b1(5);
1163+
VirtButton b2; // виртуальная - 1
1164+
1165+
void loop() {
1166+
// тикеры - 2
1167+
b0.tick();
1168+
b1.tick();
1169+
1170+
// обработка одновременного нажатия двух кнопок - 3
1171+
b2.tick(b0, b1);
1172+
1173+
if (b0.click()) Serial.println("b0 click");
1174+
if (b1.click()) Serial.println("b1 click");
1175+
1176+
if (b2.click()) Serial.println("b0+b1 click");
1177+
if (b2.step()) Serial.println("b0+b1 step");
1178+
}
1179+
```
1180+
11401181
<a id="isr"></a>
11411182
11421183
### Прерывания

README_EN.md

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,6 @@ Thus, to study all the available functions of a particular library, you need to
216216

217217
||Virtencoder |Encoder |Virtencbutton |Encbutton |
218218
| -------------- |: ----------------------------- |: -------: |: -----------------------------: |: ---------: |
219-
|Readenc |||||
220219
|Initenc |||||
221220
|Setencreverse |||||
222221
|Setenctype |||||
@@ -591,9 +590,6 @@ Bool Tick ();
591590

592591
// Read the value of the button taking into account Setbtnlevel
593592
Bool Readbtn ();
594-
595-
// Read the value of the encoder
596-
Int8_T Readenc ();
597593
`` `
598594
</details>
599595
<details>
@@ -622,9 +618,6 @@ Bool Tick ();
622618

623619
// Read the button value
624620
Bool Readbtn ();
625-
626-
// Read the value of the encoder
627-
Int8_T Readenc ();
628621
`` `
629622
</details>
630623

keywords.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,6 @@ tickRaw KEYWORD2
8989
tickISR KEYWORD2
9090
tick KEYWORD2
9191
readBtn KEYWORD2
92-
readEnc KEYWORD2
9392

9493
#######################################
9594
# Constants (LITERAL1)

library.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name=EncButton
2-
version=3.7.3
2+
version=3.7.4
33
author=AlexGyver <[email protected]>
44
maintainer=AlexGyver <[email protected]>
55
sentence=Light and powerful library for button and encoder operation for Arduino

src/core/Button.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ class Button : public VirtButton {
3333
return VirtButton::tickRaw(EB_read(pin));
3434
}
3535

36+
// получить пин кнопки
37+
uint8_t getPin() {
38+
return pin;
39+
}
40+
3641
private:
3742
uint8_t pin;
3843
};

src/core/EncButton.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,21 @@ class EncButton : public VirtEncButton {
4646
return EB_read(b) ^ bf.read(EB_INV);
4747
}
4848

49+
// получить пин кнопки
50+
uint8_t getPin() {
51+
return b;
52+
}
53+
54+
// получить пин энкодера
55+
uint8_t getPinA() {
56+
return e0;
57+
}
58+
59+
// получить пин энкодера
60+
uint8_t getPinB() {
61+
return e1;
62+
}
63+
4964
// ===================== PRIVATE =====================
5065
private:
5166
uint8_t e0, e1, b;

src/core/Encoder.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,16 @@ class Encoder : public VirtEncoder {
3636
return ef.read(EB_EISR) ? VirtEncoder::tickRaw() : VirtEncoder::tickRaw(EB_read(e0), EB_read(e1));
3737
}
3838

39+
// получить пин энкодера
40+
uint8_t getPinA() {
41+
return e0;
42+
}
43+
44+
// получить пин энкодера
45+
uint8_t getPinB() {
46+
return e1;
47+
}
48+
3949
private:
4050
uint8_t e0, e1;
4151
};

src/core/MultiButton.h

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,23 @@ class MultiButton : public VirtButton {
1212
b0.tickRaw();
1313
b1.tickRaw();
1414

15-
if (bf.read(EB_BOTH)) {
16-
if (!b0.pressing() && !b1.pressing()) bf.clear(EB_BOTH);
17-
if (!b0.pressing()) b0.reset();
18-
if (!b1.pressing()) b1.reset();
19-
b0.clear();
20-
b1.clear();
21-
return VirtButton::tick(true);
22-
} else {
23-
if (b0.pressing() && b1.pressing()) bf.set(EB_BOTH);
15+
// if (bf.read(EB_BOTH)) {
16+
// if (!b0.pressing() && !b1.pressing()) bf.clear(EB_BOTH);
17+
// if (!b0.pressing()) b0.reset();
18+
// if (!b1.pressing()) b1.reset();
19+
// b0.clear();
20+
// b1.clear();
21+
// return VirtButton::tick(true);
22+
// } else {
23+
// if (b0.pressing() && b1.pressing()) bf.set(EB_BOTH);
24+
// b0.call();
25+
// b1.call();
26+
// return VirtButton::tick(false);
27+
// }
28+
if (!bf.read(EB_BOTH)) {
2429
b0.call();
2530
b1.call();
26-
return VirtButton::tick(false);
2731
}
32+
return VirtButton::tick(b0, b1);
2833
}
2934
};

src/core/VirtButton.h

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ enum class EBAction {
8686
#define EB_HLD_R (1 << 2)
8787
#define EB_STP_R (1 << 3)
8888
#define EB_REL_R (1 << 4)
89+
#define EB_ALL_R (EB_CLKS_R | EB_PRS_R | EB_HLD_R | EB_STP_R | EB_REL_R)
8990

9091
#define EB_PRS (1 << 5)
9192
#define EB_HLD (1 << 6)
@@ -165,11 +166,9 @@ class VirtButton {
165166

166167
// принудительно сбросить флаги событий
167168
void clear(bool resetTout = false) {
168-
if (resetTout && bf.read(EB_TOUT)) bf.clear(EB_TOUT);
169+
if (resetTout) bf.clear(EB_TOUT);
169170
if (bf.read(EB_CLKS_R)) clicks = 0;
170-
if (bf.read(EB_CLKS_R | EB_STP_R | EB_PRS_R | EB_HLD_R | EB_REL_R)) {
171-
bf.clear(EB_CLKS_R | EB_STP_R | EB_PRS_R | EB_HLD_R | EB_REL_R);
172-
}
171+
bf.clear(EB_ALL_R);
173172
}
174173

175174
// игнорировать все события до отпускания кнопки
@@ -206,7 +205,7 @@ class VirtButton {
206205

207206
// кнопка отпущена (в любом случае) [событие]
208207
bool release() {
209-
return bf.eq(EB_REL_R | EB_REL, EB_REL_R | EB_REL);
208+
return bf.all(EB_REL_R | EB_REL);
210209
}
211210

212211
// кнопка отпущена (в любом случае) с предварительными кликами [событие]
@@ -246,7 +245,7 @@ class VirtButton {
246245

247246
// кнопка удерживается (больше таймаута) [состояние]
248247
bool holding() {
249-
return bf.eq(EB_PRS | EB_HLD, EB_PRS | EB_HLD);
248+
return bf.all(EB_PRS | EB_HLD);
250249
}
251250

252251
// кнопка удерживается (больше таймаута) с предварительными кликами [состояние]
@@ -304,7 +303,7 @@ class VirtButton {
304303

305304
// кнопка отпущена после импульсного удержания с предварительными кликами [событие]
306305
bool releaseStep(const uint8_t num) {
307-
return clicks == num && bf.eq(EB_CLKS_R | EB_STP, EB_CLKS_R | EB_STP);
306+
return clicks == num && bf.all(EB_CLKS_R | EB_STP);
308307
}
309308

310309
// кнопка отпущена после удержания или импульсного удержания [событие]
@@ -319,7 +318,7 @@ class VirtButton {
319318

320319
// кнопка ожидает повторных кликов [состояние]
321320
bool waiting() {
322-
return clicks && bf.eq(EB_PRS | EB_REL, 0);
321+
return clicks && !bf.read(EB_PRS | EB_REL);
323322
}
324323

325324
// идёт обработка [состояние]
@@ -329,7 +328,7 @@ class VirtButton {
329328

330329
// было действие с кнопки, вернёт код события [событие]
331330
uint16_t action() {
332-
switch (bf.mask(0b111111111)) {
331+
switch (bf.mask(EB_ALL_R | EB_PRS | EB_HLD | EB_STP | EB_REL)) {
333332
case (EB_PRS | EB_PRS_R): return EB_PRESS;
334333
case (EB_PRS | EB_HLD | EB_HLD_R): return EB_HOLD;
335334
case (EB_PRS | EB_HLD | EB_STP | EB_STP_R): return EB_STEP;
@@ -416,10 +415,10 @@ class VirtButton {
416415
if (!b1.pressing()) b1.reset();
417416
b0.clear();
418417
b1.clear();
419-
return tick(1);
418+
return tick(true);
420419
} else {
421420
if (b0.pressing() && b1.pressing()) bf.set(EB_BOTH);
422-
return tick(0);
421+
return tick(false);
423422
}
424423
}
425424

@@ -456,11 +455,11 @@ class VirtButton {
456455

457456
uint8_t clicks;
458457

459-
// deprecated
458+
// ===================== DEPRECATED =====================
460459
void setButtonLevel(bool level) __attribute__((deprecated)) {
461460
bf.write(EB_INV, !level);
462461
}
463-
462+
464463
// после взаимодействия с кнопкой (или энкодером EncButton) прошло указанное время, мс [событие]
465464
bool timeout(const uint16_t tout) /*__attribute__((deprecated))*/ {
466465
if (timeoutState(tout)) {
@@ -475,6 +474,14 @@ class VirtButton {
475474
return (bf.read(EB_TOUT) && (uint16_t)((uint16_t)EB_uptime() - tmr) > tout);
476475
}
477476

477+
bool isStep() __attribute__((deprecated)) { return step(); }
478+
bool isHold() __attribute__((deprecated)) { return holding(); }
479+
bool isHolded() __attribute__((deprecated)) { return hold(); }
480+
bool isHeld() __attribute__((deprecated)) { return hold(); }
481+
bool isClick() __attribute__((deprecated)) { return click(); }
482+
bool isRelease() __attribute__((deprecated)) { return release(); }
483+
bool isPress() __attribute__((deprecated)) { return press(); }
484+
478485
// ====================== PRIVATE ======================
479486
protected:
480487
uint16_t tmr = 0;
@@ -564,7 +571,7 @@ class VirtButton {
564571
} else if (clicks) { // есть клики, ждём EB_CLICK_TIME
565572
if (bf.read(EB_HLD | EB_STP) || deb >= EB_GET_CLICK_TIME()) bf.set(EB_CLKS_R); // флаг clicks
566573
#ifndef EB_NO_FOR
567-
else if (ftmr) ftmr = 0;
574+
else ftmr = 0;
568575
#endif
569576
} else if (bf.read(EB_BUSY)) {
570577
bf.clear(EB_HLD | EB_STP | EB_BUSY);
@@ -576,6 +583,6 @@ class VirtButton {
576583
}
577584
if (bf.read(EB_DEB)) bf.clear(EB_DEB); // сброс ожидания нажатия (дебаунс)
578585
}
579-
return bf.read(EB_CLKS_R | EB_PRS_R | EB_HLD_R | EB_STP_R | EB_REL_R);
586+
return bf.read(EB_ALL_R);
580587
}
581588
};

0 commit comments

Comments
 (0)