From dbce5713c71c2be8ea89fae6995275f614ce0034 Mon Sep 17 00:00:00 2001 From: Benjam Welker Date: Mon, 1 Jun 2026 10:18:51 -0600 Subject: [PATCH 1/3] add analog button options --- wled00/data/settings_time.htm | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/wled00/data/settings_time.htm b/wled00/data/settings_time.htm index d8e94d634d..fd6b6518e3 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); @@ -220,12 +220,15 @@ } } function rBPO() { // refreshButtonPresetOptions - var presetOpts = '' + sortedPresetOptions; + var presetOpts = '' + sortedPresetOptions; + var analogOpts = ''; + for (var j=1; j<=32; j++) analogOpts += ``; + analogOpts += ''; var container = gId("macros"); if (!container) return; var sels = container.querySelectorAll('select[name^="MP"],select[name^="ML"],select[name^="MD"]'); for (var sel of sels) { - rPS(sel, presetOpts, "data-preset"); + rPS(sel, presetOpts + (sel.name.startsWith("MD") ? analogOpts : ''), "data-preset"); } } function Wd() @@ -248,7 +251,10 @@ } function addRow(i,p,l,d) { var b = String.fromCharCode((i<10?48:55)+i); - var presetOpts = '' + sortedPresetOptions; + var presetOpts = '' + sortedPresetOptions; + var analogOpts = ''; + for (var j=1; j<=32; j++) analogOpts += ``; + analogOpts += ''; var buttonBlock = document.createElement('div'); buttonBlock.className = 'bb'; buttonBlock.innerHTML = ` @@ -264,7 +270,7 @@
- +

From 47026f5ff49590a2ee570cd43eea948d981a5010 Mon Sep 17 00:00:00 2001 From: Benjam Welker Date: Mon, 1 Jun 2026 16:24:08 -0600 Subject: [PATCH 2/3] fix issues with duplicate options for digital vs analog --- wled00/data/settings_time.htm | 95 ++++++++++++++++++++++++----------- wled00/xml.cpp | 2 +- 2 files changed, 68 insertions(+), 29 deletions(-) diff --git a/wled00/data/settings_time.htm b/wled00/data/settings_time.htm index fd6b6518e3..fd1ebe4caa 100644 --- a/wled00/data/settings_time.htm +++ b/wled00/data/settings_time.htm @@ -219,16 +219,37 @@ 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 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 analogOpts = ''; - for (var j=1; j<=32; j++) analogOpts += ``; - analogOpts += ''; + 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 + (sel.name.startsWith("MD") ? analogOpts : ''), "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() @@ -249,36 +270,54 @@ 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 analog = isAnalogBtn(t); var presetOpts = '' + sortedPresetOptions; - var analogOpts = ''; - for (var j=1; j<=32; j++) analogOpts += ``; - analogOpts += ''; + 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 (analog) { + // analog buttons: MD holds the function/segment; short/long press are unused and forced to 0 + buttonBlock.innerHTML = ` +
Button ${i} - ${typeName}
+
+ + +
+ + +
-
- - +
+ `; + sPSV(buttonBlock.querySelector('select[name="MD'+b+'"]'), String(d), "data-preset"); + } else { + buttonBlock.innerHTML = ` +
Button ${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; si Date: Tue, 9 Jun 2026 19:25:33 -0600 Subject: [PATCH 3/3] dynamic button type options --- wled00/data/settings_time.htm | 42 ++++++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/wled00/data/settings_time.htm b/wled00/data/settings_time.htm index fd1ebe4caa..cc98fd1b1b 100644 --- a/wled00/data/settings_time.htm +++ b/wled00/data/settings_time.htm @@ -221,11 +221,12 @@ } 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 += ``; + 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'; @@ -273,19 +274,16 @@ function addRow(i,p,l,d,t) { if (t===undefined) t = 0; var b = String.fromCharCode((i<10?48:55)+i); - var analog = isAnalogBtn(t); var presetOpts = '' + sortedPresetOptions; var typeName = btnTypeName(t); var buttonBlock = document.createElement('div'); buttonBlock.className = 'bb'; buttonBlock.setAttribute('data-btype', t); // read back by rBPO() to rebuild selects correctly - if (analog) { - // analog buttons: MD holds the function/segment; short/long press are unused and forced to 0 + if (isAnalogBtn(t)) { + // analog buttons: MD holds the function/segment; short/long press are unused (firmware defaults missing MP/ML to 0) buttonBlock.innerHTML = ` -
Button ${i} - ${typeName}
+
Analog ${i} - ${typeName}
- -
@@ -294,20 +292,42 @@
`; 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}
- +
- +
- +
@@ -417,7 +437,7 @@

Timer & Alexa Presets

Alexa On/Off Preset:
-

Button (switch) Action Presets

+

Button Action Presets

Analog Button setup