diff --git a/wled00/data/settings_time.htm b/wled00/data/settings_time.htm index d8e94d634d..cc98fd1b1b 100644 --- a/wled00/data/settings_time.htm +++ b/wled00/data/settings_time.htm @@ -190,7 +190,7 @@ } } function pMP() { // populateMacroPresets - var presetOpts = '' + sortedPresetOptions; + var presetOpts = '' + sortedPresetOptions; var fields = ['A0','A1','MC','MN']; for (var f of fields) { var inp = gN(f); @@ -219,13 +219,38 @@ rPS(sel, presetOpts, "data-preset"); } } + function bAO() { // buildAnalogOptions: analog functions + per-segment opacity (segment 0 included; MD=0 => segment 0) + var o = ''; + for (var j=0; j<=32; j++) o += ``; + o += ''; + return o; + } + function isAnalogBtn(t) { return t==7 || t==8; } // BTN_TYPE_ANALOG / BTN_TYPE_ANALOG_INVERTED + function isSwitchBtn(t) { return t==4 || t==5 || t==9; } // BTN_TYPE_SWITCH / BTN_TYPE_PIR_SENSOR / BTN_TYPE_TOUCH_SWITCH + function btnTypeName(t) { // mirrors the button type dropdown on the LED settings page + switch (+t) { + case 2: return 'Pushbutton'; + case 3: return 'Push inverted'; + case 4: return 'Switch'; + case 5: return 'PIR sensor'; + case 6: return 'Touch'; + case 7: return 'Analog'; + case 8: return 'Analog inverted'; + case 9: return 'Touch (switch)'; + default: return 'Disabled'; + } + } function rBPO() { // refreshButtonPresetOptions - var presetOpts = '' + sortedPresetOptions; + var presetOpts = '' + sortedPresetOptions; + var analogOpts = bAO(); var container = gId("macros"); if (!container) return; + // analog buttons only have an MD select (MP/ML are hidden 0 inputs); MD uses analog options, never presets var sels = container.querySelectorAll('select[name^="MP"],select[name^="ML"],select[name^="MD"]'); for (var sel of sels) { - rPS(sel, presetOpts, "data-preset"); + var bb = sel.closest ? sel.closest(".bb") : null; + var t = bb ? parseInt(bb.getAttribute("data-btype")||"0",10) : 0; + rPS(sel, isAnalogBtn(t) ? analogOpts : presetOpts, "data-preset"); } } function Wd() @@ -246,33 +271,73 @@ if (d.Sf.LTR.value==="S") { d.Sf.LT.value = -1*parseFloat(d.Sf.LT.value); } if (d.Sf.LNR.value==="W") { d.Sf.LN.value = -1*parseFloat(d.Sf.LN.value); } } - function addRow(i,p,l,d) { + function addRow(i,p,l,d,t) { + if (t===undefined) t = 0; var b = String.fromCharCode((i<10?48:55)+i); - var presetOpts = '' + sortedPresetOptions; + var presetOpts = '' + sortedPresetOptions; + var typeName = btnTypeName(t); var buttonBlock = document.createElement('div'); buttonBlock.className = 'bb'; - buttonBlock.innerHTML = ` -
Button (switch) ${i}
-
-
- - + buttonBlock.setAttribute('data-btype', t); // read back by rBPO() to rebuild selects correctly + if (isAnalogBtn(t)) { + // analog buttons: MD holds the function/segment; short/long press are unused (firmware defaults missing MP/ML to 0) + buttonBlock.innerHTML = ` +
Analog ${i} - ${typeName}
+
+
+ + +
-
- - +
+ `; + sPSV(buttonBlock.querySelector('select[name="MD'+b+'"]'), String(d), "data-preset"); + } else if (isSwitchBtn(t)) { + // switches: MP fires on On->Off, ML on Off->On; double press (MD) is unused (firmware defaults missing MD to 0) + buttonBlock.innerHTML = ` +
Switch ${i} - ${typeName}
+
+
+ + +
+
+ + +
-
- - +
+ `; + var switchSels = buttonBlock.querySelectorAll("select"); + var switchVals = [String(p), String(l)]; + for (var si=0; siButton ${i} - ${typeName}
+
+
+ + +
+
+ + +
+
+ + +
-
-
- `; - var buttonSels = buttonBlock.querySelectorAll("select"); - var buttonVals = [String(p), String(l), String(d)]; - for (var si=0; si + `; + var buttonSels = buttonBlock.querySelectorAll("select"); + var buttonVals = [String(p), String(l), String(d)]; + for (var si=0; siTimer & Alexa Presets Alexa On/Off Preset:
-

Button (switch) Action Presets

+

Button Action Presets

Analog Button setup
diff --git a/wled00/xml.cpp b/wled00/xml.cpp index 812ef8c207..03d4cd1101 100644 --- a/wled00/xml.cpp +++ b/wled00/xml.cpp @@ -628,7 +628,7 @@ void getSettingsJS(byte subPage, Print& settingsScript) printSetFormValue(settingsScript,PSTR("MN"),macroNl); int ii = 0; for (const auto &button : buttons) { - settingsScript.printf_P(PSTR("addRow(%d,%d,%d,%d);"), ii++, button.macroButton, button.macroLongPress, button.macroDoublePress); + settingsScript.printf_P(PSTR("addRow(%d,%d,%d,%d,%d);"), ii++, button.macroButton, button.macroLongPress, button.macroDoublePress, button.type); } settingsScript.printf_P(PSTR("maxTimers=%d;"), WLED_MAX_TIMERS);