Merge branch 'master' into dev
This commit is contained in:
commit
7463be862f
@ -421,6 +421,13 @@ board_build.ldscript = ${common.ldscript_2m512k}
|
||||
build_flags = ${common.build_flags_esp8266} -D LEDPIN=3 -D BTNPIN=1
|
||||
lib_deps = ${esp8266.lib_deps}
|
||||
|
||||
[env:sp511e]
|
||||
board = esp_wroom_02
|
||||
platform = ${common.platform_wled_default}
|
||||
board_build.ldscript = ${common.ldscript_2m512k}
|
||||
build_flags = ${common.build_flags_esp8266} -D LEDPIN=3 -D BTNPIN=2 -D IRPIN=5 -D WLED_MAX_BUTTONS=3
|
||||
lib_deps = ${esp8266.lib_deps}
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# travis test board configurations
|
||||
# ------------------------------------------------------------------------------
|
||||
|
@ -290,10 +290,6 @@ bool deserializeConfig(JsonObject doc, bool fromFS) {
|
||||
CJSON(arlsDisableGammaCorrection, if_live[F("no-gc")]); // false
|
||||
CJSON(arlsOffset, if_live[F("offset")]); // 0
|
||||
|
||||
CJSON(liveHSVCorrection, if_live[F("corr")]);
|
||||
CJSON(liveHSVSaturation, if_live[F("hsvsat")]);
|
||||
CJSON(liveHSVValue, if_live[F("hsvval")]);
|
||||
|
||||
CJSON(alexaEnabled, interfaces["va"][F("alexa")]); // false
|
||||
|
||||
CJSON(macroAlexaOn, interfaces["va"]["macros"][0]);
|
||||
@ -662,9 +658,6 @@ void serializeConfig() {
|
||||
if_live[F("maxbri")] = arlsForceMaxBri;
|
||||
if_live[F("no-gc")] = arlsDisableGammaCorrection;
|
||||
if_live[F("offset")] = arlsOffset;
|
||||
if_live[F("corr")] = liveHSVCorrection;
|
||||
if_live[F("hsvsat")] = liveHSVSaturation;
|
||||
if_live[F("hsvval")] = liveHSVValue;
|
||||
|
||||
JsonObject if_va = interfaces.createNestedObject("va");
|
||||
if_va[F("alexa")] = alexaEnabled;
|
||||
|
@ -47,63 +47,6 @@ void relativeChangeWhite(int8_t amount, byte lowerBoundary)
|
||||
col[3] = new_val;
|
||||
}
|
||||
|
||||
void colorHSVtoRGB(float hue, float saturation, float value, byte& r, byte& g, byte& b)
|
||||
{
|
||||
uint8_t i = hue * 6.0;
|
||||
float f = hue * 6.0 - i;
|
||||
value *= 255.0;
|
||||
float p = value * (1.0 - saturation);
|
||||
float q = value * (1.0 - f * saturation);
|
||||
float t = value * (1.0 - (1.0 - f) * saturation);
|
||||
|
||||
switch (i % 6) {
|
||||
case 0: r = value, g = t, b = p; break;
|
||||
case 1: r = q, g = value, b = p; break;
|
||||
case 2: r = p, g = value, b = t; break;
|
||||
case 3: r = p, g = q, b = value; break;
|
||||
case 4: r = t, g = p, b = value; break;
|
||||
case 5: r = value, g = p, b = q; break;
|
||||
}
|
||||
}
|
||||
|
||||
void colorRGBtoHSV(byte red, byte green, byte blue, float& hue, float& saturation, float& value)
|
||||
{
|
||||
float rd = red/255.0, gd = green/255.0, bd = blue/255.0;
|
||||
float max = std::max({ rd, gd, bd }), min = std::min({ rd, gd, bd });
|
||||
|
||||
value = max;
|
||||
|
||||
float d = max - min;
|
||||
saturation = max == 0.0 ? 0.0 : d / max;
|
||||
|
||||
hue = 0;
|
||||
if (max != min)
|
||||
{
|
||||
if (max == rd) hue = (gd - bd) / d + (gd < bd ? 6.0 : 0.0);
|
||||
else if (max == gd) hue = (bd - rd) / d + 2.0;
|
||||
else if (max == bd) hue = (rd - gd) / d + 4.0;
|
||||
hue /= 6.0;
|
||||
}
|
||||
}
|
||||
|
||||
#define SATURATION_THRESHOLD 0.1
|
||||
#define MAX_HSV_VALUE 1
|
||||
#define MAX_HSV_SATURATION 1
|
||||
|
||||
//corrects the realtime colors. 10 is the unchanged saturation/value
|
||||
//this feature might cause slowdowns with large LED counts
|
||||
void correctColors(byte r, byte g, byte b, byte* rgb) {
|
||||
float hsv[3] = { 0,0,0 };
|
||||
colorRGBtoHSV(r, g, b, hsv[0], hsv[1], hsv[2]);
|
||||
float saturated = hsv[1] > SATURATION_THRESHOLD ?
|
||||
hsv[1] * ((float)liveHSVSaturation / 10) : hsv[1];
|
||||
float saturation = saturated < MAX_HSV_SATURATION ? saturated : MAX_HSV_SATURATION;
|
||||
|
||||
float valued = hsv[2] * ((float)liveHSVValue/10);
|
||||
float value = valued < MAX_HSV_VALUE ? valued : MAX_HSV_VALUE;
|
||||
colorHSVtoRGB(hsv[0], saturation, value, rgb[0], rgb[1], rgb[2]);
|
||||
}
|
||||
|
||||
void colorHStoRGB(uint16_t hue, byte sat, byte* rgb) //hue, sat to rgb
|
||||
{
|
||||
float h = ((float)hue)/65535.0;
|
||||
|
@ -125,10 +125,7 @@ DMX mode:
|
||||
Timeout: <input name="ET" type="number" min="1" max="65000" required> ms<br>
|
||||
Force max brightness: <input type="checkbox" name="FB"><br>
|
||||
Disable realtime gamma correction: <input type="checkbox" name="RG"><br>
|
||||
Realtime LED offset: <input name="WO" type="number" min="-255" max="255" required><br><br>
|
||||
Realtime HSV color correction: <input type="checkbox" name="HX"><br>
|
||||
Saturation (1-30): <input name="HS" type="number" min="1" max="30" value="1" step="1"><br>
|
||||
Value (1-60): <input name="HV" type="number" min="1" max="60" value="10" step="1">
|
||||
Realtime LED offset: <input name="WO" type="number" min="-255" max="255" required>
|
||||
<h3>Alexa Voice Assistant</h3>
|
||||
Emulate Alexa device: <input type="checkbox" name="AL"><br>
|
||||
Alexa invocation name: <input name="AI" maxlength="32">
|
||||
|
@ -60,9 +60,6 @@ void colorFromUint32(uint32_t in, bool secondary = false);
|
||||
void colorFromUint24(uint32_t in, bool secondary = false);
|
||||
uint32_t colorFromRgbw(byte* rgbw);
|
||||
void relativeChangeWhite(int8_t amount, byte lowerBoundary = 0);
|
||||
void colorHSVtoRGB(float hue, float saturation, float value, byte& red, byte& green, byte& blue);
|
||||
void colorRGBtoHSV(byte red, byte green, byte blue, float& hue, float& saturation, float& value);
|
||||
void correctColors(byte r, byte g, byte b, byte* rgb);
|
||||
void colorHStoRGB(uint16_t hue, byte sat, byte* rgb); //hue, sat to rgb
|
||||
void colorKtoRGB(uint16_t kelvin, byte* rgb);
|
||||
void colorCTtoRGB(uint16_t mired, byte* rgb); //white spectrum to rgb
|
||||
|
@ -293,12 +293,9 @@ E1.31 info</a><br>Timeout: <input name="ET" type="number" min="1" max="65000"
|
||||
required> ms<br>Force max brightness: <input type="checkbox" name="FB"><br>
|
||||
Disable realtime gamma correction: <input type="checkbox" name="RG"><br>
|
||||
Realtime LED offset: <input name="WO" type="number" min="-255" max="255"
|
||||
required><br><br>Realtime HSV color correction: <input type="checkbox"
|
||||
name="HX"><br>Saturation (1-30): <input name="HS" type="number" min="1"
|
||||
max="30" value="1" step="1"><br>Value (1-60): <input name="HV" type="number"
|
||||
min="1" max="60" value="10" step="1"><h3>Alexa Voice Assistant</h3>
|
||||
Emulate Alexa device: <input type="checkbox" name="AL"><br>
|
||||
Alexa invocation name: <input name="AI" maxlength="32"><h3>Blynk</h3><b>
|
||||
required><h3>Alexa Voice Assistant</h3>Emulate Alexa device: <input
|
||||
type="checkbox" name="AL"><br>Alexa invocation name: <input name="AI"
|
||||
maxlength="32"><h3>Blynk</h3><b>
|
||||
Blynk, MQTT and Hue sync all connect to external hosts!<br>
|
||||
This may impact the responsiveness of the ESP8266.</b><br>
|
||||
For best results, only use one of these services at a time.<br>
|
||||
|
@ -573,66 +573,65 @@ void decodeIRJson(uint32_t code)
|
||||
char objKey[10];
|
||||
String cmdStr;
|
||||
DynamicJsonDocument irDoc(JSON_BUFFER_SIZE);
|
||||
JsonObject fdo = irDoc.createNestedObject("cmd");
|
||||
JsonObject fdo;
|
||||
JsonObject jsonCmdObj;
|
||||
|
||||
lastValidCode = 0;
|
||||
sprintf_P(objKey, PSTR("\"0x%lX\":"), (unsigned long)code);
|
||||
|
||||
// attempt to read command from ir.json
|
||||
// this may fail for two reasons: ir.json does not exist or IR code not found
|
||||
// if the IR code is not found readObjectFromFile() will clean() irDoc JSON document
|
||||
// so we can differentiate between the two
|
||||
errorFlag = readObjectFromFile("/ir.json", objKey, &irDoc) ? ERR_NONE : ERR_FS_IRLOAD;
|
||||
if (irDoc["cmd"].isNull()) {
|
||||
errorFlag = ERR_NONE;
|
||||
readObjectFromFile("/ir.json", objKey, &irDoc);
|
||||
fdo = irDoc.as<JsonObject>();
|
||||
lastValidCode = 0;
|
||||
if (fdo.isNull()) {
|
||||
//the received code does not exist
|
||||
if (!WLED_FS.exists("/ir.json")) errorFlag = ERR_FS_IRLOAD; //warn if IR file itself doesn't exist
|
||||
return;
|
||||
}
|
||||
if (!errorFlag) {
|
||||
|
||||
fdo = irDoc.as<JsonObject>();
|
||||
cmdStr = fdo["cmd"].as<String>();;
|
||||
jsonCmdObj = fdo["cmd"]; //object
|
||||
|
||||
JsonObject jsonCmdObj = fdo["cmd"];
|
||||
cmdStr = fdo["cmd"].as<String>();
|
||||
|
||||
if (!cmdStr.isEmpty()) {
|
||||
|
||||
if (cmdStr.startsWith("!")) {
|
||||
// call limited set of C functions
|
||||
if (cmdStr.startsWith(F("!incBri"))) {
|
||||
lastValidCode = code;
|
||||
incBrightness();
|
||||
} else if (cmdStr.startsWith(F("!decBri"))) {
|
||||
lastValidCode = code;
|
||||
decBrightness();
|
||||
} else if (cmdStr.startsWith(F("!presetF"))) { //!presetFallback
|
||||
uint8_t p1 = fdo["PL"] ? fdo["PL"] : 1;
|
||||
uint8_t p2 = fdo["FX"] ? fdo["FX"] : random8(MODE_COUNT);
|
||||
uint8_t p3 = fdo["FP"] ? fdo["FP"] : 0;
|
||||
presetFallback(p1, p2, p3);
|
||||
}
|
||||
} else {
|
||||
// HTTP API command
|
||||
if (cmdStr.indexOf("~") || fdo[F("rpt")])
|
||||
{
|
||||
// repeatable action
|
||||
lastValidCode = code;
|
||||
}
|
||||
if (effectCurrent == 0 && cmdStr.indexOf("FP=") > -1) {
|
||||
// setting palette but it wont show because effect is solid
|
||||
effectCurrent = FX_MODE_GRADIENT;
|
||||
}
|
||||
if (!cmdStr.startsWith("win&")) {
|
||||
cmdStr = "win&" + cmdStr;
|
||||
}
|
||||
handleSet(nullptr, cmdStr, false);
|
||||
}
|
||||
} else if (!jsonCmdObj.isNull()) {
|
||||
// command is JSON object
|
||||
//allow applyPreset() to reuse JSON buffer, or it would alloc. a second buffer and run out of mem.
|
||||
fileDoc = &irDoc;
|
||||
deserializeState(jsonCmdObj, CALL_MODE_BUTTON);
|
||||
fileDoc = nullptr;
|
||||
if (!cmdStr.isEmpty())
|
||||
{
|
||||
if (cmdStr.startsWith("!")) {
|
||||
// call limited set of C functions
|
||||
if (cmdStr.startsWith(F("!incBri"))) {
|
||||
lastValidCode = code;
|
||||
incBrightness();
|
||||
} else if (cmdStr.startsWith(F("!decBri"))) {
|
||||
lastValidCode = code;
|
||||
decBrightness();
|
||||
} else if (cmdStr.startsWith(F("!presetF"))) { //!presetFallback
|
||||
uint8_t p1 = fdo["PL"] ? fdo["PL"] : 1;
|
||||
uint8_t p2 = fdo["FX"] ? fdo["FX"] : random8(MODE_COUNT);
|
||||
uint8_t p3 = fdo["FP"] ? fdo["FP"] : 0;
|
||||
presetFallback(p1, p2, p3);
|
||||
}
|
||||
} else {
|
||||
// HTTP API command
|
||||
if (cmdStr.indexOf("~") || fdo["rpt"])
|
||||
{
|
||||
// repeatable action
|
||||
lastValidCode = code;
|
||||
}
|
||||
if (effectCurrent == 0 && cmdStr.indexOf("FP=") > -1) {
|
||||
// setting palette but it wont show because effect is solid
|
||||
effectCurrent = FX_MODE_GRADIENT;
|
||||
}
|
||||
if (!cmdStr.startsWith("win&")) {
|
||||
cmdStr = "win&" + cmdStr;
|
||||
}
|
||||
handleSet(nullptr, cmdStr, false);
|
||||
}
|
||||
} else if (!jsonCmdObj.isNull()) {
|
||||
// command is JSON object
|
||||
//allow applyPreset() to reuse JSON buffer, or it would alloc. a second buffer and run out of mem.
|
||||
fileDoc = &irDoc;
|
||||
deserializeState(jsonCmdObj, CALL_MODE_BUTTON);
|
||||
fileDoc = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -233,10 +233,6 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
|
||||
notifyMacro = request->hasArg(F("SM"));
|
||||
notifyTwice = request->hasArg(F("S2"));
|
||||
|
||||
liveHSVCorrection = request->hasArg(F("HX"));
|
||||
liveHSVSaturation = request->arg(F("HS")).toInt();
|
||||
liveHSVValue = request->arg(F("HV")).toInt();
|
||||
|
||||
nodeListEnabled = request->hasArg(F("NL"));
|
||||
if (!nodeListEnabled) Nodes.clear();
|
||||
nodeBroadcastEnabled = request->hasArg(F("NB"));
|
||||
|
@ -438,11 +438,6 @@ void setRealtimePixel(uint16_t i, byte r, byte g, byte b, byte w)
|
||||
uint16_t pix = i + arlsOffset;
|
||||
if (pix < ledCount)
|
||||
{
|
||||
if (liveHSVCorrection) {
|
||||
byte correctedColors[3] = {0,0,0};
|
||||
correctColors(r, g, b, correctedColors);
|
||||
r = correctedColors[0]; g = correctedColors[1]; b = correctedColors[2];
|
||||
}
|
||||
if (!arlsDisableGammaCorrection && strip.gammaCorrectCol)
|
||||
{
|
||||
strip.setPixelColor(pix, strip.gamma8(r), strip.gamma8(g), strip.gamma8(b), strip.gamma8(w));
|
||||
|
@ -8,7 +8,7 @@
|
||||
*/
|
||||
|
||||
// version code in format yymmddb (b = daily build)
|
||||
#define VERSION 2109181
|
||||
#define VERSION 2109182
|
||||
|
||||
//uncomment this if you have a "my_config.h" file you'd like to use
|
||||
//#define WLED_USE_MY_CONFIG
|
||||
@ -302,9 +302,6 @@ WLED_GLOBAL byte irEnabled _INIT(0); // Infrared receiver
|
||||
WLED_GLOBAL uint16_t udpPort _INIT(21324); // WLED notifier default port
|
||||
WLED_GLOBAL uint16_t udpPort2 _INIT(65506); // WLED notifier supplemental port
|
||||
WLED_GLOBAL uint16_t udpRgbPort _INIT(19446); // Hyperion port
|
||||
WLED_GLOBAL bool liveHSVCorrection _INIT(false);
|
||||
WLED_GLOBAL uint16_t liveHSVSaturation _INIT(13);
|
||||
WLED_GLOBAL uint16_t liveHSVValue _INIT(10);
|
||||
|
||||
WLED_GLOBAL uint8_t syncGroups _INIT(0x01); // sync groups this instance syncs (bit mapped)
|
||||
WLED_GLOBAL uint8_t receiveGroups _INIT(0x01); // sync receive groups this instance belongs to (bit mapped)
|
||||
|
@ -425,10 +425,6 @@ void getSettingsJS(byte subPage, char* dest)
|
||||
sappend('v',SET_F("GS"),syncGroups);
|
||||
sappend('v',SET_F("GR"),receiveGroups);
|
||||
|
||||
sappend('c',SET_F("HX"),liveHSVCorrection);
|
||||
sappend('v',SET_F("HS"),liveHSVSaturation);
|
||||
sappend('v',SET_F("HV"),liveHSVValue);
|
||||
|
||||
sappend('c',SET_F("RB"),receiveNotificationBrightness);
|
||||
sappend('c',SET_F("RC"),receiveNotificationColor);
|
||||
sappend('c',SET_F("RX"),receiveNotificationEffects);
|
||||
|
Loading…
Reference in New Issue
Block a user