3.1.0.ALPHA1
This commit is contained in:
@@ -14,9 +14,6 @@
|
||||
#include <WiFiClient.h>
|
||||
#include <ESP8266mDNS.h>
|
||||
#include <FS.h>
|
||||
#if ENABLE_STATE_SAVE == 0
|
||||
#include <EEPROM.h>
|
||||
#endif
|
||||
#include <WebSockets.h> //https://github.com/Links2004/arduinoWebSockets
|
||||
#include <WebSocketsServer.h>
|
||||
|
||||
@@ -299,7 +296,12 @@ void initStrip(uint16_t stripSize = WS2812FXStripSettings.stripSize, char RGBOrd
|
||||
strip->setCustomShow(DMA_Show);
|
||||
#endif
|
||||
//parameters: index, start, stop, mode, color, speed, options
|
||||
strip->setSegment(selected_segment, 0, stripSize - 1, ws2812fx_mode, hex_colors_trans, convertSpeed(ws2812fx_speed), fxoptions);
|
||||
for (uint8_t seg=0; seg < num_segments; seg++) {
|
||||
(readStateSegmentFS(seg)) ? DBG_OUTPUT_PORT.println("Segment state config FS read Success!") : DBG_OUTPUT_PORT.println("Segment state config FS read failure!");
|
||||
strip->setSegment(seg, seg_start, seg_stop , ws2812fx_mode, hex_colors_trans, convertSpeed(ws2812fx_speed), fxoptions);
|
||||
}
|
||||
//strip->setSegment(0, 0, (stripSize - 1)/2, ws2812fx_mode, hex_colors_trans, convertSpeed(ws2812fx_speed), fxoptions);
|
||||
//strip->setSegment(1, ((stripSize - 1)/2) + 1, (stripSize - 1), ws2812fx_mode, hex_colors_trans, convertSpeed(ws2812fx_speed), fxoptions);
|
||||
strip->setCustomMode(0, F("Autoplay"), myCustomEffect0);
|
||||
strip->setCustomMode(1, F("Custom WS"), myCustomEffect1);
|
||||
#if defined(CUSTOM_WS2812FX_ANIMATIONS)
|
||||
@@ -308,6 +310,8 @@ void initStrip(uint16_t stripSize = WS2812FXStripSettings.stripSize, char RGBOrd
|
||||
strip->setCustomMode(4, F("Fire 2012"), myCustomEffect4);
|
||||
strip->setCustomMode(5, F("Gradient"), myCustomEffect5);
|
||||
gReverseDirection = (WS2812FXStripSettings.fxoptions & 128);
|
||||
DBG_OUTPUT_PORT.print("Number of Segments: ");
|
||||
DBG_OUTPUT_PORT.println(strip->getNumSegments());
|
||||
|
||||
if (e131 != NULL) { delete(e131); }
|
||||
e131 = new ESPAsyncE131(END_UNIVERSE - START_UNIVERSE + 1);
|
||||
@@ -394,9 +398,6 @@ void setup() {
|
||||
delay(500);
|
||||
DBG_OUTPUT_PORT.println("");
|
||||
DBG_OUTPUT_PORT.println("Starting...Main Setup");
|
||||
#if ENABLE_STATE_SAVE == 0
|
||||
EEPROM.begin(512);
|
||||
#endif
|
||||
// set builtin led pin as output
|
||||
pinMode(LED_BUILTIN, OUTPUT);
|
||||
// button pin setup
|
||||
@@ -444,16 +445,9 @@ void setup() {
|
||||
|
||||
#if defined(ENABLE_STATE_SAVE)
|
||||
//Strip Config
|
||||
#if ENABLE_STATE_SAVE == 1
|
||||
(readConfigFS()) ? DBG_OUTPUT_PORT.println("WiFiManager config FS read success!"): DBG_OUTPUT_PORT.println("WiFiManager config FS Read failure!");
|
||||
delay(250);
|
||||
(readStateFS()) ? DBG_OUTPUT_PORT.println("Strip state config FS read Success!") : DBG_OUTPUT_PORT.println("Strip state config FS read failure!");
|
||||
#endif
|
||||
#if ENABLE_STATE_SAVE == 0
|
||||
(setConfByConfString(readEEPROM(0, 222)))? DBG_OUTPUT_PORT.println("WiFiManager config EEPROM read success!"): DBG_OUTPUT_PORT.println("WiFiManager config EEPROM Read failure!");
|
||||
delay(250);
|
||||
(setModeByStateString(readEEPROM(256, 66)))? DBG_OUTPUT_PORT.println("Strip state config EEPROM read Success!") : DBG_OUTPUT_PORT.println("Strip state config EEPROM read failure!");
|
||||
#endif
|
||||
char tmp_strip_size[6], tmp_fxoptions[5], tmp_rgbOrder[5]; //needed tempararily for WiFiManager Settings
|
||||
WiFiManagerParameter custom_hostname("hostname", "Hostname", HOSTNAME, 64, " maxlength=64");
|
||||
#if defined(ENABLE_MQTT)
|
||||
@@ -547,22 +541,7 @@ void setup() {
|
||||
checkRGBOrder(tmp_rgbOrder);
|
||||
WS2812FXStripSettings.fxoptions = atoi(custom_fxoptions.getValue());
|
||||
if (updateConfig) {
|
||||
#if ENABLE_STATE_SAVE == 1
|
||||
(writeConfigFS(updateConfig)) ? DBG_OUTPUT_PORT.println("WiFiManager config FS Save success!"): DBG_OUTPUT_PORT.println("WiFiManager config FS Save failure!");
|
||||
#endif
|
||||
#if ENABLE_STATE_SAVE == 0
|
||||
char last_conf[225];
|
||||
DBG_OUTPUT_PORT.println("Saving WiFiManager config");
|
||||
#if defined(ENABLE_MQTT)
|
||||
snprintf(last_conf, sizeof(last_conf), "CNF|%64s|%64s|%5d|%32s|%32s|%4d|%2d|%4s|%3d|%1d", HOSTNAME, mqtt_host, mqtt_port, mqtt_user, mqtt_pass, WS2812FXStripSettings.stripSize, WS2812FXStripSettings.pin, WS2812FXStripSettings.RGBOrder, WS2812FXStripSettings.fxoptions, transEffect);
|
||||
#else
|
||||
snprintf(last_conf, sizeof(last_conf), "CNF|%64s|%64s|%5d|%32s|%32s|%4d|%2d|%4s|%3d|%1d", HOSTNAME, "", "", "", "", WS2812FXStripSettings.stripSize, WS2812FXStripSettings.pin, WS2812FXStripSettings.RGBOrder, WS2812FXStripSettings.fxoptions, transEffect);
|
||||
#endif
|
||||
last_conf[sizeof(last_conf)] = 0x00;
|
||||
writeEEPROM(0, 224, last_conf);
|
||||
EEPROM.commit();
|
||||
updateConfig = false;
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -775,15 +754,22 @@ void loop() {
|
||||
|
||||
if (mode == SET) {
|
||||
mode = HOLD;
|
||||
// Segment
|
||||
if (prevsegment != segment) {
|
||||
#if defined(ENABLE_MQTT)
|
||||
snprintf(mqtt_buf, sizeof(mqtt_buf), "OK S%i", segment);
|
||||
#endif
|
||||
prevsegment = segment;
|
||||
}
|
||||
// Mode
|
||||
if (ws2812fx_mode != strip->getMode(selected_segment)) { // SET_MODE
|
||||
if (ws2812fx_mode != strip->getMode(segment)) {
|
||||
#if defined(ENABLE_MQTT)
|
||||
snprintf(mqtt_buf, sizeof(mqtt_buf), "OK /%i", ws2812fx_mode);
|
||||
#endif
|
||||
strip->strip_off();
|
||||
autoCount = 0;
|
||||
autoDelay = 0;
|
||||
strip->setMode(selected_segment, ws2812fx_mode);
|
||||
strip->setMode(segment, ws2812fx_mode);
|
||||
}
|
||||
//Color
|
||||
/*if (memcmp(hex_colors_trans, strip->getColors(selected_segment), sizeof(hex_colors_trans)) != 0) {
|
||||
@@ -808,12 +794,11 @@ void loop() {
|
||||
|
||||
if (prevmode != mode) {
|
||||
convertColors();
|
||||
if (memcmp(hex_colors_trans, strip->getColors(selected_segment), sizeof(hex_colors_trans)) != 0) {
|
||||
DBG_OUTPUT_PORT.println("Colors not equal!");
|
||||
if (memcmp(hex_colors_trans, strip->getColors(segment), sizeof(hex_colors_trans)) != 0) {
|
||||
convertColorsFade();
|
||||
trans_cnt = 1;
|
||||
}
|
||||
strip->setSpeed(selected_segment, convertSpeed(ws2812fx_speed_actual));
|
||||
strip->setSpeed(segment, convertSpeed(ws2812fx_speed_actual));
|
||||
//strip->setBrightness(brightness_actual);
|
||||
if (prevmode != INIT_STRIP) { // do not save if INIT_STRIP mode was set
|
||||
#if defined(ENABLE_STATE_SAVE)
|
||||
@@ -836,33 +821,10 @@ void loop() {
|
||||
}
|
||||
#if defined(ENABLE_STATE_SAVE)
|
||||
if (updateState){
|
||||
#if ENABLE_STATE_SAVE == 1
|
||||
(writeStateFS(updateState)) ? DBG_OUTPUT_PORT.println(" State FS Save Success!") : DBG_OUTPUT_PORT.println("State FS Save failure!");
|
||||
#endif
|
||||
#if ENABLE_STATE_SAVE == 0
|
||||
writeEEPROM(384, 66, last_state); // 384 --> last_state (reserved 66 bytes)
|
||||
EEPROM.commit();
|
||||
updateState = false;
|
||||
settings_save_state.detach();
|
||||
#endif
|
||||
}
|
||||
if (updateConfig) {
|
||||
#if ENABLE_STATE_SAVE == 1
|
||||
(writeConfigFS(updateConfig)) ? DBG_OUTPUT_PORT.println("Config FS Save success!"): DBG_OUTPUT_PORT.println("Config FS Save failure!");
|
||||
#endif
|
||||
#if ENABLE_STATE_SAVE == 0
|
||||
char last_conf[225];
|
||||
#if defined(ENABLE_MQTT)
|
||||
snprintf(last_conf, sizeof(last_conf), "CNF|%64s|%64s|%5d|%32s|%32s|%4d|%2d|%4s|%3d|%1d", HOSTNAME, mqtt_host, mqtt_port, mqtt_user, mqtt_pass, WS2812FXStripSettings.stripSize, WS2812FXStripSettings.pin, WS2812FXStripSettings.RGBOrder, WS2812FXStripSettings.fxoptions, transEffect);
|
||||
#else
|
||||
snprintf(last_conf, sizeof(last_conf), "CNF|%64s|%64s|%5d|%32s|%32s|%4d|%2d|%4s|%3d|%1d", HOSTNAME, "", "", "", "", WS2812FXStripSettings.stripSize, WS2812FXStripSettings.pin, WS2812FXStripSettings.RGBOrder, WS2812FXStripSettings.fxoptions, transEffect);
|
||||
#endif
|
||||
last_conf[sizeof(last_conf) - 1] = 0x00;
|
||||
writeEEPROM(0, 224, last_conf);
|
||||
EEPROM.commit();
|
||||
updateConfig = false;
|
||||
settings_save_conf.detach();
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -875,7 +837,7 @@ void loop() {
|
||||
}
|
||||
|
||||
// Async color transition
|
||||
if (memcmp(hex_colors_trans, strip->getColors(selected_segment), sizeof(hex_colors_trans)) != 0) {
|
||||
if (memcmp(hex_colors_trans, strip->getColors(segment), sizeof(hex_colors_trans)) != 0) {
|
||||
if (transEffect) {
|
||||
if ((trans_cnt > 0) && (trans_cnt < trans_cnt_max)) {
|
||||
if (colorFadeDelay <= millis()) {
|
||||
@@ -883,21 +845,21 @@ void loop() {
|
||||
hex_colors_actual[0] = trans(hex_colors_trans[0], hex_colors[0], trans_cnt);
|
||||
hex_colors_actual[1] = trans(hex_colors_trans[1], hex_colors[1], trans_cnt);
|
||||
hex_colors_actual[2] = trans(hex_colors_trans[2], hex_colors[2], trans_cnt);
|
||||
strip->setColors(selected_segment, hex_colors_actual);
|
||||
strip->setColors(prevsegment, hex_colors_actual);
|
||||
trans_cnt++;
|
||||
colorFadeDelay = millis() + TRANS_COLOR_DELAY;
|
||||
if (mode == HOLD) strip->trigger();
|
||||
}
|
||||
} else if (trans_cnt >= trans_cnt_max) {
|
||||
memcpy(hex_colors, hex_colors_trans, sizeof(hex_colors_trans));
|
||||
strip->setColors(selected_segment, hex_colors);
|
||||
strip->setColors(prevsegment, hex_colors);
|
||||
if (mode == HOLD) strip->trigger();
|
||||
trans_cnt = 0;
|
||||
DBG_OUTPUT_PORT.println("Color transition finished!");
|
||||
}
|
||||
} else {
|
||||
memcpy(hex_colors, hex_colors_trans, sizeof(hex_colors_trans));
|
||||
strip->setColors(selected_segment, hex_colors);
|
||||
strip->setColors(prevsegment, hex_colors);
|
||||
if (mode == HOLD) strip->trigger();
|
||||
trans_cnt = 0;
|
||||
}
|
||||
@@ -917,12 +879,12 @@ void loop() {
|
||||
ws2812fx_speed_actual--;
|
||||
}
|
||||
speedFadeDelay = millis() + TRANS_DELAY;
|
||||
strip->setSpeed(selected_segment, convertSpeed(ws2812fx_speed_actual));
|
||||
strip->setSpeed(prevsegment, convertSpeed(ws2812fx_speed_actual));
|
||||
if (mode == HOLD) strip->trigger();
|
||||
}
|
||||
} else {
|
||||
ws2812fx_speed_actual = ws2812fx_speed;
|
||||
strip->setSpeed(selected_segment, convertSpeed(ws2812fx_speed_actual));
|
||||
strip->setSpeed(prevsegment, convertSpeed(ws2812fx_speed_actual));
|
||||
if (mode == HOLD) strip->trigger();
|
||||
}
|
||||
}
|
||||
@@ -942,11 +904,19 @@ void loop() {
|
||||
strip->trigger();
|
||||
}
|
||||
} else {
|
||||
strip->setBrightness(brightness);
|
||||
brightness_trans = brightness;
|
||||
strip->setBrightness(brightness_trans);
|
||||
if (mode == HOLD) strip->trigger();
|
||||
}
|
||||
}
|
||||
|
||||
/* // Segment change only if color and speed transitions are finished, because they are segment specific
|
||||
if (prevsegment != segment) {
|
||||
if ((memcmp(hex_colors_trans, strip->getColors(segment), sizeof(hex_colors_trans)) == 0) && (ws2812fx_speed_actual == ws2812fx_speed)) {
|
||||
segment = prevsegment;
|
||||
}
|
||||
}
|
||||
*/
|
||||
prevmode = mode;
|
||||
|
||||
#if defined(ENABLE_REMOTE)
|
||||
|
||||
@@ -27,10 +27,10 @@ char HOSTNAME[65] = "McLightingRGBW"; // Friedly hostname is configurable just
|
||||
#endif
|
||||
#define ENABLE_REMOTE 13 // If defined, enable Remote Control via TSOP31238. The value defines the input pin (13 / D7) for TSOP31238 Out
|
||||
|
||||
#define ENABLE_STATE_SAVE 1 // If defined, load saved state on reboot and save state. If set to 0 from EEPROM, if set to 1 from SPIFFS
|
||||
#define ENABLE_STATE_SAVE // If defined, load saved state on reboot and save state on SPIFFS
|
||||
|
||||
#define CUSTOM_WS2812FX_ANIMATIONS // uncomment and put animations in "custom_ws2812fx_animations.h"
|
||||
#define USE_HTML_MIN_GZ // uncomment for using index.htm & edit.htm from PROGMEM instead of SPIFFs
|
||||
//#define USE_HTML_MIN_GZ // uncomment for using index.htm & edit.htm from PROGMEM instead of SPIFFS
|
||||
|
||||
#define TRANS_COLOR_DELAY 5 // Delay for color transition
|
||||
#define TRANS_DELAY 10 // Delay for brightness and speed transition
|
||||
@@ -49,7 +49,12 @@ unsigned long speedFadeDelay = 0;
|
||||
uint8_t END_UNIVERSE = START_UNIVERSE; // Total number of Universes to listen for, starting at UNIVERSE
|
||||
|
||||
#endif
|
||||
uint8_t selected_segment = 0;
|
||||
uint8_t num_segments = 1;
|
||||
uint8_t segment = 0;
|
||||
uint16_t seg_start = 0;
|
||||
uint16_t seg_stop = NUMLEDS - 1;
|
||||
uint8_t prevsegment = 0;
|
||||
|
||||
#if defined(ENABLE_REMOTE)
|
||||
uint8_t selected_color = 1;
|
||||
uint64_t last_remote_cmd;
|
||||
|
||||
@@ -16,9 +16,9 @@ void handleAutoPlay() {
|
||||
hex_colors[0] = autoParams[autoCount][0];
|
||||
hex_colors[1] = autoParams[autoCount][1];
|
||||
hex_colors[2] = autoParams[autoCount][2];
|
||||
strip->setColors(selected_segment, hex_colors);
|
||||
strip->setSpeed(selected_segment, convertSpeed((uint8_t)autoParams[autoCount][3]));
|
||||
strip->setMode(selected_segment, (uint8_t)autoParams[autoCount][4]);
|
||||
strip->setColors(segment, hex_colors);
|
||||
strip->setSpeed(segment, convertSpeed((uint8_t)autoParams[autoCount][3]));
|
||||
strip->setMode(segment, (uint8_t)autoParams[autoCount][4]);
|
||||
strip->trigger();
|
||||
autoDelay = millis() + (uint32_t)autoParams[autoCount][5];
|
||||
DBG_OUTPUT_PORT.print("autoTick ");
|
||||
@@ -237,7 +237,7 @@ void Gradient() {
|
||||
} else {
|
||||
pixelnumber = j;
|
||||
}
|
||||
color = trans(strip->getColors(selected_segment)[1], strip->getColors(selected_segment)[0], (j*255)/(WS2812FXStripSettings.stripSize - 1));
|
||||
color = trans(strip->getColors(segment)[1], strip->getColors(segment)[0], (j*255)/(WS2812FXStripSettings.stripSize - 1));
|
||||
strip->setPixelColor(pixelnumber, ((color >> 16) & 0xFF), ((color >> 8) & 0xFF), ((color >> 0) & 0xFF), ((color >> 24) & 0xFF));
|
||||
}
|
||||
}
|
||||
@@ -245,31 +245,31 @@ void Gradient() {
|
||||
|
||||
uint16_t myCustomEffect0() {
|
||||
handleAuto();
|
||||
return (strip->getSpeed() / WS2812FXStripSettings.stripSize);
|
||||
return (strip->getSpeed(segment) / WS2812FXStripSettings.stripSize);
|
||||
}
|
||||
|
||||
uint16_t myCustomEffect1() {
|
||||
handleCustomWS();
|
||||
return (strip->getSpeed() / WS2812FXStripSettings.stripSize);
|
||||
return (strip->getSpeed(segment) / WS2812FXStripSettings.stripSize);
|
||||
}
|
||||
#if defined(CUSTOM_WS2812FX_ANIMATIONS)
|
||||
uint16_t myCustomEffect2() {
|
||||
handleTV();
|
||||
return (strip->getSpeed() / WS2812FXStripSettings.stripSize);
|
||||
return (strip->getSpeed(segment) / WS2812FXStripSettings.stripSize);
|
||||
}
|
||||
|
||||
uint16_t myCustomEffect3() {
|
||||
handleE131();
|
||||
return (strip->getSpeed() / WS2812FXStripSettings.stripSize);
|
||||
return (strip->getSpeed(segment) / WS2812FXStripSettings.stripSize);
|
||||
}
|
||||
|
||||
uint16_t myCustomEffect4() {
|
||||
Fire2012();
|
||||
return (strip->getSpeed() / WS2812FXStripSettings.stripSize);
|
||||
return (strip->getSpeed(segment) / WS2812FXStripSettings.stripSize);
|
||||
}
|
||||
|
||||
uint16_t myCustomEffect5() {
|
||||
Gradient();
|
||||
return (strip->getSpeed() / WS2812FXStripSettings.stripSize);
|
||||
return (strip->getSpeed(segment) / WS2812FXStripSettings.stripSize);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -17,6 +17,31 @@ void convertColors() {
|
||||
hex_colors_trans[2] = (uint32_t)(xtra_color.white << 24) | (xtra_color.red << 16) | (xtra_color.green << 8) | xtra_color.blue;
|
||||
}
|
||||
|
||||
uint32_t* convertColors2(uint8_t w, uint8_t r, uint8_t g, uint8_t b, uint8_t w2, uint8_t r2, uint8_t g2, uint8_t b2, uint8_t w3, uint8_t r3, uint8_t g3, uint8_t b3) {
|
||||
uint32_t hexcolors[3] = {};
|
||||
hexcolors[0] = (uint32_t)(w << 24) | (r << 16) | (g << 8) | b;
|
||||
hexcolors[1] = (uint32_t)(w2 << 24) | (r2 << 16) | (g2 << 8) | b2;
|
||||
hexcolors[2] = (uint32_t)(w3 << 24) | (r3 << 16) | (g3 << 8) | b3;
|
||||
return hexcolors;
|
||||
}
|
||||
|
||||
|
||||
void getSegmentParams(uint8_t seg) {
|
||||
ws2812fx_mode = strip->getMode(seg);
|
||||
main_color.white = ((strip->getColors(seg)[0] >> 24) & 0xFF);
|
||||
main_color.red = ((strip->getColors(seg)[0] >> 16) & 0xFF);
|
||||
main_color.green = ((strip->getColors(seg)[0] >> 8) & 0xFF);
|
||||
main_color.blue = ((strip->getColors(seg)[0]) & 0xFF);
|
||||
back_color.white = ((strip->getColors(seg)[1] >> 24) & 0xFF);
|
||||
back_color.red = ((strip->getColors(seg)[1] >> 16) & 0xFF);
|
||||
back_color.green = ((strip->getColors(seg)[1] >> 8) & 0xFF);
|
||||
back_color.blue = ((strip->getColors(seg)[1]) & 0xFF);
|
||||
xtra_color.white = ((strip->getColors(seg)[2] >> 24) & 0xFF);
|
||||
xtra_color.red = ((strip->getColors(seg)[2] >> 16) & 0xFF);
|
||||
xtra_color.green = ((strip->getColors(seg)[2] >> 8) & 0xFF);
|
||||
xtra_color.blue = ((strip->getColors(seg)[2] >> 0) & 0xFF);
|
||||
}
|
||||
|
||||
void calculateColorTransitionSteps() {
|
||||
//compare all colors and calculate steps
|
||||
trans_cnt_max = 0;
|
||||
@@ -33,7 +58,7 @@ void calculateColorTransitionSteps() {
|
||||
void convertColorsFade() {
|
||||
if (transEffect) {
|
||||
if (trans_cnt > 1) {
|
||||
memcpy(hex_colors, strip->getColors(selected_segment), sizeof(hex_colors));
|
||||
memcpy(hex_colors, strip->getColors(segment), sizeof(hex_colors));
|
||||
DBG_OUTPUT_PORT.println("Color transistion aborted. Restarting...!");
|
||||
trans_cnt = 1;
|
||||
}
|
||||
@@ -43,6 +68,13 @@ void convertColorsFade() {
|
||||
|
||||
void getArgs() {
|
||||
if (mode == SET) {
|
||||
// Segment
|
||||
if ((server.arg("seg") != "") && (server.arg("seg").toInt() >= 0) && (server.arg("seg").toInt() <= MAX_NUM_SEGMENTS)) {
|
||||
prevsegment = segment;
|
||||
segment = server.arg("seg").toInt();
|
||||
getSegmentParams(segment);
|
||||
memcpy(hex_colors_trans, hex_colors, sizeof(hex_colors_trans));
|
||||
}
|
||||
//color wrgb
|
||||
if (server.arg("rgb") != "") {
|
||||
uint32_t rgb = (uint32_t) strtoul(server.arg("rgb").c_str(), NULL, 16);
|
||||
@@ -131,7 +163,6 @@ void getArgs() {
|
||||
brightness = constrain(server.arg("p").toInt(), 0, 255);
|
||||
}
|
||||
}
|
||||
|
||||
DBG_OUTPUT_PORT.printf("Get Args: %s\r\n", listStatusJSON());
|
||||
}
|
||||
|
||||
@@ -304,7 +335,6 @@ bool checkPin(uint8_t pin) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
neoPixelType checkRGBOrder(char rgbOrder[5]) {
|
||||
for( uint8_t i=0 ; i < sizeof(rgbOrder) ; ++i ) rgbOrder[i] = toupper(rgbOrder[i]) ;
|
||||
DBG_OUTPUT_PORT.printf("Checking RGB Order: %s ...", rgbOrder);
|
||||
@@ -385,31 +415,6 @@ neoPixelType checkRGBOrder(char rgbOrder[5]) {
|
||||
return returnOrder;
|
||||
}
|
||||
|
||||
bool setConfByConfString(String saved_conf_string) {
|
||||
if (getValue(saved_conf_string, '|', 0) == "CNF") {
|
||||
DBG_OUTPUT_PORT.printf("Parsed conf: %s\r\n", saved_conf_string.c_str());
|
||||
getValue(saved_conf_string, '|', 1).toCharArray(HOSTNAME, 64);
|
||||
#if defined(ENABLE_MQTT)
|
||||
getValue(saved_conf_string, '|', 2).toCharArray(mqtt_host, 64);
|
||||
mqtt_port = getValue(saved_conf_string, '|', 3).toInt();
|
||||
getValue(saved_conf_string, '|', 4).toCharArray(mqtt_user, 32);
|
||||
getValue(saved_conf_string, '|', 5).toCharArray(mqtt_pass, 32);
|
||||
#endif
|
||||
WS2812FXStripSettings.stripSize = constrain(getValue(saved_conf_string, '|', 6).toInt(), 1, MAXLEDS);
|
||||
checkPin(getValue(saved_conf_string, '|', 7).toInt());
|
||||
char tmp_rgbOrder[5];
|
||||
getValue(saved_conf_string, '|', 8).toCharArray(tmp_rgbOrder, 4);
|
||||
checkRGBOrder(tmp_rgbOrder);
|
||||
WS2812FXStripSettings.fxoptions = constrain(((getValue(saved_conf_string, '|', 9).toInt()>>1)<<1), 0, 255);
|
||||
transEffect = getValue(saved_conf_string, '|', 10).toInt();
|
||||
return true;
|
||||
} else {
|
||||
DBG_OUTPUT_PORT.println("Saved conf not found!");
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool setModeByStateString(String saved_state_string) {
|
||||
if (getValue(saved_state_string, '|', 0) == "STA") {
|
||||
DBG_OUTPUT_PORT.printf("Parsed state: %s\r\n", saved_state_string.c_str());
|
||||
@@ -472,15 +477,14 @@ void handleSetWS2812FXMode(uint8_t * mypayload) {
|
||||
}
|
||||
}
|
||||
|
||||
char * listStatusJSON() {
|
||||
const size_t bufferSize = JSON_ARRAY_SIZE(12) + JSON_OBJECT_SIZE(6) + 500;
|
||||
char * listStatusJSONorg() {
|
||||
const size_t bufferSize = JSON_ARRAY_SIZE(13) + JSON_OBJECT_SIZE(6) + 500;
|
||||
DynamicJsonDocument jsonBuffer(bufferSize);
|
||||
JsonObject root = jsonBuffer.to<JsonObject>();
|
||||
root["segment"] = segment;
|
||||
root["mode"] = (uint8_t) mode;
|
||||
root["ws2812fx_mode"] = ws2812fx_mode;
|
||||
root["ws2812fx_mode_name"] = strip->getModeName(ws2812fx_mode);
|
||||
//root["ws2812fx_mode"] = tmp_mode;
|
||||
//root["ws2812fx_mode_name"] = strip->getModeName(tmp_mode);
|
||||
root["speed"] = ws2812fx_speed;
|
||||
root["brightness"] = brightness;
|
||||
JsonArray color = root.createNestedArray("color");
|
||||
@@ -503,8 +507,53 @@ char * listStatusJSON() {
|
||||
return buffer;
|
||||
}
|
||||
|
||||
char * listStatusJSON() {
|
||||
const size_t bufferSize = JSON_OBJECT_SIZE(3) + 25;
|
||||
DynamicJsonDocument jsonBuffer(bufferSize);
|
||||
JsonObject root = jsonBuffer.to<JsonObject>();
|
||||
root["segment"] = segment;
|
||||
root["mode"] = (uint8_t) mode;
|
||||
root["brightness"] = brightness;
|
||||
uint16_t msg_len = measureJson(root) + 1;
|
||||
char * buffer = (char *) malloc(msg_len);
|
||||
serializeJson(root, buffer, msg_len);
|
||||
jsonBuffer.clear();
|
||||
return buffer;
|
||||
}
|
||||
|
||||
char * listSegmentStatusJSON(uint8_t seg) {
|
||||
const size_t bufferSize = JSON_ARRAY_SIZE(12) + JSON_OBJECT_SIZE(7) + 100;
|
||||
DynamicJsonDocument jsonBuffer(bufferSize);
|
||||
JsonObject root = jsonBuffer.to<JsonObject>();
|
||||
root["segment"] = seg;
|
||||
root["start"] = strip->getSegment(seg)->start;
|
||||
root["stop"] = strip->getSegment(seg)->stop;
|
||||
root["ws2812fx_mode"] = strip->getMode(seg);
|
||||
root["ws2812fx_mode_name"] = strip->getModeName(strip->getMode(seg));
|
||||
root["speed"] = ws2812fx_speed;
|
||||
getSegmentParams(seg);
|
||||
JsonArray color = root.createNestedArray("color");
|
||||
color.add((strip->getColors(seg)[0] >> 24) & 0xFF);
|
||||
color.add((strip->getColors(seg)[0] >> 16) & 0xFF);
|
||||
color.add((strip->getColors(seg)[0] >> 8) & 0xFF);
|
||||
color.add((strip->getColors(seg)[0]) & 0xFF);
|
||||
color.add((strip->getColors(seg)[1] >> 24) & 0xFF);
|
||||
color.add((strip->getColors(seg)[1] >> 16) & 0xFF);
|
||||
color.add((strip->getColors(seg)[1] >> 8) & 0xFF);
|
||||
color.add((strip->getColors(seg)[1]) & 0xFF);
|
||||
color.add((strip->getColors(seg)[2] >> 24) & 0xFF);
|
||||
color.add((strip->getColors(seg)[2] >> 16) & 0xFF);
|
||||
color.add((strip->getColors(seg)[2] >> 8) & 0xFF);
|
||||
color.add((strip->getColors(seg)[2]) & 0xFF);
|
||||
uint16_t msg_len = measureJson(root) + 1;
|
||||
char * buffer = (char *) malloc(msg_len);
|
||||
serializeJson(root, buffer, msg_len);
|
||||
jsonBuffer.clear();
|
||||
return buffer;
|
||||
}
|
||||
|
||||
void getStatusJSON() {
|
||||
char * buffer = listStatusJSON();
|
||||
char * buffer = listStatusJSONorg();
|
||||
server.sendHeader("Access-Control-Allow-Origin", "*");
|
||||
server.send ( 200, "application/json", buffer);
|
||||
free (buffer);
|
||||
@@ -512,9 +561,9 @@ void getStatusJSON() {
|
||||
|
||||
char * listConfigJSON() {
|
||||
#if defined(ENABLE_MQTT)
|
||||
const size_t bufferSize = JSON_OBJECT_SIZE(9) + 500;
|
||||
const size_t bufferSize = JSON_OBJECT_SIZE(10) + 500;
|
||||
#else
|
||||
const size_t bufferSize = JSON_OBJECT_SIZE(5) + 150;
|
||||
const size_t bufferSize = JSON_OBJECT_SIZE(6) + 150;
|
||||
#endif
|
||||
DynamicJsonDocument jsonBuffer(bufferSize);
|
||||
JsonObject root = jsonBuffer.to<JsonObject>();
|
||||
@@ -525,6 +574,7 @@ char * listConfigJSON() {
|
||||
root["mqtt_user"] = mqtt_user;
|
||||
root["mqtt_pass"] = mqtt_pass;
|
||||
#endif
|
||||
root["num_seg"] = num_segments;
|
||||
root["ws_cnt"] = WS2812FXStripSettings.stripSize;
|
||||
root["ws_rgbo"] = WS2812FXStripSettings.RGBOrder;
|
||||
root["ws_pin"] = WS2812FXStripSettings.pin;
|
||||
@@ -545,7 +595,7 @@ void getConfigJSON() {
|
||||
}
|
||||
|
||||
char * listModesJSON() {
|
||||
const size_t bufferSize = JSON_ARRAY_SIZE(strip->getModeCount() + 3) + (strip->getModeCount() + 3)*JSON_OBJECT_SIZE(2) + 2000;
|
||||
const size_t bufferSize = JSON_ARRAY_SIZE(strip->getModeCount() + 1) + (strip->getModeCount() + 1)*JSON_OBJECT_SIZE(2) + 2000;
|
||||
DynamicJsonDocument jsonBuffer(bufferSize);
|
||||
JsonArray root = jsonBuffer.to<JsonArray>();
|
||||
JsonObject objectoff = root.createNestedObject();
|
||||
@@ -622,6 +672,18 @@ void Dbg_Prefix(bool mqtt, uint8_t num) {
|
||||
}
|
||||
|
||||
void checkpayload(uint8_t * payload, bool mqtt = false, uint8_t num = 0) {
|
||||
// Select segment
|
||||
if (payload[0] == 'S') {
|
||||
uint8_t seg = (uint8_t) strtol((const char *) &payload[1], NULL, 10);
|
||||
prevsegment = segment;
|
||||
segment = constrain(seg, 0, MAX_NUM_SEGMENTS);
|
||||
getSegmentParams(segment);
|
||||
memcpy(hex_colors_trans, hex_colors, sizeof(hex_colors_trans));
|
||||
mode = SET;
|
||||
Dbg_Prefix(mqtt, num);
|
||||
DBG_OUTPUT_PORT.printf("Set segment to: [%u]\r\n", segment);
|
||||
}
|
||||
|
||||
// # ==> Set main color - ## ==> Set 2nd color - ### ==> Set 3rd color
|
||||
if (payload[0] == '#') {
|
||||
#if defined(ENABLE_MQTT)
|
||||
@@ -696,7 +758,7 @@ void checkpayload(uint8_t * payload, bool mqtt = false, uint8_t num = 0) {
|
||||
|
||||
// $ ==> Get status Info.
|
||||
if (payload[0] == '$') {
|
||||
char * buffer = listStatusJSON();
|
||||
char * buffer = listStatusJSONorg();
|
||||
if (mqtt == true) {
|
||||
DBG_OUTPUT_PORT.print("MQTT: ");
|
||||
#if defined(ENABLE_MQTT)
|
||||
@@ -722,6 +784,13 @@ void checkpayload(uint8_t * payload, bool mqtt = false, uint8_t num = 0) {
|
||||
bool updateStrip = false;
|
||||
bool updateConf = false;
|
||||
if (payload[1] == 's') {
|
||||
if (payload[2] == 's') {
|
||||
char tmp_segments[3];
|
||||
snprintf(tmp_segments, sizeof(tmp_segments), "%s", &payload[3]);
|
||||
tmp_segments[2] = 0x00;
|
||||
num_segments = constrain(atoi(tmp_segments), 1, MAX_NUM_SEGMENTS - 1);
|
||||
updateStrip = true;
|
||||
}
|
||||
if (payload[2] == 'c') {
|
||||
char tmp_count[6];
|
||||
snprintf(tmp_count, sizeof(tmp_count), "%s", &payload[3]);
|
||||
@@ -1441,34 +1510,6 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght
|
||||
updateConfig = true;
|
||||
}
|
||||
|
||||
#if ENABLE_STATE_SAVE == 0
|
||||
// ***************************************************************************
|
||||
// EEPROM helper
|
||||
// ***************************************************************************
|
||||
String readEEPROM(uint16_t offset, uint16_t len) {
|
||||
String res = "";
|
||||
for (uint16_t i = 0; i < len; ++i)
|
||||
{
|
||||
res += char(EEPROM.read(i + offset));
|
||||
//DBG_OUTPUT_PORT.println(char(EEPROM.read(i + offset)));
|
||||
}
|
||||
DBG_OUTPUT_PORT.printf("readEEPROM(): %s\r\n", res.c_str());
|
||||
return res;
|
||||
}
|
||||
|
||||
void writeEEPROM(uint16_t offset, uint16_t len, String value) {
|
||||
DBG_OUTPUT_PORT.printf("writeEEPROM(): %s\r\n", value.c_str());
|
||||
for (uint16_t i = 0; i < len; ++i)
|
||||
{
|
||||
if (i < value.length()) {
|
||||
EEPROM.write(i + offset, value[i]);
|
||||
} else {
|
||||
EEPROM.write(i + offset, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if ENABLE_STATE_SAVE == 1
|
||||
// Write configuration to FS JSON
|
||||
bool writeConfigFS(bool saveConfig){
|
||||
if (saveConfig) {
|
||||
@@ -1527,6 +1568,7 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght
|
||||
strcpy(mqtt_user, root["mqtt_user"]);
|
||||
strcpy(mqtt_pass, root["mqtt_pass"]);
|
||||
#endif
|
||||
num_segments = constrain(root["num_seg"].as<uint8_t>(), 1, MAX_NUM_SEGMENTS - 1);
|
||||
WS2812FXStripSettings.stripSize = constrain(root["ws_cnt"].as<uint16_t>(), 1, MAXLEDS);
|
||||
char tmp_rgbOrder[5];
|
||||
strcpy(tmp_rgbOrder, root["ws_rgbo"]);
|
||||
@@ -1568,6 +1610,21 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght
|
||||
DBG_OUTPUT_PORT.println(listStatusJSON());
|
||||
configFile.print(listStatusJSON());
|
||||
configFile.close();
|
||||
char filename[28];
|
||||
for (uint8_t seg=0; seg < num_segments; seg++) {
|
||||
snprintf(filename, 28, "/stripstate_segment_%02i.json", seg);
|
||||
filename[27] = 0x00;
|
||||
File configFile = SPIFFS.open(filename, "w");
|
||||
if (!configFile) {
|
||||
DBG_OUTPUT_PORT.println("Failed!");
|
||||
settings_save_state.detach();
|
||||
updateState = false;
|
||||
return false;
|
||||
}
|
||||
DBG_OUTPUT_PORT.println(listSegmentStatusJSON(seg));
|
||||
configFile.print(listSegmentStatusJSON(seg));
|
||||
configFile.close();
|
||||
}
|
||||
settings_save_state.detach();
|
||||
updateState = false;
|
||||
return true;
|
||||
@@ -1580,7 +1637,6 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght
|
||||
|
||||
bool readStateFS() {
|
||||
//read strip state from FS JSON
|
||||
//if (resetsettings) { SPIFFS.begin(); SPIFFS.remove("/config.json"); SPIFFS.format(); delay(1000);}
|
||||
if (SPIFFS.exists("/stripstate.json")) {
|
||||
//file exists, reading and loading
|
||||
DBG_OUTPUT_PORT.print("Reading state file... ");
|
||||
@@ -1601,10 +1657,56 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght
|
||||
JsonObject root = jsonBuffer.as<JsonObject>();
|
||||
serializeJson(root, DBG_OUTPUT_PORT);
|
||||
DBG_OUTPUT_PORT.println("");
|
||||
segment = root["segment"];
|
||||
mode = static_cast<MODE>(root["mode"].as<uint8_t>());
|
||||
brightness = root["brightness"];
|
||||
jsonBuffer.clear();
|
||||
return true;
|
||||
} else {
|
||||
DBG_OUTPUT_PORT.print("Failed to load json config: ");
|
||||
DBG_OUTPUT_PORT.println(error.c_str());
|
||||
jsonBuffer.clear();
|
||||
}
|
||||
} else {
|
||||
DBG_OUTPUT_PORT.println("Failed to open \"/stripstate.json\"");
|
||||
}
|
||||
} else {
|
||||
DBG_OUTPUT_PORT.println("Couldn't find \"/stripstate.json\"");
|
||||
writeStateFS(true);
|
||||
}
|
||||
//end read
|
||||
return false;
|
||||
}
|
||||
|
||||
bool readStateSegmentFS(uint8_t seg) {
|
||||
//read strip state from FS JSON
|
||||
char filename[28];
|
||||
snprintf(filename, 28, "/stripstate_segment_%02i.json", seg);
|
||||
filename[27] = 0x00;
|
||||
if (SPIFFS.exists(filename)) {
|
||||
//file exists, reading and loading
|
||||
DBG_OUTPUT_PORT.printf("Reading segmentstate file: %s\r\n", filename);
|
||||
File configFile = SPIFFS.open(filename, "r");
|
||||
if (configFile) {
|
||||
DBG_OUTPUT_PORT.println("Opened!");
|
||||
size_t size = configFile.size();
|
||||
// Allocate a buffer to store contents of the file.
|
||||
std::unique_ptr<char[]> buf(new char[size]);
|
||||
configFile.readBytes(buf.get(), size);
|
||||
configFile.close();
|
||||
const size_t bufferSize = JSON_OBJECT_SIZE(5) + JSON_ARRAY_SIZE(12) + 500;
|
||||
DynamicJsonDocument jsonBuffer(bufferSize);
|
||||
DeserializationError error = deserializeJson(jsonBuffer, buf.get());
|
||||
DBG_OUTPUT_PORT.print("Config: ");
|
||||
if (!error) {
|
||||
DBG_OUTPUT_PORT.print("Parsed");
|
||||
JsonObject root = jsonBuffer.as<JsonObject>();
|
||||
serializeJson(root, DBG_OUTPUT_PORT);
|
||||
DBG_OUTPUT_PORT.println("");
|
||||
seg_start = root["start"].as<uint16_t>();
|
||||
seg_stop = root["stop"].as<uint16_t>();
|
||||
ws2812fx_mode = root["ws2812fx_mode"].as<uint8_t>();
|
||||
ws2812fx_speed = root["speed"].as<uint8_t>();
|
||||
brightness = root["brightness"];
|
||||
main_color.white = root["color"][0].as<uint8_t>();
|
||||
main_color.red = root["color"][1].as<uint8_t>();
|
||||
main_color.green = root["color"][2].as<uint8_t>();
|
||||
@@ -1626,17 +1728,20 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght
|
||||
jsonBuffer.clear();
|
||||
}
|
||||
} else {
|
||||
DBG_OUTPUT_PORT.println("Failed to open \"/stripstate.json\"");
|
||||
DBG_OUTPUT_PORT.printf("Failed to open \"/%s\"\r\n", filename);
|
||||
}
|
||||
} else {
|
||||
DBG_OUTPUT_PORT.println("Couldn't find \"/stripstate.json\"");
|
||||
DBG_OUTPUT_PORT.printf("Couldn't find \"/%s\"", filename);
|
||||
writeStateFS(true);
|
||||
}
|
||||
//end read
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
#if defined(ENABLE_REMOTE)
|
||||
// ***************************************************************************
|
||||
|
||||
@@ -129,12 +129,7 @@
|
||||
root["ota"] = "OFF";
|
||||
#endif
|
||||
#if defined(ENABLE_STATE_SAVE)
|
||||
#if ENABLE_STATE_SAVE == 1
|
||||
root["state_save"] = "SPIFFS";
|
||||
#endif
|
||||
#if ENABLE_STATE_SAVE == 0
|
||||
root["state_save"] = "EEPROM";
|
||||
#endif
|
||||
#else
|
||||
root["state_save"] = "OFF";
|
||||
#endif
|
||||
@@ -256,6 +251,11 @@
|
||||
|
||||
bool updateStrip = false;
|
||||
bool updateConf = false;
|
||||
if(server.hasArg("ws_seg")){
|
||||
uint8_t wsseg = server.arg("ws_seg").toInt();
|
||||
num_segments = constrain(wsseg, 1, MAX_NUM_SEGMENTS - 1);
|
||||
updateStrip = true;
|
||||
}
|
||||
if(server.hasArg("ws_cnt")){
|
||||
uint16_t pixelCt = server.arg("ws_cnt").toInt();
|
||||
if (pixelCt > 0) {
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
char * listStatusJSON2() {
|
||||
const size_t bufferSize = 10*JSON_ARRAY_SIZE(12) + 10*JSON_OBJECT_SIZE(4) + JSON_OBJECT_SIZE(12) + 600;
|
||||
DynamicJsonDocument jsonBuffer(bufferSize);
|
||||
JsonObject root = jsonBuffer.to<JsonObject>();
|
||||
root["mode"] = (uint8_t) mode;
|
||||
root["brightness"] = brightness;
|
||||
for(uint8_t i=0; i<10; i++) {
|
||||
char int2char[3];
|
||||
itoa(i, int2char, 10);
|
||||
JsonObject segments = root.createNestedObject(int2char);
|
||||
segments["ws2812fx_mode"] = strip->getMode(i);
|
||||
segments["ws2812fx_mode_name"] = strip->getModeName(strip->getMode(i));
|
||||
segments["speed"] = ws2812fx_speed;
|
||||
JsonArray color = segments.createNestedArray("color");
|
||||
color.add(main_color.white);
|
||||
color.add(main_color.red);
|
||||
color.add(main_color.green);
|
||||
color.add(main_color.blue);
|
||||
color.add(back_color.white);
|
||||
color.add(back_color.red);
|
||||
color.add(back_color.green);
|
||||
color.add(back_color.blue);
|
||||
color.add(xtra_color.white);
|
||||
color.add(xtra_color.red);
|
||||
color.add(xtra_color.green);
|
||||
color.add(xtra_color.blue);
|
||||
}
|
||||
uint16_t msg_len = measureJson(root) + 1;
|
||||
char * buffer = (char *) malloc(msg_len);
|
||||
serializeJson(root, buffer, msg_len);
|
||||
jsonBuffer.clear();
|
||||
return buffer;
|
||||
}
|
||||
@@ -188,4 +188,11 @@
|
||||
* Version Bump to 3.0.0.BETA1
|
||||
* further code changes
|
||||
* bugfixes
|
||||
*
|
||||
* 30 September 2019
|
||||
* Version Bump to 3.1.0.ALPHA1
|
||||
* further code changes
|
||||
* removal of saving to EEPROM
|
||||
* first integration of multi segments
|
||||
*
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user