Skip to content

Commit 20186f0

Browse files
committed
removed platformio.ini
added EZButton.h and .cpp added library.json
1 parent 61f1a79 commit 20186f0

File tree

6 files changed

+191
-32
lines changed

6 files changed

+191
-32
lines changed

include/EZButton.h

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
#ifndef EZButton_H
2+
#define EZButton_H
3+
4+
#include <Arduino.h>
5+
6+
enum EventTypes
7+
{
8+
PRESSED,
9+
HOLD,
10+
HOLD_RELEASE,
11+
RELEASE
12+
};
13+
14+
class EZButton
15+
{
16+
public:
17+
ulong long HoldTreshHold;
18+
ulong HoldInterval;
19+
20+
EZButton(const String buttonNames[],
21+
bool *(*readButtons)(String *, int),
22+
ulong holdTreshold = 500,
23+
ulong holdInterval = 500);
24+
25+
~EZButton();
26+
27+
void CheckButtons();
28+
void Subscribe(String buttonName, void (*event)(), EventTypes type);
29+
30+
private:
31+
int _numButtons;
32+
String *_buttons;
33+
34+
unsigned long *_buttonDownMillis;
35+
unsigned int *_lastHoldInterval;
36+
bool *_buttonLastState;
37+
38+
typedef void (*Event)(); // Type alias for function pointer
39+
Event *_onPressedEvents;
40+
Event *_onReleaseEvents;
41+
Event *_onHoldReleaseEvents;
42+
Event *_onHoldEvents;
43+
bool *(*_readButtons)(String *, int);
44+
};
45+
46+
#endif // EZButton_H

library.json

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
{
2+
"name": "EZButton",
3+
"version": "1.0.0",
4+
"description": "A Library for managing different button events. Events include: OnPressed, OnReleased, OnHold, OnHoldReleased.",
5+
"keywords": "button, key, event, hold, press, release",
6+
"repository":
7+
{
8+
"type": "git",
9+
"url": "https://github.com/IPdotSetAF/EZButton.git"
10+
},
11+
"authors":
12+
[
13+
{
14+
"name": "Mohammad Mahdi Nazari",
15+
"email": "[email protected]",
16+
"url": "https://www.ip-af.ir/contact",
17+
"maintainer": true
18+
}
19+
],
20+
"license": "GPL-V3",
21+
"homepage": "https://www.ip-af.ir/Projects/Electronics/EZButton",
22+
"dependencies": {
23+
},
24+
"frameworks": "*",
25+
"platforms": "*"
26+
}

platformio.ini

Lines changed: 0 additions & 14 deletions
This file was deleted.

src/EZButton.cpp

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
#include "EZButton.h"
2+
3+
EZButton::EZButton(const String buttonNames[],
4+
bool *(*readButtons)(String *, int),
5+
ulong holdTreshold,
6+
ulong holdInterval)
7+
{
8+
_numButtons = buttonNames->length() - 1;
9+
HoldTreshHold = holdTreshold;
10+
HoldInterval = holdInterval;
11+
_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];
17+
_buttonDownMillis = new unsigned long[_numButtons];
18+
_buttonLastState = new bool[_numButtons];
19+
_lastHoldInterval = new unsigned int[_numButtons];
20+
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+
}
32+
}
33+
34+
EZButton::~EZButton()
35+
{
36+
delete[] _buttons;
37+
delete[] _buttonDownMillis;
38+
delete[] _buttonLastState;
39+
delete[] _lastHoldInterval;
40+
delete[] _onPressedEvents;
41+
delete[] _onReleaseEvents;
42+
delete[] _onHoldEvents;
43+
delete[] _onHoldReleaseEvents;
44+
}
45+
46+
void EZButton::CheckButtons()
47+
{
48+
bool *buttonStates = _readButtons(_buttons, _numButtons);
49+
50+
for (int i = 0; i < _numButtons; i++)
51+
{
52+
if (buttonStates[i])
53+
{
54+
if (!_buttonLastState[i])
55+
{
56+
_buttonDownMillis[i] = millis();
57+
_buttonLastState[i] = 1;
58+
if (_onPressedEvents[i] != nullptr)
59+
_onPressedEvents[i]();
60+
}
61+
else if (millis() - _buttonDownMillis[i] > HoldTreshHold)
62+
{
63+
int interval = (millis() - _buttonDownMillis[i]) / HoldInterval;
64+
if (interval > _lastHoldInterval[i])
65+
{
66+
_lastHoldInterval[i] = interval;
67+
if (_onHoldEvents[i] != nullptr)
68+
_onHoldEvents[i]();
69+
}
70+
}
71+
}
72+
else
73+
{
74+
if (_buttonLastState[i])
75+
{
76+
_buttonLastState[i] = 0;
77+
_lastHoldInterval[i] = 0;
78+
if (millis() - _buttonDownMillis[i] > HoldTreshHold)
79+
{
80+
if (_onHoldReleaseEvents[i] != nullptr)
81+
_onHoldReleaseEvents[i]();
82+
}
83+
else
84+
{
85+
if (_onReleaseEvents[i] != nullptr)
86+
_onReleaseEvents[i]();
87+
}
88+
}
89+
}
90+
}
91+
92+
delete[] buttonStates;
93+
}
94+
95+
void EZButton::Subscribe(String buttonName, void (*event)(), EventTypes type)
96+
{
97+
int i = 0;
98+
for (; i < _numButtons; i++)
99+
if (_buttons[i].equals(buttonName))
100+
break;
101+
102+
switch (type)
103+
{
104+
case EventTypes::PRESSED:
105+
_onPressedEvents[i] = event;
106+
break;
107+
case EventTypes::HOLD_RELEASE:
108+
_onHoldReleaseEvents[i] = event;
109+
break;
110+
case EventTypes::RELEASE:
111+
_onReleaseEvents[i] = event;
112+
break;
113+
case EventTypes::HOLD:
114+
_onHoldEvents[i] = event;
115+
break;
116+
}
117+
}

src/README

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
2+
This directory is intended for project source files.

src/main.cpp

Lines changed: 0 additions & 18 deletions
This file was deleted.

0 commit comments

Comments
 (0)