@@ -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