11#include " EZButton.h"
22
3- EZButton::EZButton (const String buttonNames[] ,
4- void (*readButtons)(String *, bool *, int ),
5- unsigned long holdTreshold,
6- unsigned long holdInterval)
3+ EZButton::EZButton (int buttonCount ,
4+ void (*readButtons)(bool *, int ),
5+ unsigned int holdTreshold,
6+ unsigned int holdInterval)
77{
8- _numButtons = buttonNames-> length () - 1 ;
8+ _numButtons = buttonCount ;
99 HoldTreshHold = holdTreshold;
1010 HoldInterval = holdInterval;
1111 _readButtons = readButtons;
12- _buttons = new String[_numButtons];
13- _onPressedEvents = new Event[_numButtons];
14- _onReleaseEvents = new Event[_numButtons];
15- _onHoldReleaseEvents = new Event[_numButtons];
16- _onHoldEvents = new Event[_numButtons];
12+ _events = new Event[_numButtons * EVENT_COUNT];
1713 _buttonDownMillis = new unsigned long [_numButtons];
1814 _buttonLastState = new bool [_numButtons];
1915 _lastHoldInterval = new unsigned int [_numButtons];
2016
21- for (int i = 0 ; i < _numButtons; i++)
22- {
23- _buttons[i] = buttonNames[i];
24- _onPressedEvents[i] = nullptr ;
25- _onReleaseEvents[i] = nullptr ;
26- _onHoldReleaseEvents[i] = nullptr ;
27- _onHoldEvents[i] = nullptr ;
28- _buttonDownMillis[i] = 0 ;
29- _buttonLastState[i] = false ;
30- _lastHoldInterval[i] = 0 ;
31- }
17+ for (int i = 0 ; i < _numButtons * EVENT_COUNT; i++)
18+ _events[i] = nullptr ;
19+
20+ Reset ();
3221}
3322
3423EZButton::~EZButton ()
3524{
36- delete[] _buttons;
3725 delete[] _buttonDownMillis;
3826 delete[] _buttonLastState;
3927 delete[] _lastHoldInterval;
40- delete[] _onPressedEvents;
41- delete[] _onReleaseEvents;
42- delete[] _onHoldEvents;
43- delete[] _onHoldReleaseEvents;
28+ delete[] _events;
4429}
4530
4631void EZButton::Reset ()
@@ -56,7 +41,7 @@ void EZButton::Reset()
5641void EZButton::CheckButtons ()
5742{
5843 bool *buttonStates = new bool [_numButtons];
59- _readButtons (_buttons, buttonStates, _numButtons);
44+ _readButtons (buttonStates, _numButtons);
6045
6146 for (int i = 0 ; i < _numButtons; i++)
6247 {
@@ -66,17 +51,15 @@ void EZButton::CheckButtons()
6651 {
6752 _buttonDownMillis[i] = millis ();
6853 _buttonLastState[i] = 1 ;
69- if (_onPressedEvents[i] != nullptr )
70- _onPressedEvents[i]();
54+ CallEvent (i, EventTypes::PRESSED);
7155 }
7256 else if (millis () - _buttonDownMillis[i] > HoldTreshHold)
7357 {
7458 unsigned long interval = (millis () - _buttonDownMillis[i]) / HoldInterval;
7559 if (interval > _lastHoldInterval[i])
7660 {
7761 _lastHoldInterval[i] = interval;
78- if (_onHoldEvents[i] != nullptr )
79- _onHoldEvents[i]();
62+ CallEvent (i, EventTypes::HOLD);
8063 }
8164 }
8265 }
@@ -87,42 +70,24 @@ void EZButton::CheckButtons()
8770 _buttonLastState[i] = 0 ;
8871 _lastHoldInterval[i] = 0 ;
8972 if (millis () - _buttonDownMillis[i] > HoldTreshHold)
90- {
91- if (_onHoldReleaseEvents[i] != nullptr )
92- _onHoldReleaseEvents[i]();
93- }
73+ CallEvent (i, EventTypes::HOLD_RELEASE);
9474 else
95- {
96- if (_onReleaseEvents[i] != nullptr )
97- _onReleaseEvents[i]();
98- }
75+ CallEvent (i, EventTypes::RELEASE);
9976 }
10077 }
10178 }
10279
10380 delete[] buttonStates;
10481}
10582
106- void EZButton::Subscribe (String buttonName , void (*event)(), EventTypes type)
83+ void EZButton::Subscribe (int index , void (*event)(), EventTypes type)
10784{
108- int i = 0 ;
109- for (; i < _numButtons; i++)
110- if (_buttons[i].equals (buttonName))
111- break ;
85+ _events[index + type * EVENT_COUNT] = event;
86+ }
11287
113- switch (type)
114- {
115- case EventTypes::PRESSED:
116- _onPressedEvents[i] = event;
117- break ;
118- case EventTypes::HOLD_RELEASE:
119- _onHoldReleaseEvents[i] = event;
120- break ;
121- case EventTypes::RELEASE:
122- _onReleaseEvents[i] = event;
123- break ;
124- case EventTypes::HOLD:
125- _onHoldEvents[i] = event;
126- break ;
127- }
88+ void EZButton::CallEvent (int index, EventTypes type)
89+ {
90+ int i = index + type * EVENT_COUNT;
91+ if (_events[i] != nullptr )
92+ _events[i]();
12893}
0 commit comments