Skip to content

Commit f5880a5

Browse files
committed
Add configurable sliders
1 parent e3c9b88 commit f5880a5

File tree

8 files changed

+109
-34
lines changed

8 files changed

+109
-34
lines changed

data/config.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{}

data/index.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ p {
1515
box-shadow: none !important;
1616
}
1717

18-
.speedSlider, .saturationSlider {
18+
.slider {
1919
margin: 28px 40px;
2020
}
2121

data/index.htm

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,7 @@ <h1 style="text-align: center">FastLED Manager</h1>
3333
onclick="ws_pending_msg = [2]">Stop</button>
3434
</div>
3535

36-
<div class="speedSlider" id="speed"></div>
37-
<div class="saturationSlider" id="saturation"></div>
36+
<div id="slidersWrapper"></div>
3837

3938
<div id="accordion">
4039
<div class="card">

data/index.js

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,9 @@ connection.onclose = function (e) {
2525

2626
connection.onmessage = function (e) {
2727
console.log('Received: ', e.data);
28-
29-
try {
30-
handleJsonData(JSON.parse(e.data));
31-
32-
connectingOverlayText.innerHTML = 'Success!';
33-
connectingOverlay.style.display = 'none';
34-
} catch (e) { }
28+
handleJsonData(JSON.parse(e.data));
29+
connectingOverlayText.innerHTML = 'Success!';
30+
connectingOverlay.style.display = 'none';
3531
};
3632

3733
function handleJsonData(data) {
@@ -51,7 +47,27 @@ function handleJsonData(data) {
5147
btn.onclick = () => { sendAnimationButton(idx); };
5248
animationButtons.insertBefore(btn, stopButton);
5349
}
54-
})
50+
});
51+
}
52+
53+
if (data.hasOwnProperty('sliders')) {
54+
data.sliders.forEach((slider, idx) => {
55+
let sliderDiv = document.createElement('div')
56+
sliderDiv.classList.add('slider')
57+
noUiSlider.create(sliderDiv, {
58+
start: slider.value,
59+
step: slider.step,
60+
range: {
61+
'min': slider.min,
62+
'max': slider.max
63+
}
64+
});
65+
sliderDiv.querySelector(".noUi-handle").innerHTML = slider.name;
66+
sliderDiv.noUiSlider.on('update', (values, handle) => {
67+
ws_pending_msg = [20, idx, values[handle]];
68+
});
69+
document.getElementById('slidersWrapper').appendChild(sliderDiv);
70+
});
5571
}
5672

5773
if (data.hasOwnProperty('alarmAnimation'))
@@ -85,10 +101,6 @@ function handleJsonData(data) {
85101
sunsetDuration.value = data.sunsetDuration;
86102
if (data.hasOwnProperty('sunsetOffset'))
87103
sunsetOffset.value = data.sunsetOffset;
88-
if (data.hasOwnProperty('speed'))
89-
speed.noUiSlider.set(data.speed);
90-
if (data.hasOwnProperty('saturation'))
91-
saturation.noUiSlider.set(data.saturation);
92104
if (data.hasOwnProperty('color')) {
93105
colorButton.value = data.color;
94106
currentColor = data.color;
@@ -154,8 +166,6 @@ function sendConfig() {
154166
sunsetOffset: sunsetOffset.value,
155167
sunsetAnimation: sunsetAnimation.value,
156168
startupAnimation: useStartupAnimation.checked ? startupAnimation.value : '',
157-
speed: speed.noUiSlider.get(),
158-
saturation: saturation.noUiSlider.get(),
159169
color: currentColor
160170
}, null, 2);
161171
sendText(json);
@@ -221,14 +231,6 @@ let $customColorPicker = $('#colorButton').colorPicker({
221231
}
222232
});
223233

224-
// Sliders
225-
noUiSlider.create(speed, { start: 128, step: 1, range: { 'min': 0, 'max': 255 } });
226-
noUiSlider.create(saturation, { start: 255, step: 1, range: { 'min': 110, 'max': 255 } });
227-
speed.noUiSlider.on('update', (values, handle) => { ws_pending_msg = [20, values[handle]]; });
228-
saturation.noUiSlider.on('update', (values, handle) => { ws_pending_msg = [21, values[handle]]; });
229-
document.querySelector('#speed .noUi-handle').innerHTML = 'Speed';
230-
document.querySelector('#saturation .noUi-handle').innerHTML = 'Sat.';
231-
232234
// Close connection after being ianctive for 5 minutes
233235
let idleTime = 0;
234236
setInterval(() => {

src/FastLEDManager.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,11 @@ void FastLEDManagerClass::delay(uint16_t ms)
139139
}
140140
}
141141

142+
void FastLEDManagerClass::registerSlider(Slider *slider)
143+
{
144+
sliders.add(slider);
145+
}
146+
142147
void FastLEDManagerClass::registerAnimation(Animation *animation)
143148
{
144149
animations.add(animation);
@@ -161,6 +166,23 @@ Animation* FastLEDManagerClass::getAnimation(uint8_t i)
161166
return (i < animations.size()) ? animations.get(i) : NULL;
162167
}
163168

169+
Slider* FastLEDManagerClass::getSlider(String name)
170+
{
171+
for (uint8_t i = 0; i < sliders.size(); i++)
172+
{
173+
Slider *a = sliders.get(i);
174+
if (a->name == name)
175+
return a;
176+
}
177+
178+
return NULL;
179+
}
180+
181+
Slider* FastLEDManagerClass::getSlider(uint8_t i)
182+
{
183+
return (i < sliders.size()) ? sliders.get(i) : NULL;
184+
}
185+
164186
void FastLEDManagerClass::handleInput()
165187
{
166188
if (potentiometerPin >= 0 && Fade::currentFade == Fade::FadeMode::NONE)

src/FastLEDManager.h

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include "Animation.h"
44
#include "ColorUtils.h"
55
#include "Config.h"
6+
#include "Slider.h"
67

78
#include <Arduino.h>
89
#define FASTLED_INTERNAL
@@ -48,6 +49,10 @@ class FastLEDManagerClass : public CFastLED
4849
/// @param pin Potentiometer pin
4950
void enablePotentiometer(uint8_t pin);
5051

52+
/// Register a slider instance which can be used as a dynamic animation parameter
53+
/// @param slider Slider instance
54+
void registerSlider(Slider *slider);
55+
5156
/// Register an animation instance to be managed by FastLEDManager
5257
/// @param animation Pointer to animation instance
5358
void registerAnimation(Animation *animation);
@@ -66,6 +71,16 @@ class FastLEDManagerClass : public CFastLED
6671
/// @return Pointer to animation
6772
Animation *getAnimation(uint8_t i);
6873

74+
/// Return a pointer to a slider by name
75+
/// @param name Slider name
76+
/// @return Pointer to slider
77+
Slider *getSlider(String name);
78+
79+
/// Return a pointer to a slider by index
80+
/// @param i Slider index
81+
/// @return Pointer to slider
82+
Slider *getSlider(uint8_t i);
83+
6984
/// Perform gamma correction on the brightness value and use four neighboring
7085
/// pixels to further increase the perceived brightness
7186
/// @param bright10 10 bit brightness value
@@ -118,9 +133,12 @@ class FastLEDManagerClass : public CFastLED
118133
/// calling this method will have no effect.
119134
void resume();
120135

121-
/// List of all registered animations
136+
/// List of all registered animation pointers
122137
LinkedList<Animation*> animations;
123138

139+
/// List of all registered slider pointers
140+
LinkedList<Slider*> sliders;
141+
124142
/// Pointer to current animation object
125143
Animation *currentAnimation;
126144

src/Slider.h

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#include <Arduino.h>
2+
3+
4+
class Slider
5+
{
6+
public:
7+
String name;
8+
int16_t min;
9+
int16_t max;
10+
int16_t value;
11+
int16_t step;
12+
13+
Slider(String _name,
14+
int16_t _min,
15+
int16_t _max,
16+
int16_t _value,
17+
int16_t _step) : name(_name),
18+
min(_min),
19+
max(_max),
20+
value(_value),
21+
step(_step)
22+
{
23+
24+
}
25+
};

src/WebSocket.cpp

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,9 @@ void handleBinary(uint8_t *binary, uint8_t id)
7979
case 2: // Stop
8080
FastLEDManager.stop();
8181
break;
82-
case 10: // Spectroscope data
83-
if (FastLEDManager.currentAnimation)
84-
FastLEDManager.stop();
82+
case 10: // Color data
83+
FastLEDManager.stop();
84+
Fade::stop();
8585
for (uint16_t i = 0; i < FastLEDManager.numLeds; i++)
8686
FastLEDManager.leds[i] = CRGB(binary[1 + i * 3], binary[2 + i * 3], binary[3 + i * 3]);
8787
break;
@@ -91,11 +91,8 @@ void handleBinary(uint8_t *binary, uint8_t id)
9191
case 12: // Symmetrical spectroscope data
9292
Spectroscope::updateSpectroscope(binary + 1, true);
9393
break;
94-
case 20: // Speed
95-
Config.speed = binary[1];
96-
break;
97-
case 21: // Saturation
98-
Config.saturation = binary[1];
94+
case 20: // Slider data
95+
FastLEDManager.getSlider(binary[1])->value = binary[2];
9996
break;
10097
case 30: // Request configuration
10198
DynamicJsonDocument doc(2048);
@@ -107,6 +104,17 @@ void handleBinary(uint8_t *binary, uint8_t id)
107104
{
108105
animations.add(FastLEDManager.animations.get(i)->getName());
109106
}
107+
JsonArray sliders = doc.createNestedArray("sliders");
108+
for (uint8_t i = 0; i < FastLEDManager.sliders.size(); i++)
109+
{
110+
// sliders.add(FastLEDManager.sliders.get(i).name);
111+
JsonObject slider = sliders.createNestedObject();
112+
slider["name"] = FastLEDManager.sliders.get(i)->name;
113+
slider["min"] = FastLEDManager.sliders.get(i)->min;
114+
slider["max"] = FastLEDManager.sliders.get(i)->max;
115+
slider["step"] = FastLEDManager.sliders.get(i)->step;
116+
slider["value"] = FastLEDManager.sliders.get(i)->value;
117+
}
110118
String buffer = "";
111119
serializeJson(doc, buffer);
112120
socket.sendTXT(id, buffer.c_str());

0 commit comments

Comments
 (0)