Skip to content

Commit b9a33c1

Browse files
committed
upd
1 parent 8fbe745 commit b9a33c1

File tree

8 files changed

+97
-174
lines changed

8 files changed

+97
-174
lines changed

README.md

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -428,21 +428,17 @@ int32_t counter;
428428
// ==================== ОБРАБОТКА ====================
429429
// опросить энкодер в прерывании. Вернёт 1 или -1 при вращении, 0 при остановке
430430
int8_t tickISR(bool e0, bool e1);
431-
int8_t tickISR(int8_t state);
432431

433432
// опросить энкодер. Вернёт 1 или -1 при вращении, 0 при остановке
434433
int8_t tick(bool e0, bool e1);
435-
int8_t tick(int8_t state);
436434
int8_t tick(); // сама обработка в прерывании
437435

438436
// опросить энкодер без сброса события поворота. Вернёт 1 или -1 при вращении, 0 при остановке
439437
int8_t tickRaw(bool e0, bool e1);
440-
int8_t tickRaw(int8_t state);
441438
int8_t tickRaw(); // сама обработка в прерывании
442439

443440
// опросить энкодер без установки флагов на поворот (быстрее). Вернёт 1 или -1 при вращении, 0 при остановке
444441
int8_t pollEnc(bool e0, bool e1);
445-
int8_t pollEnc(int8_t state);
446442
```
447443
</details>
448444
<details>
@@ -488,16 +484,13 @@ EBAction getAction();
488484
// ==================== ОБРАБОТКА ====================
489485
// обработка в прерывании (только энкодер). Вернёт 0 в покое, 1 или -1 при повороте
490486
int8_t tickISR(bool e0, bool e1);
491-
int8_t tickISR(int8_t e01);
492487
493488
// обработка энкодера и кнопки
494489
bool tick(bool e0, bool e1, bool btn);
495-
bool tick(int8_t e01, bool btn);
496490
bool tick(bool btn); // энкодер в прерывании
497491
498492
// обработка энкодера и кнопки без сброса флагов и вызова коллбэка
499493
bool tickRaw(bool e0, bool e1, bool btn);
500-
bool tickRaw(int8_t e01, bool btn);
501494
bool tickRaw(bool btn); // энкодер в прерывании
502495
```
503496
</details>

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.2
2+
version=3.7.3
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: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,4 @@ class ButtonT : public VirtButton {
6565
bool tickRaw() {
6666
return VirtButton::tickRaw(EB_read(PIN));
6767
}
68-
69-
private:
7068
};

src/core/EncButton.h

Lines changed: 8 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -21,25 +21,23 @@ class EncButton : public VirtEncButton {
2121
EB_mode(e1, modeEnc);
2222
EB_mode(b, modeBtn);
2323
setBtnLevel(btnLevel);
24-
initEnc(readEnc());
24+
initEnc(EB_read(e0), EB_read(e1));
2525
}
2626

2727
// ====================== TICK ======================
2828
// функция обработки для вызова в прерывании энкодера
2929
int8_t tickISR() {
30-
return VirtEncButton::tickISR(readEnc());
30+
return VirtEncButton::tickISR(EB_read(e0), EB_read(e1));
3131
}
3232

3333
// функция обработки, вызывать в loop
3434
bool tick() {
35-
if (ef.read(EB_EISR)) return VirtEncButton::tick(EB_read(b));
36-
else return VirtEncButton::tick(readEnc(), EB_read(b));
35+
return ef.read(EB_EISR) ? VirtEncButton::tick(EB_read(b)) : VirtEncButton::tick(EB_read(e0), EB_read(e1), EB_read(b));
3736
}
3837

3938
// функция обработки без сброса событий
4039
bool tickRaw() {
41-
if (ef.read(EB_EISR)) return VirtEncButton::tickRaw(EB_read(b));
42-
else return VirtEncButton::tickRaw(readEnc(), EB_read(b));
40+
return ef.read(EB_EISR) ? VirtEncButton::tickRaw(EB_read(b)) : VirtEncButton::tickRaw(EB_read(e0), EB_read(e1), EB_read(b));
4341
}
4442

4543
// ====================== READ ======================
@@ -48,11 +46,6 @@ class EncButton : public VirtEncButton {
4846
return EB_read(b) ^ bf.read(EB_INV);
4947
}
5048

51-
// прочитать значение энкодера
52-
int8_t readEnc() {
53-
return EB_read(e0) | (EB_read(e1) << 1);
54-
}
55-
5649
// ===================== PRIVATE =====================
5750
private:
5851
uint8_t e0, e1, b;
@@ -73,38 +66,28 @@ class EncButtonT : public VirtEncButton {
7366
EB_mode(ENCB, modeEnc);
7467
EB_mode(BTN, modeBtn);
7568
setBtnLevel(btnLevel);
76-
initEnc(readEnc());
69+
initEnc(EB_read(ENCA), EB_read(ENCB));
7770
}
7871

7972
// ====================== TICK ======================
8073
// функция обработки для вызова в прерывании энкодера
8174
int8_t tickISR() {
82-
return VirtEncButton::tickISR(readEnc());
75+
return VirtEncButton::tickISR(EB_read(ENCA), EB_read(ENCB));
8376
}
8477

8578
// функция обработки, вызывать в loop
8679
bool tick() {
87-
if (ef.read(EB_EISR)) return VirtEncButton::tick(EB_read(BTN));
88-
else return VirtEncButton::tick(readEnc(), EB_read(BTN));
80+
return ef.read(EB_EISR) ? VirtEncButton::tick(EB_read(BTN)) : VirtEncButton::tick(EB_read(ENCA), EB_read(ENCB), EB_read(BTN));
8981
}
9082

9183
// функция обработки без сброса событий
9284
bool tickRaw() {
93-
if (ef.read(EB_EISR)) return VirtEncButton::tickRaw(EB_read(BTN));
94-
else return VirtEncButton::tickRaw(readEnc(), EB_read(BTN));
85+
return ef.read(EB_EISR) ? VirtEncButton::tickRaw(EB_read(BTN)) : VirtEncButton::tickRaw(EB_read(ENCA), EB_read(ENCB), EB_read(BTN));
9586
}
9687

9788
// ====================== READ ======================
9889
// прочитать значение кнопки
9990
bool readBtn() {
10091
return EB_read(BTN) ^ bf.read(EB_INV);
10192
}
102-
103-
// прочитать значение энкодера
104-
int8_t readEnc() {
105-
return EB_read(ENCA) | (EB_read(ENCB) << 1);
106-
}
107-
108-
// ===================== PRIVATE =====================
109-
private:
11093
};

src/core/Encoder.h

Lines changed: 8 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -18,33 +18,26 @@ class Encoder : public VirtEncoder {
1818
e1 = encB;
1919
EB_mode(e0, mode);
2020
EB_mode(e1, mode);
21-
initEnc(readEnc());
21+
initEnc(EB_read(e0), EB_read(e1));
2222
}
2323

2424
// функция обработки для вызова в прерывании энкодера
2525
int8_t tickISR() {
26-
return VirtEncoder::tickISR(readEnc());
26+
return VirtEncoder::tickISR(EB_read(e0), EB_read(e1));
2727
}
2828

2929
// функция обработки, вызывать в loop
3030
int8_t tick() {
31-
if (ef.read(EB_EISR)) return VirtEncoder::tick();
32-
else return VirtEncoder::tick(readEnc());
31+
return ef.read(EB_EISR) ? VirtEncoder::tick() : VirtEncoder::tick(EB_read(e0), EB_read(e1));
3332
}
3433

3534
// обработка без сброса события поворота
3635
int8_t tickRaw() {
37-
if (ef.read(EB_EISR)) return VirtEncoder::tickRaw();
38-
else return VirtEncoder::tickRaw(readEnc());
36+
return ef.read(EB_EISR) ? VirtEncoder::tickRaw() : VirtEncoder::tickRaw(EB_read(e0), EB_read(e1));
3937
}
4038

4139
private:
4240
uint8_t e0, e1;
43-
44-
// прочитать значение энкодера
45-
int8_t readEnc() {
46-
return EB_read(e0) | (EB_read(e1) << 1);
47-
}
4841
};
4942

5043
// ============= TEMPLATE PIN =============
@@ -60,30 +53,21 @@ class EncoderT : public VirtEncoder {
6053
void init(uint8_t mode = INPUT) {
6154
EB_mode(ENCA, mode);
6255
EB_mode(ENCB, mode);
63-
initEnc(readEnc());
56+
initEnc(EB_read(ENCA), EB_read(ENCB));
6457
}
6558

6659
// функция обработки для вызова в прерывании энкодера
6760
int8_t tickISR() {
68-
return VirtEncoder::tickISR(readEnc());
61+
return VirtEncoder::tickISR(EB_read(ENCA), EB_read(ENCB));
6962
}
7063

7164
// функция обработки, вызывать в loop
7265
int8_t tick() {
73-
if (ef.read(EB_EISR)) return VirtEncoder::tick();
74-
else return VirtEncoder::tick(readEnc());
66+
return ef.read(EB_EISR) ? VirtEncoder::tick() : VirtEncoder::tick(EB_read(ENCA), EB_read(ENCB));
7567
}
7668

7769
// обработка без сброса события поворота
7870
int8_t tickRaw() {
79-
if (ef.read(EB_EISR)) return VirtEncoder::tickRaw();
80-
else return VirtEncoder::tickRaw(readEnc());
81-
}
82-
83-
// прочитать значение энкодера
84-
int8_t readEnc() {
85-
return EB_read(ENCA) | (EB_read(ENCB) << 1);
71+
return ef.read(EB_EISR) ? VirtEncoder::tickRaw() : VirtEncoder::tickRaw(EB_read(ENCA), EB_read(ENCB));
8672
}
87-
88-
private:
8973
};

src/core/VirtEncButton.h

Lines changed: 45 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,7 @@ class VirtEncButton : public VirtButton, public VirtEncoder {
6464

6565
// было действие с кнопки или энкодера, вернёт код события [событие]
6666
uint16_t action() {
67-
if (turn()) return EB_TURN;
68-
else return VirtButton::action();
67+
return turn() ? EB_TURN : VirtButton::action();
6968
}
7069

7170
// было действие с кнопки или энкодера, вернёт код события [событие]
@@ -77,23 +76,18 @@ class VirtEncButton : public VirtButton, public VirtEncoder {
7776
// ISR
7877
// обработка в прерывании (только энкодер). Вернёт 0 в покое, 1 или -1 при повороте
7978
int8_t tickISR(const bool e0, const bool e1) {
80-
return tickISR(e0 | (e1 << 1));
81-
}
82-
83-
// обработка в прерывании (только энкодер). Вернёт 0 в покое, 1 или -1 при повороте
84-
int8_t tickISR(int8_t state) {
85-
state = VirtEncoder::pollEnc(state);
79+
int8_t state = VirtEncoder::pollEnc(e0, e1);
8680
if (state) {
8781
#ifdef EB_NO_BUFFER
8882
ef.set(EB_ISR_F);
8983
ef.write(EB_DIR, state > 0);
90-
ef.write(EB_FAST, checkFast());
84+
ef.write(EB_FAST, _checkFast());
9185
#else
9286
for (uint8_t i = 0; i < 15; i += 3) {
9387
if (!(ebuffer & (1 << i))) {
94-
ebuffer |= (1 << i); // turn
95-
if (state > 0) ebuffer |= (1 << (i + 1)); // dir
96-
if (checkFast()) ebuffer |= (1 << (i + 2)); // fast
88+
ebuffer |= (1 << i); // turn
89+
if (state > 0) ebuffer |= (1 << (i + 1)); // dir
90+
if (_checkFast()) ebuffer |= (1 << (i + 2)); // fast
9791
break;
9892
}
9993
}
@@ -105,34 +99,53 @@ class VirtEncButton : public VirtButton, public VirtEncoder {
10599
// TICK
106100
// обработка энкодера и кнопки
107101
bool tick(const bool e0, const bool e1, const bool btn) {
108-
return tick(e0 | (e1 << 1), btn);
109-
}
110-
111-
// обработка энкодера и кнопки. state = -1 для пропуска обработки энкодера
112-
bool tick(const int8_t state, const bool btn) {
113102
clear();
114-
bool f = tickRaw(state, btn);
115-
#ifndef EB_NO_CALLBACK
116-
if (f || timeoutState()) call(true);
117-
#endif
118-
return f;
103+
return _tick(_tickRaw(btn, pollEnc(e0, e1)));
119104
}
120105

121106
// обработка энкодера (в прерывании) и кнопки
122107
bool tick(const bool btn) {
123-
return tick(-1, btn);
108+
clear();
109+
return _tick(_tickRaw(btn));
124110
}
125111

126112
// RAW
127113
// обработка без сброса событий и вызова коллбэка
128-
bool tickRaw(const bool e0, const bool e1, const bool btn) {
129-
return tickRaw(e0 | (e1 << 1), btn);
114+
bool tickRaw(const bool e0, const bool e1, bool btn) {
115+
return _tickRaw(btn, pollEnc(e0, e1));
130116
}
131117

132-
// обработка без сброса событий и вызова коллбэка
133-
bool tickRaw(int8_t state, bool btn) {
134-
btn = VirtButton::tickRaw(btn);
118+
// обработка без сброса событий и вызова коллбэка (кнопка)
119+
bool tickRaw(const bool btn) {
120+
return _tickRaw(btn);
121+
}
135122

123+
// ===================== PRIVATE =====================
124+
protected:
125+
#ifndef EB_FAST_TIME
126+
uint8_t EB_FAST_T = 30;
127+
#endif
128+
129+
#ifndef EB_NO_BUFFER
130+
uint16_t ebuffer = 0;
131+
#endif
132+
133+
private:
134+
bool _checkFast() {
135+
uint16_t ms = EB_uptime();
136+
bool f = ms - tmr < EB_FAST_T;
137+
tmr = ms;
138+
return f;
139+
}
140+
141+
inline bool _tick(bool f) {
142+
#ifndef EB_NO_CALLBACK
143+
if (f || timeoutState()) call(true);
144+
#endif
145+
return f;
146+
}
147+
148+
bool _tickRaw(bool btn, int8_t estate = 0) {
136149
bool encf = 0;
137150
#ifdef EB_NO_BUFFER
138151
if (ef.read(EB_ISR_F)) {
@@ -147,9 +160,9 @@ class VirtEncButton : public VirtButton, public VirtEncoder {
147160
encf = 1;
148161
}
149162
#endif
150-
else if ((state >= 0) && (state = VirtEncoder::pollEnc(state))) {
151-
ef.write(EB_DIR, state > 0);
152-
ef.write(EB_FAST, checkFast());
163+
else if (estate) {
164+
ef.write(EB_DIR, estate > 0);
165+
ef.write(EB_FAST, _checkFast());
153166
encf = 1;
154167
}
155168
if (encf) {
@@ -158,30 +171,6 @@ class VirtEncButton : public VirtButton, public VirtEncoder {
158171
if (!bf.read(EB_TOUT)) bf.set(EB_TOUT); // таймаут
159172
ef.set(EB_ETRN_R); // флаг поворота
160173
}
161-
return encf | btn;
162-
}
163-
164-
// обработка без сброса событий и вызова коллбэка (кнопка)
165-
bool tickRaw(const bool btn) {
166-
return tickRaw(-1, btn);
167-
}
168-
169-
// ===================== PRIVATE =====================
170-
protected:
171-
#ifndef EB_FAST_TIME
172-
uint8_t EB_FAST_T = 30;
173-
#endif
174-
175-
#ifndef EB_NO_BUFFER
176-
uint16_t ebuffer = 0;
177-
#endif
178-
179-
private:
180-
bool checkFast() {
181-
uint16_t ms = EB_uptime();
182-
bool f = 0;
183-
if (ms - tmr < EB_FAST_T) f = 1;
184-
tmr = ms;
185-
return f;
174+
return VirtButton::tickRaw(btn) | encf;
186175
}
187176
};

0 commit comments

Comments
 (0)