From 42d5def28e96bbac2f02418a2dee73e3a8e2e55e Mon Sep 17 00:00:00 2001 From: stingerman1 Date: Fri, 28 Nov 2025 22:53:25 -0600 Subject: [PATCH 1/2] committed --- boards/esp32-s3-devkitc-1-n16r8v.json | 53 +++++++++++++++++++++++++++ platformio.ini | 16 ++++++++ 2 files changed, 69 insertions(+) create mode 100644 boards/esp32-s3-devkitc-1-n16r8v.json diff --git a/boards/esp32-s3-devkitc-1-n16r8v.json b/boards/esp32-s3-devkitc-1-n16r8v.json new file mode 100644 index 0000000000..98322a307c --- /dev/null +++ b/boards/esp32-s3-devkitc-1-n16r8v.json @@ -0,0 +1,53 @@ +{ + "build": { + "arduino":{ + "ldscript": "esp32s3_out.ld", + "partitions": "default_16MB.csv", + "memory_type": "qio_opi" + }, + "core": "esp32", + "extra_flags": [ + "-DARDUINO_ESP32S3_DEV", + "-DBOARD_HAS_PSRAM", + "-DARDUINO_USB_MODE=1", + "-DARDUINO_USB_CDC_ON_BOOT=1" + ], + "f_cpu": "240000000L", + "f_flash": "80000000L", + "flash_mode": "qio", + "psram_type": "opi", + "hwids": [ + [ + "0x303A", + "0x1001" + ] + ], + "mcu": "esp32s3", + "variant": "esp32s3" + }, + "connectivity": [ + "wifi", + "bluetooth" + ], + "debug": { + "default_tool": "esp-builtin", + "onboard_tools": [ + "esp-builtin" + ], + "openocd_target": "esp32s3.cfg" + }, + "frameworks": [ + "arduino", + "espidf" + ], + "name": "Espressif ESP32-S3-DevKitC-1-N16R8V (16 MB QD, 8MB PSRAM)", + "upload": { + "flash_size": "16MB", + "maximum_ram_size": 327680, + "maximum_size": 16777216, + "require_upload_port": true, + "speed": 921600 + }, + "url": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/hw-reference/esp32s3/user-guide-devkitc-1.html", + "vendor": "Espressif" + } \ No newline at end of file diff --git a/platformio.ini b/platformio.ini index de02535d69..2a354eda88 100644 --- a/platformio.ini +++ b/platformio.ini @@ -676,3 +676,19 @@ monitor_filters = esp32_exception_decoder board_build.flash_mode = dio custom_usermods = * ; Expands to all usermods in usermods folder board_build.partitions = ${esp32.extreme_partitions} ; We're gonna need a bigger boat + +[env:esp32-s3-devkitc-1-n16r8v] +board = esp32-s3-devkitc-1-n16r8v +platform = ${esp32s3.platform} +platform_packages = ${esp32s3.platform_packages} +upload_speed = 921600 +build_unflags = ${common.build_unflags} +build_flags = ${common.build_flags} ${esp32s3.build_flags} -D WLED_RELEASE_NAME=\"ESP32-S3_16MB_opi_custom\" + -D CONFIG_LITTLEFS_FOR_IDF_3_2 -D WLED_WATCHDOG_TIMEOUT=0 + -D ARDUINO_USB_CDC_ON_BOOT=1 -D ARDUINO_USB_MODE=1 + -DBOARD_HAS_PSRAM +lib_deps = ${esp32s3.lib_deps} +board_build.partitions = ${esp32.extreme_partitions} +board_build.arduino.memory_type = qio_opi +board_build.flash_mode = qio +monitor_filters = esp32_exception_decoder From 51a5c687fd0cdf846105caa2d9b82ea0635e9f36 Mon Sep 17 00:00:00 2001 From: stingerman1 Date: Fri, 28 Nov 2025 22:53:56 -0600 Subject: [PATCH 2/2] x --- .vscode/tasks.json | 95 ++++++++++++++---------- AMD_WLED_S3_V1.0.code-workspace | 8 ++ boards/esp32-s3-devkitc-1-n16r8v.json | 6 +- platformio.ini | 43 +++++------ tools/cdata.js | 2 +- upload_log.txt | Bin 0 -> 8056 bytes wled00/data/index.htm | 2 +- wled00/data/index.js | 102 +++++++++++++++++--------- 8 files changed, 156 insertions(+), 102 deletions(-) create mode 100644 AMD_WLED_S3_V1.0.code-workspace create mode 100644 upload_log.txt diff --git a/.vscode/tasks.json b/.vscode/tasks.json index f46f002b40..881519c72b 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -1,42 +1,57 @@ { - "version": "2.0.0", - "tasks": [ - { - "label": "Build: HTML and binary", - "dependsOn": [ - "Build: HTML only", - "Build: binary only" - ], - "dependsOrder": "sequence", - "problemMatcher": [ - "$platformio" - ] - }, - { - "type": "PlatformIO", - "label": "Build: binary only", - "task": "Build", - "group": { - "kind": "build", - "isDefault": true - }, - "problemMatcher": [ - "$platformio" - ], - "presentation": { - "panel": "shared" - } - }, - { - "type": "npm", - "script": "build", - "group": "build", - "problemMatcher": [], - "label": "Build: HTML only", - "detail": "npm run build", - "presentation": { - "panel": "shared" - } - } - ] + "version": "2.0.0", + "tasks": [ + { + "label": "Build: HTML and binary", + "dependsOn": [ + "Build: HTML only", + "Build: binary only" + ], + "dependsOrder": "sequence", + "problemMatcher": [ + "$platformio" + ] + }, + { + "type": "PlatformIO", + "label": "Build: binary only", + "task": "Build", + "group": { + "kind": "build", + "isDefault": true + }, + "problemMatcher": [ + "$platformio" + ], + "presentation": { + "panel": "shared" + } + }, + { + "type": "npm", + "script": "build", + "group": "build", + "problemMatcher": [], + "label": "Build: HTML only", + "detail": "npm run build", + "presentation": { + "panel": "shared" + } + }, + { + "label": "Build: ESP32-S3 Custom", + "type": "shell", + "command": "pio", + "args": [ + "run", + "--environment", + "esp32-s3-devkitc-1-n16r8v" + ], + "isBackground": false, + "problemMatcher": [ + "$platformio" + ], + "group": "build" + } + ] } \ No newline at end of file diff --git a/AMD_WLED_S3_V1.0.code-workspace b/AMD_WLED_S3_V1.0.code-workspace new file mode 100644 index 0000000000..bab1b7f616 --- /dev/null +++ b/AMD_WLED_S3_V1.0.code-workspace @@ -0,0 +1,8 @@ +{ + "folders": [ + { + "path": ".." + } + ], + "settings": {} +} \ No newline at end of file diff --git a/boards/esp32-s3-devkitc-1-n16r8v.json b/boards/esp32-s3-devkitc-1-n16r8v.json index 98322a307c..a78be167a8 100644 --- a/boards/esp32-s3-devkitc-1-n16r8v.json +++ b/boards/esp32-s3-devkitc-1-n16r8v.json @@ -3,19 +3,17 @@ "arduino":{ "ldscript": "esp32s3_out.ld", "partitions": "default_16MB.csv", - "memory_type": "qio_opi" + "memory_type": "qio_qspi" }, "core": "esp32", "extra_flags": [ "-DARDUINO_ESP32S3_DEV", - "-DBOARD_HAS_PSRAM", "-DARDUINO_USB_MODE=1", "-DARDUINO_USB_CDC_ON_BOOT=1" ], "f_cpu": "240000000L", "f_flash": "80000000L", "flash_mode": "qio", - "psram_type": "opi", "hwids": [ [ "0x303A", @@ -40,7 +38,7 @@ "arduino", "espidf" ], - "name": "Espressif ESP32-S3-DevKitC-1-N16R8V (16 MB QD, 8MB PSRAM)", + "name": "Espressif ESP32-S3-DevKitC-1-N16 (16 MB QD, No PSRAM)", "upload": { "flash_size": "16MB", "maximum_ram_size": 327680, diff --git a/platformio.ini b/platformio.ini index 2a354eda88..539fa1062f 100644 --- a/platformio.ini +++ b/platformio.ini @@ -10,26 +10,28 @@ # ------------------------------------------------------------------------------ # CI/release binaries -default_envs = nodemcuv2 - esp8266_2m - esp01_1m_full - nodemcuv2_160 - esp8266_2m_160 - esp01_1m_full_160 - nodemcuv2_compat - esp8266_2m_compat - esp01_1m_full_compat - esp32dev - esp32dev_debug - esp32_eth - esp32_wrover - lolin_s2_mini - esp32c3dev - esp32c3dev_qio - esp32s3dev_16MB_opi - esp32s3dev_8MB_opi - esp32s3_4M_qspi - usermods +default_envs = esp32s3dev_16MB_opi + ; esp32-s3-devkitc-1-n16r8v + ; nodemcuv2 + ; esp8266_2m + ; esp01_1m_full + ; nodemcuv2_160 + ; esp8266_2m_160 + ; esp01_1m_full_160 + ; nodemcuv2_compat + ; esp8266_2m_compat + ; esp01_1m_full_compat + ; esp32dev + ; esp32dev_debug + ; esp32_eth + ; esp32_wrover + ; lolin_s2_mini + ; esp32c3dev + ; esp32c3dev_qio + ; esp32s3dev_16MB_opi + ; esp32s3dev_8MB_opi + ; esp32s3_4M_qspi + ; usermods src_dir = ./wled00 data_dir = ./wled00/data @@ -685,7 +687,6 @@ upload_speed = 921600 build_unflags = ${common.build_unflags} build_flags = ${common.build_flags} ${esp32s3.build_flags} -D WLED_RELEASE_NAME=\"ESP32-S3_16MB_opi_custom\" -D CONFIG_LITTLEFS_FOR_IDF_3_2 -D WLED_WATCHDOG_TIMEOUT=0 - -D ARDUINO_USB_CDC_ON_BOOT=1 -D ARDUINO_USB_MODE=1 -DBOARD_HAS_PSRAM lib_deps = ${esp32s3.lib_deps} board_build.partitions = ${esp32.extreme_partitions} diff --git a/tools/cdata.js b/tools/cdata.js index c569a6f2aa..e61053178b 100644 --- a/tools/cdata.js +++ b/tools/cdata.js @@ -105,7 +105,7 @@ async function minify(str, type = "plain") { collapseBooleanAttributes: true, collapseInlineTagWhitespace: true, minifyCSS: true, - minifyJS: true, + minifyJS: false, removeAttributeQuotes: true, removeComments: true, sortAttributes: true, diff --git a/upload_log.txt b/upload_log.txt new file mode 100644 index 0000000000000000000000000000000000000000..870e1867e7c490f391771c0e51bbd92fc4e92d9c GIT binary patch literal 8056 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 literal 0 HcmV?d00001 diff --git a/wled00/data/index.htm b/wled00/data/index.htm index 22f1987e93..5d848230b6 100644 --- a/wled00/data/index.htm +++ b/wled00/data/index.htm @@ -367,6 +367,6 @@ --> - + diff --git a/wled00/data/index.js b/wled00/data/index.js index 2d49a26400..6cd442e0d7 100644 --- a/wled00/data/index.js +++ b/wled00/data/index.js @@ -43,16 +43,7 @@ var hol = [ [0, 0, 1, 1, "https://images.alphacoders.com/119/1198800.jpg"] // new year ]; -var cpick = new iro.ColorPicker("#picker", { - width: 260, - wheelLightness: false, - wheelAngle: 270, - wheelDirection: "clockwise", - layout: [{ - component: iro.ui.Wheel, - options: {} - }] -}); +var cpick; function handleVisibilityChange() {if (!d.hidden && new Date () - lastUpdate > 3000) requestJson();} function sCol(na, col) {d.documentElement.style.setProperty(na, col);} @@ -220,6 +211,22 @@ function getURL(path) { } function onLoad() { + try { + cpick = new iro.ColorPicker("#picker", { + width: 260, + wheelLightness: false, + wheelAngle: 270, + wheelDirection: "clockwise", + layout: [{ + component: iro.ui.Wheel, + options: {} + }] + }); + } catch (e) { + console.error("iro load error", e); + if (typeof showToast === "function") showToast("Color Picker Error: " + e, true); + } + let l = window.location; if (l.protocol == "file:") { loc = true; @@ -274,8 +281,10 @@ function onLoad() selectSlot(0); updateTablinks(0); handleLocationHash(); - cpick.on("input:end", () => {setColor(1);}); - cpick.on("color:change", () => {updatePSliders()}); + if (cpick) { + cpick.on("input:end", () => {setColor(1);}); + cpick.on("color:change", () => {updatePSliders()}); + } pmtLS = localStorage.getItem('wledPmt'); // Load initial data @@ -755,14 +764,20 @@ ${inforow("Environment",i.arch + " " + i.core + " (" + i.lwip + ")")} function populateSegments(s) { - var cn = ""; - let li = lastinfo; - segCount = 0; lowestUnused = 0; lSeg = 0; + try { + var cn = ""; + let li = lastinfo; + segCount = 0; lowestUnused = 0; lSeg = 0; - for (var inst of (s.seg||[])) { - segCount++; + let segs = s.seg; + if (!Array.isArray(segs)) segs = []; - let i = parseInt(inst.id); + for (var inst of segs) { + if (!inst) continue; + segCount++; + + let i = parseInt(inst.id); + if (isNaN(i)) continue; if (i == lowestUnused) lowestUnused = i+1; if (i > lSeg) lSeg = i; @@ -859,8 +874,8 @@ function populateSegments(s) `${isMSeg?'':'Offset'}`+ ``+ ``+ - ``+ - ``+ + ``+ + ``+ `${isMSeg?miXck+'
'+rvXck:''}`+ ``+ (isMSeg ? 'Start Y'+(cfg.comp.seglen?'Height':'Stop Y')+''+ @@ -902,6 +917,9 @@ function populateSegments(s) gId('segcont').innerHTML = cn; gId("segcont").classList.remove("hide"); + if (lowestUnused >= maxSeg) { + if (maxSeg == 0) maxSeg = 32; // fallback if maxSeg is 0 + } let noNewSegs = (lowestUnused >= maxSeg); resetUtil(noNewSegs); for (var i = 0; i <= lSeg; i++) { @@ -911,12 +929,12 @@ function populateSegments(s) gId(`segr${i}`).classList.add("hide"); } if (segCount < 2) { - gId(`segd${lSeg}`).classList.add("hide"); // hide delete if only one segment - if (parseInt(gId("seg0bri").value)==255) gId(`segp0`).classList.add("hide"); + if (gId(`segd${lSeg}`)) gId(`segd${lSeg}`).classList.add("hide"); // hide delete if only one segment + if (gId("seg0bri") && parseInt(gId("seg0bri").value)==255 && gId(`segp0`)) gId(`segp0`).classList.add("hide"); // hide segment controls if there is only one segment in simplified UI if (simplifiedUI) gId("segcont").classList.add("hide"); } - if (!isM && !noNewSegs && (cfg.comp.seglen?parseInt(gId(`seg${lSeg}s`).value):0)+parseInt(gId(`seg${lSeg}e`).value) 1) ? "block":"none"; // rsbtn parent if (Array.isArray(li.maps) && li.maps.length>1) { @@ -929,6 +947,10 @@ function populateSegments(s) gId("ledmap").classList.add('hide'); } tooltip("#Segments"); + } catch (e) { + console.error("Populate Segments Error", e); + showToast("Seg Error: " + e, true); + } } function populateEffects() @@ -1448,20 +1470,23 @@ function makeWS() { function readState(s,command=false) { - if (!s) return false; + try { + if (!s) return false; if (s.success) return true; // no data to process isOn = s.on; gId('sliderBri').value = s.bri; - nlA = s.nl.on; - nlDur = s.nl.dur; - nlTar = s.nl.tbri; - nlFade = s.nl.fade; - syncSend = s.udpn.send; + if (s.nl) { + nlA = s.nl.on; + nlDur = s.nl.dur; + nlTar = s.nl.tbri; + nlFade = s.nl.fade; + } + if (s.udpn) syncSend = s.udpn.send; if (s.pl<0) currentPreset = s.ps; else currentPreset = s.pl; - tr = s.transition; + tr = s.transition !== undefined ? s.transition : 7; gId('tt').value = tr/10; gId('bs').value = s.bs || 0; if (tr===0) gId('bsp').classList.add('hide') @@ -1471,7 +1496,10 @@ function readState(s,command=false) hasRGB = hasWhite = hasCCT = has2D = false; let i = {}; // determine light capabilities from selected segments - for (let seg of (s.seg||[])) { + let segs = s.seg; + if (!Array.isArray(segs)) segs = []; + for (let seg of segs) { + if (!seg) continue; let w = (seg.stop - seg.start); let h = seg.stopY ? (seg.stopY - seg.startY) : 1; let lc = seg.lc; @@ -1485,7 +1513,7 @@ function readState(s,command=false) } else if (isEmpty(i) && seg.id == s.mainseg) i = seg; // assign mainseg if no segments are selected } if (isEmpty(i)) { - showToast('No segments!', true); + showToast('No segments! Check LED Config.', true); updateUI(); return true; } else if (i.id == s.mainseg) { @@ -1558,6 +1586,10 @@ function readState(s,command=false) redrawPalPrev(); // if any color changed (random palette did at least) updateUI(); return true; + } catch (e) { + console.error("readState error:", e, s); + return false; + } } // control HTML elements for Slider and Color Control (original ported form WLED-SR) @@ -1870,7 +1902,7 @@ function makeSeg() if (isM) { ns = 0; } else { - if (xend < ledCount) ns = xend; + if (xend < ct) ns = xend; ct -= cfg.comp.seglen?ns:0; } } @@ -2272,8 +2304,8 @@ function setSeg(s) let eX = gId(`seg${s}e`); var start = parseInt(sX.value); var stop = parseInt(eX.value) + (cfg.comp.seglen?start:0); - if (startsX.max) {sX.value=sX.min; return;} // prevent out of bounds - if (stopeX.max) {eX.value=eX.max; return;} // prevent out of bounds + if (startsX.max) {sX.value=sX.min; return;} + if (stopeX.max) {eX.value=eX.max; return;} if ((cfg.comp.seglen && stop == 0) || (!cfg.comp.seglen && stop <= start)) {delSeg(s); return;} var obj = {"seg": {"id": s, "n": name, "start": start, "stop": stop}}; if (isM && start