-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstrobe.cpp
More file actions
123 lines (113 loc) · 2.63 KB
/
strobe.cpp
File metadata and controls
123 lines (113 loc) · 2.63 KB
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
#include "strobe.h"
Strobe::Strobe(uint8_t pin, int pulse, int activeState, bool dimmable)
{
Serial.printf("New Strobe: pin=%d, dimmable:%d\r\n", pin, dimmable);
this->pin = pin;
this->pulse = pulse;
enabled = false;
this->activeState = activeState;
this->inactiveState = activeState == HIGH ? LOW : HIGH;
this->dimmable = dimmable;
interval = 0;
pinMode(pin, OUTPUT);
digitalWrite(pin, inactiveState);
}
void Strobe::setInterval(int millis)
{
period = millis;
if(period < 0) period = pulse;
}
void Strobe::setDuration(int millis)
{
pulse = millis;
if(pulse < 0) pulse = 0;
}
void Strobe::setPin(int number)
{
if(pin != number)
{
pinMode(pin, INPUT);
pin = number;
pinMode(pin, OUTPUT);
digitalWrite(pin, inactiveState);
}
}
void Strobe::handle()
{
unsigned long currentMillis = millis();
if (period <= pulse && enabled)
{
previousMillis = currentMillis;
if(state != activeState)
{
state = activeState;
if(dimmable)
{
analogWrite(pin, adjustedActiveValue);
}
else
{
digitalWrite(pin, state);
}
}
}
else
{
if (currentMillis - previousMillis >= interval && enabled)
{
previousMillis = currentMillis;
if (state == activeState)
{
state = inactiveState;
interval = period - pulse;
}
else
{
state = activeState;
interval = pulse;
}
if(dimmable)
{
analogWrite(pin, state == activeState ? adjustedActiveValue : adjustedInactiveValue);
}
else
{
digitalWrite(pin, state);
}
}
}
}
void Strobe::start()
{
if(!enabled)
{
interval = 0;
state = inactiveState;
enabled = true;
}
}
void Strobe::start(uint8_t value)
{
if(this->value != value)
{
this->value = value;
this->adjustedActiveValue = activeState == HIGH ? value : 255 - value;
this->adjustedInactiveValue = activeState == HIGH ? 0 : 255;
if(enabled && dimmable && state == activeState)
{
// if it is currently ON adjust the PWM value
analogWrite(pin, adjustedActiveValue);
}
}
if(!enabled)
{
interval = 0;
state = inactiveState;
enabled = true;
}
}
void Strobe::stop()
{
enabled = false;
digitalWrite(pin, inactiveState);
}