-
Notifications
You must be signed in to change notification settings - Fork 0
/
OnixartsIO.h
180 lines (156 loc) · 4.97 KB
/
OnixartsIO.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
// Onixarts_IO is an input/output helper library for Arduino
//
// Github: https://github.com/Onixarts/Onixarts_IO
// Author's site: http://onixarts.pl
// Contact: [email protected]
//
// Copyright (C) 2017 Bartosz Rosa (onixarts.pl)
//
// This program is free software : you can redistribute it and / or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program.If not, see <http://www.gnu.org/licenses/>.
#ifndef _OnixartsIO_h
#define _OnixartsIO_h
#include "Arduino.h"
#include <OnixartsTaskManager.h>
#include <OnixartsFSM.h>
namespace Onixarts
{
namespace Tools
{
namespace IO
{
namespace Event
{
static const byte None = 0;
static const byte On = 1;
static const byte Off = 2;
static const byte Toggle = 3;
static const byte Blink = 4;
}
class DigitalOutput: public Onixarts::Tools::TaskManager::Manager<2>
{
protected:
byte m_outputPin;
byte m_outputActiveLevel;
bool m_isBlinkingModeEnabled;
byte m_scheduledEvent;
BEGIN_TASK(BlinkingTask, 1000, TaskManager::TaskState::Stopped, 1, DigitalOutput)
void OnStart()
{
GetParent().On();
}
void OnExecute()
{
if (m_repeatIndex < m_repeatCount - 1)
GetParent().Toggle();
}
void OnStop()
{
GetParent().Off();
}
END_TASK(blinkingTask)
//----------------------------------------------------------
BEGIN_TASK(DelayTask, 1000, TaskManager::TaskState::Stopped, 1, DigitalOutput)
void OnExecute()
{
switch (GetParent().m_scheduledEvent)
{
case Event::On: GetParent().Activate(); break;
case Event::Off: GetParent().Deactivate(); break;
case Event::Toggle: GetParent().Toggle(); break;
case Event::Blink: GetParent().blinkingTask.Start(); break;
}
}
END_TASK(delayTask)
void Activate();
void Deactivate();
virtual void OnStateChanged() {};
public:
DigitalOutput(byte outputPin, bool outputActiveLevelHigh = true);
void SetOutputActiveLevel(bool outputActiveLevelHigh) { m_outputActiveLevel = outputActiveLevelHigh ? HIGH : LOW; }
void Init();
void On(unsigned long delay = 0);
void Off(unsigned long delay = 0);
void Toggle(unsigned long delay = 0);
void Blink(unsigned long duration = 1000, int repeatCount = 1, unsigned long delay = 0);
bool IsActive();
};
// ----------------------------------------------------------------------------------------------
namespace DigitalInputState
{
const byte Inactive = 0;
const byte Debouncing = 1;
const byte Pressed = 2;
const byte PressedAndHolding = 3;
const byte Held400ms = 4;
const byte Held400msAndHolding = 5;
const byte Held1s = 6;
const byte Held1sAndHolding = 7;
const byte Held4s = 8;
const byte Held4sAndHolding = 9;
}
//-------------------------------------------------------------
class SimpleDigitalInput
{
protected:
byte m_inputPin;
bool m_enablePullUpResistor;
byte m_inputActiveLevel;
byte m_currentState;
//---------------------------------------------------------
void Pressed() { OnPressed(); };
void Released() { OnReleased(); };
virtual void OnPressed() {};
virtual void OnReleased() {};
bool IsInputActive();
public:
SimpleDigitalInput(byte inputPin, bool enablePullUpResistor = false, byte inputActiveLevel = HIGH);
void Init();
virtual void Update();
bool IsPressed();
};
class DigitalInput : public SimpleDigitalInput
{
protected:
//---------------------------------------------------------
BEGIN_TASK(DebouncingTask, 20, TaskManager::TaskState::Stopped, 1, DigitalInput);
void OnStop()
{
if (GetParent().IsInputActive())
{
GetParent().m_currentState++;
}
}
END_TASK(debouncingTask)
void ReleasedBefore400ms() { OnReleasedBefore400ms(); };
void Held400ms() { OnHeld400ms(); };
void ReleasedAfter400ms() { OnReleasedAfter400ms(); };
void Held1s() { OnHeld1s(); };
void ReleasedAfter1s() { OnReleasedAfter1s(); };
void Held4s() { OnHeld4s(); };
void ReleasedAfter4s() { OnReleasedAfter4s(); };
virtual void OnReleasedBefore400ms() {};
virtual void OnHeld400ms() {};
virtual void OnReleasedAfter400ms() {};
virtual void OnHeld1s() {};
virtual void OnReleasedAfter1s() {};
virtual void OnHeld4s() {};
virtual void OnReleasedAfter4s() {};
public:
DigitalInput(byte inputPin, bool enablePullUpResistor = false, byte inputActiveLevel = HIGH);
virtual void Update();
};
}
}
}
#endif