@@ -64,8 +64,7 @@ class VirtEncButton : public VirtButton, public VirtEncoder {
64
64
65
65
// было действие с кнопки или энкодера, вернёт код события [событие]
66
66
uint16_t action () {
67
- if (turn ()) return EB_TURN;
68
- else return VirtButton::action ();
67
+ return turn () ? EB_TURN : VirtButton::action ();
69
68
}
70
69
71
70
// было действие с кнопки или энкодера, вернёт код события [событие]
@@ -77,23 +76,18 @@ class VirtEncButton : public VirtButton, public VirtEncoder {
77
76
// ISR
78
77
// обработка в прерывании (только энкодер). Вернёт 0 в покое, 1 или -1 при повороте
79
78
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 );
86
80
if (state) {
87
81
#ifdef EB_NO_BUFFER
88
82
ef.set (EB_ISR_F);
89
83
ef.write (EB_DIR, state > 0 );
90
- ef.write (EB_FAST, checkFast ());
84
+ ef.write (EB_FAST, _checkFast ());
91
85
#else
92
86
for (uint8_t i = 0 ; i < 15 ; i += 3 ) {
93
87
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
97
91
break ;
98
92
}
99
93
}
@@ -105,34 +99,53 @@ class VirtEncButton : public VirtButton, public VirtEncoder {
105
99
// TICK
106
100
// обработка энкодера и кнопки
107
101
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) {
113
102
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 )));
119
104
}
120
105
121
106
// обработка энкодера (в прерывании) и кнопки
122
107
bool tick (const bool btn) {
123
- return tick (-1 , btn);
108
+ clear ();
109
+ return _tick (_tickRaw (btn));
124
110
}
125
111
126
112
// RAW
127
113
// обработка без сброса событий и вызова коллбэка
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 ) );
130
116
}
131
117
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
+ }
135
122
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 ) {
136
149
bool encf = 0 ;
137
150
#ifdef EB_NO_BUFFER
138
151
if (ef.read (EB_ISR_F)) {
@@ -147,9 +160,9 @@ class VirtEncButton : public VirtButton, public VirtEncoder {
147
160
encf = 1 ;
148
161
}
149
162
#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 ());
153
166
encf = 1 ;
154
167
}
155
168
if (encf) {
@@ -158,30 +171,6 @@ class VirtEncButton : public VirtButton, public VirtEncoder {
158
171
if (!bf.read (EB_TOUT)) bf.set (EB_TOUT); // таймаут
159
172
ef.set (EB_ETRN_R); // флаг поворота
160
173
}
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;
186
175
}
187
176
};
0 commit comments