Skip to content

Commit 0bd5f04

Browse files
committed
reduced flash required
removed string requirement used paged arrays for events increased to VER-2.0.0
1 parent 8e3c429 commit 0bd5f04

File tree

3 files changed

+37
-73
lines changed

3 files changed

+37
-73
lines changed

include/EZButton.h

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
#include <Arduino.h>
55

6+
#define EVENT_COUNT 4
67
enum EventTypes
78
{
89
PRESSED,
@@ -14,34 +15,32 @@ enum EventTypes
1415
class EZButton
1516
{
1617
public:
17-
unsigned long HoldTreshHold;
18-
unsigned long HoldInterval;
18+
unsigned int HoldTreshHold;
19+
unsigned int HoldInterval;
1920

20-
EZButton(const String buttonNames[],
21-
void (*readButtons)(String *, bool *, int),
22-
unsigned long holdTreshold = 500,
23-
unsigned long holdInterval = 500);
21+
EZButton(int buttonCount,
22+
void (*readButtons)(bool *, int),
23+
unsigned int holdTreshold = 500,
24+
unsigned int holdInterval = 500);
2425

2526
~EZButton();
2627

2728
void Reset();
2829
void CheckButtons();
29-
void Subscribe(String buttonName, void (*event)(), EventTypes type);
30+
void Subscribe(int index, void (*event)(), EventTypes type);
3031

3132
private:
3233
int _numButtons;
33-
String *_buttons;
3434

3535
unsigned long *_buttonDownMillis;
3636
unsigned int *_lastHoldInterval;
3737
bool *_buttonLastState;
3838

3939
typedef void (*Event)(); // Type alias for function pointer
40-
Event *_onPressedEvents;
41-
Event *_onReleaseEvents;
42-
Event *_onHoldReleaseEvents;
43-
Event *_onHoldEvents;
44-
void (*_readButtons)(String *, bool *, int);
40+
Event *_events;
41+
void (*_readButtons)(bool *, int);
42+
43+
void CallEvent(int index, EventTypes type);
4544
};
4645

4746
#endif // EZButton_H

library.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "EZButton",
3-
"version": "1.0.1",
3+
"version": "2.0.0",
44
"description": "A Library for managing different button events. Events include: OnPressed, OnReleased, OnHold, OnHoldReleased.",
55
"keywords": "button, key, event, hold, press, release",
66
"repository":

src/EZButton.cpp

Lines changed: 24 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,31 @@
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

3423
EZButton::~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

4631
void EZButton::Reset()
@@ -56,7 +41,7 @@ void EZButton::Reset()
5641
void 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

Comments
 (0)