/* * Receives client input */ void _setRandomColor(bool _sec) { lastRandomIndex = strip.get_random_wheel_index(lastRandomIndex); uint32_t _color = strip.color_wheel(lastRandomIndex); if (_sec){ white_sec = ((_color >> 24) & 0xFF); col_sec[0] = ((_color >> 16) & 0xFF); col_sec[1] = ((_color >> 8) & 0xFF); col_sec[2] = (_color & 0xFF); } else { white = ((_color >> 24) & 0xFF); col[0] = ((_color >> 16) & 0xFF); col[1] = ((_color >> 8) & 0xFF); col[2] = (_color & 0xFF); } } void handleSettingsSet(uint8_t subPage) { //0: menu 1: wifi 2: leds 3: ui 4: sync 5: time 6: sec if (subPage <1 || subPage >6) return; //WIFI SETTINGS if (subPage == 1) { if (server.hasArg("CSSID")) clientssid = server.arg("CSSID"); if (server.hasArg("CPASS")) { if (!server.arg("CPASS").indexOf('*') == 0) { DEBUG_PRINTLN("Setting pass"); clientpass = server.arg("CPASS"); } } if (server.hasArg("CMDNS")) cmdns = server.arg("CMDNS"); if (server.hasArg("APWTM")) { int i = server.arg("APWTM").toInt(); if (i >= 0 && i <= 255) apWaitTimeSecs = i; } if (server.hasArg("APSSID")) apssid = server.arg("APSSID"); aphide = server.hasArg("APHSSID"); if (server.hasArg("APPASS")) { if (!server.arg("APPASS").indexOf('*') == 0) appass = server.arg("APPASS"); } if (server.hasArg("APCHAN")) { int chan = server.arg("APCHAN").toInt(); if (chan > 0 && chan < 14) apchannel = chan; } if (server.hasArg("CSIP0")) { int i = server.arg("CSIP0").toInt(); if (i >= 0 && i <= 255) staticip[0] = i; } if (server.hasArg("CSIP1")) { int i = server.arg("CSIP1").toInt(); if (i >= 0 && i <= 255) staticip[1] = i; } if (server.hasArg("CSIP2")) { int i = server.arg("CSIP2").toInt(); if (i >= 0 && i <= 255) staticip[2] = i; } if (server.hasArg("CSIP3")) { int i = server.arg("CSIP3").toInt(); if (i >= 0 && i <= 255) staticip[3] = i; } if (server.hasArg("CSGW0")) { int i = server.arg("CSGW0").toInt(); if (i >= 0 && i <= 255) staticgateway[0] = i; } if (server.hasArg("CSGW1")) { int i = server.arg("CSGW1").toInt(); if (i >= 0 && i <= 255) staticgateway[1] = i; } if (server.hasArg("CSGW2")) { int i = server.arg("CSGW2").toInt(); if (i >= 0 && i <= 255) staticgateway[2] = i; } if (server.hasArg("CSGW3")) { int i = server.arg("CSGW3").toInt(); if (i >= 0 && i <= 255) staticgateway[3] = i; } if (server.hasArg("CSSN0")) { int i = server.arg("CSSN0").toInt(); if (i >= 0 && i <= 255) staticsubnet[0] = i; } if (server.hasArg("CSSN1")) { int i = server.arg("CSSN1").toInt(); if (i >= 0 && i <= 255) staticsubnet[1] = i; } if (server.hasArg("CSSN2")) { int i = server.arg("CSSN2").toInt(); if (i >= 0 && i <= 255) staticsubnet[2] = i; } if (server.hasArg("CSSN3")) { int i = server.arg("CSSN3").toInt(); if (i >= 0 && i <= 255) staticsubnet[3] = i; } } //LED SETTINGS if (subPage == 2) { if (server.hasArg("LEDCN")) { int i = server.arg("LEDCN").toInt(); if (i >= 0 && i <= LEDCOUNT) ledcount = i; strip.setLedCount(ledcount); } if (server.hasArg("CBEOR")) //ignore settings and save current brightness, colors and fx as default { col_s[0] = col[0]; col_s[1] = col[1]; col_s[2] = col[2]; if (useRGBW) white_s = white; bri_s = bri; effectDefault = effectCurrent; effectSpeedDefault = effectSpeed; } else { if (server.hasArg("CLDFR")) { int i = server.arg("CLDFR").toInt(); if (i >= 0 && i <= 255) col_s[0] = i; } if (server.hasArg("CLDFG")) { int i = server.arg("CLDFG").toInt(); if (i >= 0 && i <= 255) col_s[1] = i; } if (server.hasArg("CLDFB")) { int i = server.arg("CLDFB").toInt(); if (i >= 0 && i <= 255) col_s[2] = i; } if (server.hasArg("CSECR")) { int i = server.arg("CSECR").toInt(); if (i >= 0 && i <= 255) col_sec_s[0] = i; } if (server.hasArg("CSECG")) { int i = server.arg("CSECG").toInt(); if (i >= 0 && i <= 255) col_sec_s[1] = i; } if (server.hasArg("CSECB")) { int i = server.arg("CSECB").toInt(); if (i >= 0 && i <= 255) col_sec_s[2] = i; } if (server.hasArg("CSECW")) { int i = server.arg("CSECW").toInt(); if (i >= 0 && i <= 255) white_sec_s = i; } if (server.hasArg("CLDFW")) { int i = server.arg("CLDFW").toInt(); if (i >= 0 && i <= 255) { useRGBW = true; white_s = i; } else { useRGBW = false; white_s = 0; } } if (server.hasArg("CLDFA")) { int i = server.arg("CLDFA").toInt(); if (i >= 0 && i <= 255) bri_s = i; } if (server.hasArg("FXDEF")) { int i = server.arg("FXDEF").toInt(); if (i >= 0 && i <= 255) effectDefault = i; } if (server.hasArg("SXDEF")) { int i = server.arg("SXDEF").toInt(); if (i >= 0 && i <= 255) effectSpeedDefault = i; } if (server.hasArg("IXDEF")) { int i = server.arg("IXDEF").toInt(); if (i >= 0 && i <= 255) effectIntensityDefault = i; } } turnOnAtBoot = server.hasArg("BOOTN"); if (server.hasArg("BOOTP")) { int i = server.arg("BOOTP").toInt(); if (i >= 0 && i <= 25) bootPreset = i; } useGammaCorrectionBri = server.hasArg("GCBRI"); useGammaCorrectionRGB = server.hasArg("GCRGB"); fadeTransition = server.hasArg("TFADE"); sweepTransition = server.hasArg("TSWEE"); sweepDirection = !server.hasArg("TSDIR"); if (server.hasArg("TDLAY")) { int i = server.arg("TDLAY").toInt(); if (i > 0){ transitionDelay = i; } } if (server.hasArg("TLBRI")) { nightlightTargetBri = server.arg("TLBRI").toInt(); } if (server.hasArg("TLDUR")) { int i = server.arg("TLDUR").toInt(); if (i > 0) nightlightDelayMins = i; } nightlightFade = server.hasArg("TLFDE"); if (server.hasArg("OLDEF")) { int i = server.arg("OLDEF").toInt(); if (i >= 0 && i <= 255) overlayDefault = i; } if (server.hasArg("WOFFS")) { int i = server.arg("WOFFS").toInt(); if (i >= -255 && i <= 255) arlsOffset = i; arlsSign = (i>=0)?true:false; } if (server.hasArg("NRBRI")) { int i = server.arg("NRBRI").toInt(); if (i > 0) briMultiplier = i; } } //UI if (subPage == 3) { if (server.hasArg("DESC")) serverDescription = server.arg("DESC"); useHSBDefault = server.hasArg("COLMD"); useHSB = useHSBDefault; if (server.hasArg("THEME")) currentTheme = server.arg("THEME").toInt(); for(int i=0;i<6;i++) { if (server.hasArg("CCOL"+String(i))) cssCol[i] = server.arg("CCOL"+String(i)); } if (server.hasArg("CFONT")) cssFont = server.arg("CFONT"); buildCssColorString(); } //SYNC if (subPage == 4) { buttonEnabled = server.hasArg("BTNON"); if (server.hasArg("NUDPP")) { udpPort = server.arg("NUDPP").toInt(); } receiveNotificationBrightness = server.hasArg("NRCBR"); receiveNotificationColor = server.hasArg("NRCCL"); receiveNotificationEffects = server.hasArg("NRCFX"); receiveNotifications = (receiveNotificationBrightness || receiveNotificationColor || receiveNotificationEffects); notifyDirectDefault = server.hasArg("NSDIR"); notifyDirect = notifyDirectDefault; notifyButton = server.hasArg("NSBTN"); alexaEnabled = server.hasArg("ALEXA"); if (server.hasArg("AINVN")) alexaInvocationName = server.arg("AINVN"); alexaNotify = server.hasArg("NSALX"); notifyHue = server.hasArg("NSHUE"); for (int i=0;i<4;i++){ String a = "HUIP"+String(i); if (server.hasArg(a)) { int j = server.arg(a).toInt(); if (j >= 0 && j <= 255) hueIP[i] = j; } } if (server.hasArg("HUELI")) { int i = server.arg("HUELI").toInt(); if (i > 0) huePollLightId = i; } if (server.hasArg("HUEPI")) { int i = server.arg("HUEPI").toInt(); if (i > 50) huePollIntervalMs = i; } hueApplyOnOff = server.hasArg("HURIO"); hueApplyBri = server.hasArg("HURBR"); hueApplyColor = server.hasArg("HURCL"); if (server.hasArg("HUEPL")) { if (!huePollingEnabled) hueAttempt = true; if (!setupHue()) hueAttempt = true; } else { huePollingEnabled = false; hueError = "Inactive"; } } //TIME if (subPage == 5) { ntpEnabled = server.hasArg("NTPON"); if (ntpEnabled && WiFi.status() == WL_CONNECTED && !ntpConnected) ntpConnected = ntpUdp.begin(ntpLocalPort); //start if not already connected } //SECURITY if (subPage == 6) { if (server.hasArg("RESET")) { clearEEPROM(); serveMessage(200, "All Settings erased.", "Connect to WLED-AP to setup again...",255); reset(); } bool pwdCorrect = !otaLock; //always allow access if ota not locked if (server.hasArg("OPASS")) { if (otaLock && otapass.equals(server.arg("OPASS"))) { pwdCorrect = true; } if (!otaLock && server.arg("OPASS").length() > 0) { otapass = server.arg("OPASS"); } } if (pwdCorrect) //allow changes if correct pwd or no ota active { otaLock = server.hasArg("NOOTA"); wifiLock = server.hasArg("OWIFI"); recoveryAPDisabled = server.hasArg("NORAP"); aOtaEnabled = server.hasArg("AROTA"); } } saveSettingsToEEPROM(); } boolean handleSet(String req) { boolean effectUpdated = false; if (!(req.indexOf("win") >= 0)) { return false; } int pos = 0; DEBUG_PRINT("API req: "); DEBUG_PRINTLN(req); //save macro, requires &MS=() format pos = req.indexOf("&MS="); if (pos > 0) { int i = req.substring(pos + 4).toInt(); pos = req.indexOf('(') +1; if (pos > 0) { int en = req.indexOf(')'); String mc = req.substring(pos); if (en > 0) mc = req.substring(pos, en); saveMacro(i, mc); } pos = req.indexOf("IN"); if (pos < 1) XML_response(); return true; //if you save a macro in one request, other commands in that request are ignored due to unwanted behavior otherwise } //set brigthness pos = req.indexOf("&A="); if (pos > 0) { bri = req.substring(pos + 3).toInt(); } //set hue pos = req.indexOf("HU="); if (pos > 0) { uint16_t temphue = req.substring(pos + 3).toInt(); uint8_t tempsat = 255; pos = req.indexOf("SA="); if (pos > 0) { tempsat = req.substring(pos + 3).toInt(); } colorHStoRGB(temphue,tempsat,(req.indexOf("H2")>0)? col_sec:col); } //set red value pos = req.indexOf("&R="); if (pos > 0) { col[0] = req.substring(pos + 3).toInt(); } //set green value pos = req.indexOf("&G="); if (pos > 0) { col[1] = req.substring(pos + 3).toInt(); } //set blue value pos = req.indexOf("&B="); if (pos > 0) { col[2] = req.substring(pos + 3).toInt(); } //set white value pos = req.indexOf("&W="); if (pos > 0) { white = req.substring(pos + 3).toInt(); } //set 2nd red value pos = req.indexOf("R2="); if (pos > 0) { col_sec[0] = req.substring(pos + 3).toInt(); } //set 2nd green value pos = req.indexOf("G2="); if (pos > 0) { col_sec[1] = req.substring(pos + 3).toInt(); } //set 2nd blue value pos = req.indexOf("B2="); if (pos > 0) { col_sec[2] = req.substring(pos + 3).toInt(); } //set 2nd white value pos = req.indexOf("W2="); if (pos > 0) { white_sec = req.substring(pos + 3).toInt(); } //set 2nd to white pos = req.indexOf("SW"); if (pos > 0) { if(useRGBW) { white_sec = 255; col_sec[0] = 0; col_sec[1] = 0; col_sec[2] = 0; } else { col_sec[0] = 255; col_sec[1] = 255; col_sec[2] = 255; } } //set 2nd to black pos = req.indexOf("SB"); if (pos > 0) { white_sec = 0; col_sec[0] = 0; col_sec[1] = 0; col_sec[2] = 0; } //set to random hue SR=0->1st SR=1->2nd pos = req.indexOf("SR"); if (pos > 0) { _setRandomColor(req.substring(pos + 3).toInt()); } //set 2nd to 1st pos = req.indexOf("SP"); if (pos > 0) { col_sec[0] = col[0]; col_sec[1] = col[1]; col_sec[2] = col[2]; white_sec = white; } //swap 2nd & 1st pos = req.indexOf("SC"); if (pos > 0) { uint8_t _temp[4]; for (int i = 0; i<3; i++) { _temp[i] = col[i]; col[i] = col_sec[i]; col_sec[i] = _temp[i]; } _temp[3] = white; white = white_sec; white_sec = _temp[3]; } //set current effect index pos = req.indexOf("FX="); if (pos > 0) { if (effectCurrent != req.substring(pos + 3).toInt()) { effectCurrent = req.substring(pos + 3).toInt(); strip.setMode(effectCurrent); effectUpdated = true; } } //set effect speed pos = req.indexOf("SX="); if (pos > 0) { if (effectSpeed != req.substring(pos + 3).toInt()) { effectSpeed = req.substring(pos + 3).toInt(); strip.setSpeed(effectSpeed); effectUpdated = true; } } //set effect intensity pos = req.indexOf("IX="); if (pos > 0) { if (effectIntensity != req.substring(pos + 3).toInt()) { effectIntensity = req.substring(pos + 3).toInt(); strip.setIntensity(effectIntensity); effectUpdated = true; } } //set hue polling light: 0 -off pos = req.indexOf("HP="); if (pos > 0) { int id = req.substring(pos + 3).toInt(); if (id > 0) { if (id < 100) huePollLightId = id; setupHue(); } else { huePollingEnabled = false; } } //set default control mode (0 - RGB, 1 - HSB) pos = req.indexOf("MD="); if (pos > 0) { useHSB = req.substring(pos + 3).toInt(); } //set advanced overlay pos = req.indexOf("OL="); if (pos > 0) { overlayCurrent = req.substring(pos + 3).toInt(); strip.unlockAll(); } //set individual pixel (range) to current color pos = req.indexOf("&I="); if (pos > 0){ int index = req.substring(pos + 3).toInt(); pos = req.indexOf("I2="); if (pos > 0){ int index2 = req.substring(pos + 3).toInt(); strip.setRange(index, index2); } else { strip.setIndividual(index); } } //(un)lock pixel (ranges) pos = req.indexOf("&L="); if (pos > 0){ int index = req.substring(pos + 3).toInt(); pos = req.indexOf("L2="); if (pos > 0){ int index2 = req.substring(pos + 3).toInt(); if (req.indexOf("UL") > 0) { strip.unlockRange(index, index2); } else { strip.lockRange(index, index2); } } else { if (req.indexOf("UL") > 0) { strip.unlock(index); } else { strip.lock(index); } } } //apply macro pos = req.indexOf("&M="); if (pos > 0) { applyMacro(req.substring(pos + 3).toInt()); } //toggle send UDP direct notifications if (req.indexOf("SN=") > 0) { notifyDirect = true; if (req.indexOf("SN=0") > 0) { notifyDirect = false; } } //toggle receive UDP direct notifications if (req.indexOf("RN=") > 0) { receiveNotifications = true; if (req.indexOf("RN=0") > 0) { receiveNotifications = false; } } //toggle nightlight mode pos = req.indexOf("NL="); if (pos > 0) { if (req.indexOf("NL=0") > 0) { nightlightActive = false; bri = bri_t; } else { nightlightActive = true; nightlightDelayMins = req.substring(pos + 3).toInt(); nightlightStartTime = millis(); } } //set nightlight target brightness pos = req.indexOf("NT="); if (pos > 0) { nightlightTargetBri = req.substring(pos + 3).toInt(); nightlightActive_old = false; //re-init } //toggle nightlight fade if (req.indexOf("NF=") > 0) { if (req.indexOf("NF=0") > 0) { nightlightFade = false; } else { nightlightFade = true; } nightlightActive_old = false; //re-init } //toggle general purpose output pos = req.indexOf("AX="); if (pos > 0) { auxTime = req.substring(pos + 3).toInt(); auxActive = true; if (auxTime == 0) auxActive = false; } //main toggle on/off pos = req.indexOf("&T="); if (pos > 0) { switch (req.substring(pos + 3).toInt()) { case 0: if (bri != 0){bri_last = bri; bri = 0;} break; //off case 1: bri = bri_last; break; //on default: if (bri == 0) //toggle { bri = bri_last; } else { bri_last = bri; bri = 0; } } } //set time (unix timestamp) pos = req.indexOf("ST="); if (pos > 0) { setTime(req.substring(pos+3).toInt()); } //set countdown goal (unix timestamp) pos = req.indexOf("CT="); if (pos > 0) { countdownTime = req.substring(pos+3).toInt(); if (countdownTime - now() > 0) countdownOverTriggered = false; } //set custom chase data bool _cc_updated = false; pos = req.indexOf("C0="); if (pos > 0) {cc_start = (req.substring(pos + 3).toInt()); _cc_updated = true;} pos = req.indexOf("C1="); if (pos > 0) {cc_index1 = (req.substring(pos + 3).toInt()); _cc_updated = true;} pos = req.indexOf("C2="); if (pos > 0) {cc_index2 = (req.substring(pos + 3).toInt()); _cc_updated = true;} pos = req.indexOf("CP="); if (pos > 0) {cc_numPrimary = (req.substring(pos + 3).toInt()); _cc_updated = true;} pos = req.indexOf("CS="); if (pos > 0) {cc_numSecondary = (req.substring(pos + 3).toInt()); _cc_updated = true;} pos = req.indexOf("CM="); if (pos > 0) {cc_step = (req.substring(pos + 3).toInt()); _cc_updated = true;} pos = req.indexOf("CF="); if (pos > 0) {cc_fromStart = (req.substring(pos + 3).toInt()); _cc_updated = true;} pos = req.indexOf("CE="); if (pos > 0) {cc_fromEnd = (req.substring(pos + 3).toInt()); _cc_updated = true;} if (_cc_updated) strip.setCustomChase(cc_index1, cc_index2, cc_start, cc_numPrimary, cc_numSecondary, cc_step, cc_fromStart, cc_fromEnd); //set presets pos = req.indexOf("PS="); //saves current in preset if (pos > 0) { savePreset(req.substring(pos + 3).toInt()); } pos = req.indexOf("PL="); //applies entire preset if (pos > 0) { applyPreset(req.substring(pos + 3).toInt(), true, true, true); effectUpdated = true; } pos = req.indexOf("PA="); //applies brightness from preset if (pos > 0) { applyPreset(req.substring(pos + 3).toInt(), true, false, false); } pos = req.indexOf("PC="); //applies color from preset if (pos > 0) { applyPreset(req.substring(pos + 3).toInt(), false, true, false); } pos = req.indexOf("PX="); //applies effects from preset if (pos > 0) { applyPreset(req.substring(pos + 3).toInt(), false, false, true); effectUpdated = true; } #ifdef CRONIXIE pos = req.indexOf("NX="); //sets digits to code if (pos > 0) { setCronixie(req.substring(pos + 3, pos + 9).c_str()); } pos = req.indexOf("NM="); //mode, 1 countdown if (pos > 0) { cronixieCountdown = true; if (req.indexOf("NM=0") > 0) { cronixieCountdown = false; } } if (req.indexOf("NB=") > 0) //sets backlight { cronixieBacklight = true; if (req.indexOf("NB=0") > 0) { cronixieBacklight = false; } strip.setCronixieBacklight(cronixieBacklight); cronixieRefreshedTime = 0; } #endif //internal call, does not send XML response pos = req.indexOf("IN"); if (pos < 1) XML_response(); //do not send UDP notifications this time pos = req.indexOf("NN"); if (pos > 0) { colorUpdated(5); return true; } if (effectUpdated) { colorUpdated(6); } else { colorUpdated(1); } return true; }