-
Notifications
You must be signed in to change notification settings - Fork 1
/
WS2812Node.cpp
122 lines (112 loc) · 3.79 KB
/
WS2812Node.cpp
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
/*
* WS2812Node.cpp
*
* Created on: 19.09.2017
* Author: ian
*/
#include <WS2812Node.h>
#include <LoggerNode.h>
#define LED_COUNT 24
#define LED_PIN 12
// vVv - initialize static variables - vVv
HomieSetting<long> WS2812Node::wsPin("WS2812N_Pin", "Output pin for WS2812 strip");
HomieSetting<long> WS2812Node::wsNumber("WS2812N_Count", "Count of connected WS2812 LED");
//HomieSetting<bool> WS2812Node::ws800kHz("WS2812N_800k", "Enable 800kHz Mode");
bool WS2812Node::settingsInitialized(false);
// ^^^ end of static part ^^^
WS2812Node::WS2812Node(const char* name, uint8_t _mode, neoPixelType type, int8_t pin, int16_t count) :
HomieNode(name, "WS-LED-Strip"),
customPin(pin),
customCount(count),
ws2812fx(LED_COUNT, LED_PIN, type) {
if (!settingsInitialized) {
settingsInitialized = true;
wsPin.setDefaultValue(LED_PIN).setValidator([] (long candidate) {
return (candidate >= 0 && candidate < 16);
});
wsNumber.setDefaultValue(LED_COUNT).setValidator([] (long candidate) {
return (candidate > 0 && candidate < 255);
});
// ws800kHz.setDefaultValue(true);
}
ws2812fx.setMode(_mode);
advertise("mode").settable();
advertise("speed").settable();
advertise("brightness").settable();
}
void WS2812Node::setup() {
ws2812fx.setPin(customPin==-1 ? wsPin.get(): customPin);
ws2812fx.setLength(customCount==-1 ? wsNumber.get() : customCount);
ws2812fx.init();
ws2812fx.setBrightness(BRIGHTNESS_MAX);
ws2812fx.setSpeed(210);
ws2812fx.setColor(255, 160,5);
ws2812fx.start();
ws2812fx.service();
}
void WS2812Node::loop() {
ws2812fx.service();
}
void WS2812Node::onReadyToOperate() {
setProperty("mode").send(ws2812fx.getModeName(ws2812fx.getMode()));
}
bool WS2812Node::handleInput(const String& property, const HomieRange& range, const String& value) {
LN.logf("WS2812::handleInput", LoggerNode::DEBUG, "new input: %s, %s", property.c_str(), value.c_str());
if (property.equals("mode")) {
uint8_t new_mode = 0;
if (value.equals("next")) {
new_mode = ws2812fx.getMode() + 1;
} else if (value.equals("prev")) {
new_mode = ws2812fx.getMode() - 1;;
} else {
new_mode = value.toInt();
if (new_mode==0) {
LN.log("WS2812::handleInput", LoggerNode::WARNING, "Invalid mode received");
return false;
}
}
if (new_mode >= MODE_COUNT) new_mode = 1;
if (new_mode < 1) new_mode = MODE_COUNT-1;
LN.logf("WS2812::handleInput", LoggerNode::DEBUG, "New mode: %x", new_mode);
ws2812fx.setMode(new_mode);
setProperty("mode").send(ws2812fx.getModeName(ws2812fx.getMode()));
switch (ws2812fx.getMode()) {
case FX_MODE_BREATH: // Breath mode
LN.log("WS2812::handleInput", LoggerNode::INFO, "Breath mode");
ws2812fx.setColor(255,200,9);
ws2812fx.setSpeed(200);
break;
case FX_MODE_FIRE_FLICKER:
case FX_MODE_FIRE_FLICKER_SOFT: // Fire flicker
case FX_MODE_FIRE_FLICKER_INTENSE: // (intense)
LN.log("WS2812::handleInput", LoggerNode::INFO, "Fire flicker mode");
//ws2812fx.setColor(255, 69,3);
ws2812fx.setColor(255, 160,5);
ws2812fx.setSpeed(210);
break;
default: // nothing to do
break;
}
return true;
}
if (property.equals("brightness")) {
uint8_t new_brightness = value.toInt();
if ((new_brightness < 0) || (new_brightness > 100)) {
LN.log("WS2812::handleInput", LoggerNode::WARNING, "Invalid brightness received");
return false;
}
ws2812fx.setBrightness(new_brightness);
setProperty("brightness").send(String(ws2812fx.getBrightness()));
}
if (property.equals("speed")) {
uint8_t new_speed = value.toInt();
if (new_speed < 10) {
LN.logf(__PRETTY_FUNCTION__, LoggerNode::WARNING, "Invalid speed [%s] received", value.c_str());
return false;
}
ws2812fx.setSpeed(new_speed);
setProperty("speed").send(String(ws2812fx.getSpeed()));
}
//TODO: Color
return false;
}