From 696b4d02079a329ec20cb9f8fc7970a03ccaa941 Mon Sep 17 00:00:00 2001 From: ewowi Date: Sat, 10 Oct 2026 12:57:06 +0200 Subject: [PATCH 1/2] Let longer scripts compile, keep a script's settings across a boot MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A MoonLive script now has room for twice as many branches, so the StadBeest's Sauron eye blinks, and the eye orb blinks too. A script service keeps its saved settings across a restart, a desk's knob rings fill over the range of what each knob drives, and the StadBeest page opens with a welcome for visitors. KPI: 256lights | Desktop:2217KB | tick:7/8/7/2/7/7/264/7/7/10us(FPS:142857/125000/142857/500000/142857/142857/3787/142857/142857/100000) | src:306(77989) | test:230(52519) | functions-over:331 Commit: src +116/-91 lines | test +181/-89 lines | duplicated lines 3735 -> 3733 (-2) **Core** - MoonLiveService declares its controls at prepare, so the values a file holds for a script's own controls land after the compile instead of being dropped (the autopilot's scene length reset to 180 at every boot). - MoonLive assemblers: a label is a two-byte code position (`CodePos`, `kUnbound`), so 96 labels fit the stack 48 took; `bind` refuses a position past it. The host assembler's label and fixup methods have one definition, in its header. - ControlModule: `targetOf`, `splitTarget`, `targetRange` and `rangeOf` replace three copies of the Module.control parsing; a knob given another target resends its ring. - MidiService scales an encoder's ring to its target's range. **Light domain** - StadBeest Sauron blinks by closing its almond, the eye orb by closing its rows; the autopilot times each scene from its own start, so moving its scene length leaves the running scene alone, and uses stadbeest-fire in a third of the thrusters scenes. - ParallelLedDriver: the encode instrument's comment names what it measures. **Tests** - A saved value of a script's own control survives the boot; a shared Mackie desk turns a knob down as well as up through RTP-MIDI; a knob ring fills over its target's range, and follows a new target with the same value; the assembler tripwire counts device table bytes; the framerate sweep sets its clock before setup. **Docs/CI** - The StadBeest page: a welcome for visitors with a message button, its own title, fader 8 as the autopilot's scene length, the QCon photo; the MIDI details describe the ring range; backlog-core records what remains of the branch tables. **Reviews** - 👾 A ring kept its old scale when a knob got a new target with the same value → rings resent on a target change, pinned. - 👾 Sauron's almond popped half a light wider at a blink's edges → exact at both ends. - 👾 Eye-orb lids checked every row every frame → a loop over the closed rows only. - 👾 Stale "-1 = unbound" comment → kUnbound. - 👾 driveSurface looked its target up twice → one `rangeOf`, one lookup. - 👾 The hub-support hint left the page, and the menu keeps its title → both as decided. Co-Authored-By: Claude Opus 5.5 --- .../assets/how-to/multi-board/qConControl.jpg | Bin 0 -> 193852 bytes docs/how-to/multi-board-installation.md | 38 +++++-- docs/moonmodules/core/services.md | 2 +- docs/reference/metrics/code.md | 14 +-- docs/reference/metrics/prose.md | 4 +- docs/reference/metrics/repo-health.json | 76 ++++++------- docs/reference/metrics/repo-health.md | 90 +++++++-------- docs/work/future/backlog-core.md | 11 +- moonlive/effects/stadbeest-eye-orb.mle | 28 ++++- moonlive/effects/stadbeest-sauron.mle | 6 +- moonlive/services/stadbeest-autopilot.mls | 11 +- src/core/moonlive/MoonLiveIr.h | 7 +- src/core/services/MidiService.h | 10 ++ src/core/services/MoonLiveService.h | 3 + src/core/system/ControlModule.h | 106 +++++++++++------- src/light/drivers/ParallelLedDriver.h | 4 +- src/platform/desktop/moonlive_asm_arm64.cpp | 16 +-- src/platform/desktop/moonlive_asm_host.h | 20 +++- src/platform/desktop/moonlive_asm_x86_64.cpp | 15 +-- src/platform/esp32/moonlive_asm_riscv.cpp | 10 +- src/platform/esp32/moonlive_asm_riscv.h | 2 +- src/platform/esp32/moonlive_asm_xtensa.cpp | 12 +- src/platform/esp32/moonlive_asm_xtensa.h | 2 +- ...lette_preset_changes_only_the_palette.json | 6 +- ...ment_adds_an_effect_with_its_controls.json | 8 +- ...cenario_Drivers_output_and_brightness.json | 4 +- ...o_Effects_pipeline_builds_and_renders.json | 16 +-- .../scenario_Effects_swap_while_running.json | 8 +- ...cts_teardown_under_a_running_pipeline.json | 28 ++--- .../scenario_Layers_stack_and_blend_live.json | 36 +++--- ...nario_Layouts_resize_reallocates_live.json | 12 +- ...cenario_Modifiers_reshape_the_mapping.json | 28 ++--- ..._Palettes_a_script_drives_the_effects.json | 8 +- test/unit/core/moonlive_device_codegen.inc | 26 +++-- test/unit/core/unit_ControlModule.cpp | 70 ++++++++++++ test/unit/core/unit_MoonLiveService.cpp | 18 +++ test/unit/light/unit_Effects_framerate.cpp | 2 + 37 files changed, 456 insertions(+), 301 deletions(-) create mode 100644 docs/assets/how-to/multi-board/qConControl.jpg diff --git a/docs/assets/how-to/multi-board/qConControl.jpg b/docs/assets/how-to/multi-board/qConControl.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7dcc46b34f5bb9730fc4e478ed6d09b0916521f0 GIT binary patch literal 193852 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

&G>tAomqULxsucGHd2>3i3TVT4-o!dIqWD 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 Saw the StadBeest at the Museumnacht? [Leave a message](https://tally.so/r/68X5xO), or join us on [Discord](https://discord.gg/TC8NSUSCdV) or [Reddit](https://reddit.com/r/moonmodules). +**Meet the StadBeest**, a creature made of what the city throws away. +Its body is a chandelier on ten legs of light, its eyes sit in 3D-printed light bulbs, and its mouth is an ordinary WiFi lamp. +It listens to the music around it, takes a step and looks around on every beat, and picks its own colors and moods through the night. +A handful of small computers run it together on MoonLight, free lighting software made by volunteers. + + + +**What did you think of it?** A few words are enough, and we read every one. + +[:material-message-text: Leave us a message](https://tally.so/r/68X5xO){ .md-button .md-button--primary }   [:fontawesome-brands-discord: Discord](https://discord.gg/TC8NSUSCdV){ .md-button }   [:fontawesome-brands-reddit: Reddit](https://reddit.com/r/moonmodules){ .md-button } + +**Curious how it is made, or want to build your own?** Read on for the whole recipe, from the hardware to the code. + +--- An installation is several MoonLight devices that act as one piece: one creature, one sculpture, one room. -The worked example is the StadBeest, a walking beast whose legs, eyes and mouth run on four devices. +The worked example is the StadBeest, whose legs, eyes and mouth run on devices of their own. Each section names a choice that makes it work; borrow what fits your own piece. > **Start simple.** The StadBeest shows most of what MoonLight can do in one piece, so it can look overwhelmingly complex. @@ -15,8 +28,6 @@ Each section names a choice that makes it work; borrow what fits your own piece. > > Start with the first, see it run, and add the next step only when you miss it. The autopilot, the desk, the looks and the mouth came last, one at a time. - - > New here? Start with **[Install & first light](../gettingstarted.md)** and **[your first script](../tutorials/first-script.md)**. What follows assumes devices that run MoonLight on one network. --- @@ -170,14 +181,15 @@ A slot assigned by hand keeps its target, which is how the look switches and the | `fader1` | `Drivers.brightness` | `Drivers.brightness` | `Drivers.brightness` | | `fader2` | `bpm` | `bpm` | `bpm` | | `fader3` | `sensitivity` | `sensitivity` | `sensitivity` | -| `fader4` and on | the look's next numbers | the look's next numbers | `rest` | +| `fader4` to `fader7` | the look's next numbers | the look's next numbers | `rest` | +| `fader8` | autopilot `seconds` | | | | `encoder1` | `Drivers.palette` | `Drivers.palette` | `Drivers.palette` | | `encoder2` and on | the look's choices, such as the orb's `shape` | the same | | A slot holds the value of the control it drives, so `fader2` at 33 means `bpm` 33. Each look is an effect of its own on every device, named after its script without the `stadbeest-` prefix, and `switch3` to `switch5` turn them on and off through their `enabled`. So one switch changes the look on the legs and on both eyes at once, and the desk follows it. -Assign a slot by hand from the card, or with `POST /api/control` and `{"module":"Control","control":"switch3Target","value":"walk.enabled"}`. +Assign a slot by hand from the Control card. --- @@ -246,9 +258,9 @@ A [MoonLiveService](../moonmodules/core/services.md#moonliveservice) on the lead - **Scenes:** every `seconds`, three minutes by default, it picks a new scene. A scene moves on to the next look, walking, the orb or the thrusters, by switching `switch3` to `switch5`. - It picks a built-in palette, or for the thrusters [`stadbeest-fire.mlp`](https://github.com/MoonModules/MoonLight/blob/main/moonlive/palettes/stadbeest-fire.mlp), a mood from calm to wild, how much the music counts and `pulse` on or off. + It picks a built-in palette, in a third of the thrusters scenes [`stadbeest-fire.mlp`](https://github.com/MoonModules/MoonLight/blob/main/moonlive/palettes/stadbeest-fire.mlp), a mood from calm to wild, how much the music counts and `pulse` on or off. That palette is computed every frame: louder music burns hotter, a beat flares the hot end white, and the flames flicker. - A palette has the same number on every device, since every factory palette keeps its place in the list whether the device holds it or not: `stadbeest-fire` is 64. + A palette has the same number on every device, so the eyes and the mouth pick the same one. - **Breathing:** within a scene the energy rises and falls once a minute, through `fader2`, the tempo of whatever look runs. - **Through the surface:** it writes the shared slots with `setControl("fader2", value)`, exactly as a person moves a fader. The legs follow on the leader, and the eyes and the mouth over OSC. @@ -277,7 +289,8 @@ The browser is the bridge between desk and device, so the laptop keeps the leade | APC40 | the StadBeest | |---|---| -| track faders 1-8 | brightness, then the look's `bpm`, `sensitivity` and its own numbers | +| track faders 1-7 | brightness, then the look's `bpm`, `sensitivity` and its own numbers | +| track fader 8 | the autopilot's `seconds`, how long a scene lasts | | track knobs 1-8 | the palette, then the look's choices and the numbers past the faders | | activator 1 | on and off | | activator 2 | `pulse`, legs and eyes together | @@ -304,7 +317,10 @@ The bridge is a cable over RTP-MIDI, the standard for MIDI on a network, and kee So the desk works on the leader as if plugged into it. The leader greets it, moves its motors, lights its pads with its presets and holds a motor still under a hand. A Mackie desk's display shows the leader's display line: the last change for five seconds, then the device's name. -An APC40 mkII takes its power from USB, which this board's port does not supply, so it stays on the laptop or goes through an active, powered USB hub. A hub needs the firmware's hub support, `CONFIG_USB_HOST_HUBS_SUPPORTED`, switched on in the S3 images. + +The iCON QCon through the bridge: its display reads MoonLight, its motorized faders stand at the leader's levels, and two pads glow red + +An APC40 mkII takes its power from USB, which this board's port does not supply, so it stays on the laptop or goes through an active, powered USB hub. --- diff --git a/docs/moonmodules/core/services.md b/docs/moonmodules/core/services.md index b9ab84034..51b72dc8b 100644 --- a/docs/moonmodules/core/services.md +++ b/docs/moonmodules/core/services.md @@ -188,7 +188,7 @@ A device's own page, such as `http://192.168.1.158`, is not a secure origin, so 2. Enter the device's address, such as `http://192.168.1.158`, set the flag to Enabled, and click Relaunch. 3. Reload the device's page: Chrome now asks to use MIDI devices. -The decoding follows Mackie Control: a fader is 14-bit pitch bend on its own channel, its touch sensor a note from 0x68, a knob a relative turn on a control change from 0x10, and SELECT a note from 0x18. The master fader has no slot on the surface and is ignored. The way back uses the same messages: pitch bend moves a motor, a SELECT note at full velocity lights its button, and a control change from 0x30 fills a knob's ring. The device keeps what the desk should show and pushes it up to 25 times a second; the browser sends only what changed, so a page opened later moves the motors to where the surface already is. +The decoding follows Mackie Control: a fader is 14-bit pitch bend on its own channel, its touch sensor a note from 0x68, a knob a relative turn on a control change from 0x10, and SELECT a note from 0x18. The master fader has no slot on the surface and is ignored. The way back uses the same messages: pitch bend moves a motor, a SELECT note at full velocity lights its button, and a control change from 0x30 fills a knob's ring over the range of what the knob drives, so it is full at that control's top. The device keeps what the desk should show and pushes it up to 25 times a second; the browser sends only what changed, so a page opened later moves the motors to where the surface already is. **The Akai APC40 mkII profile.** The browser greets the desk with the SysEx that puts it in Alternate Ableton Live mode, where every light is the host's. Chrome asks once to allow SysEx for it. Track faders 1-8 move the surface's faders and track knobs 1-8 set its encoders, each reading 0 to 127. Activator buttons 1-8 flip its switches. The 40 clip pads apply presets 1-40, the top-left pad being preset 1 as on the Control card. The way back lights each activator while its switch is on and fills each knob's ring like a meter. Each pad is dark when empty, dim white when a preset is stored, and green for the one applied. The faders have no motors. Every message is in [the APC40 reference](../../reference/hardware/control-surfaces.md#akai-apc40-mkii). diff --git a/docs/reference/metrics/code.md b/docs/reference/metrics/code.md index afc4e45e3..e4c89ea89 100644 --- a/docs/reference/metrics/code.md +++ b/docs/reference/metrics/code.md @@ -4,7 +4,7 @@ Generated by [`moondeck/check/check_code.py`](../../../moondeck/check/check_code Every function, block and file over a limit the [coding standards](../../contributing/coding-standards.md#static-checks) set. Current state only: the trend is this file's git history. The list only shrinks, per rule and in total, and a touched file clears its own rows. -**1620 finding(s)** across 318 file(s). 2.88% of all lines are duplicated, 3735 lines. +**1620 finding(s)** across 318 file(s). 2.88% of all lines are duplicated, 3733 lines. ## By rule @@ -103,7 +103,7 @@ The next function worth simplifying is at the top of each file's list. | `test/unit/light/unit_Effects_container.cpp` | 10 | `lines 188-199, also in test/unit/light/unit_Effects_container.cpp:139`, duplicated block 12 | | `src/core/services/InfraredService.h` | 9 | `lines 113-135, also in src/core/services/GamepadService.h:108`, duplicated block 23 | | `src/core/services/OscModule.h` | 9 | `OscModule::handle`, deeply nested 5 | -| `src/core/system/ControlModule.h` | 9 | `ControlModule::driveSwitch`, complex function 15 | +| `src/core/system/ControlModule.h` | 9 | `ControlModule::moveListRow`, complex function 15 | | `src/light/drivers/PanelCardDriver.h` | 9 | `lines 187-195, also in src/light/drivers/NetworkSendDriver.h:210`, duplicated block 9 | | `test/unit/light/unit_ParallelLedDriver_swap.cpp` | 9 | `lines 176-184, also in test/unit/light/unit_ParallelLedDriver_swap.cpp:112`, duplicated block 9 | | `src/core/system/WiFiModule.h` | 8 | `lines 352-359, also in src/light/drivers/FixtureProfilesModule.h:245`, duplicated block 8 | @@ -132,6 +132,7 @@ The next function worth simplifying is at the top of each file's list. | `src/light/drivers/FixtureProfilesModule.h` | 6 | `lines 245-252, also in src/core/system/WiFiModule.h:352`, duplicated block 8 | | `src/light/drivers/NetworkSendDriver.h` | 6 | `NetworkSendDriver::tick, line 190`, large stack frame 1760 | | `src/light/layers/BlendMap.h` | 6 | `blendMap`, complex function 35 | +| `src/platform/desktop/moonlive_asm_x86_64.cpp` | 6 | `lines 557-564, also in src/platform/desktop/moonlive_asm_x86_64.cpp:515`, duplicated block 8 | | `src/platform/esp32/platform_esp32_fs.cpp` | 6 | `lines 211-221, also in src/platform/esp32/platform_esp32_fs.cpp:161`, duplicated block 11 | | `src/platform/esp32/platform_esp32_improv.cpp` | 6 | `platform::improvTask`, complex function 22 | | `test/unit/core/unit_AccessPointModule.cpp` | 6 | `lines 340-348, also in test/unit/core/unit_AccessPointModule.cpp:311`, duplicated block 9 | @@ -155,8 +156,6 @@ The next function worth simplifying is at the top of each file's list. | `src/light/layouts/CarLightsLayout.h` | 5 | `lines 49-65, also in src/light/layouts/TorontoBarGourdsLayout.h:52`, duplicated block 17 | | `src/light/layouts/RingLayout.h` | 5 | `lines 85-100, also in src/light/layouts/CarLightsLayout.h:95`, duplicated block 16 | | `src/light/layouts/TorontoBarGourdsLayout.h` | 5 | `lines 52-68, also in src/light/layouts/CarLightsLayout.h:49`, duplicated block 17 | -| `src/platform/desktop/moonlive_asm_x86_64.cpp` | 5 | `lines 570-577, also in src/platform/desktop/moonlive_asm_x86_64.cpp:528`, duplicated block 8 | -| `src/platform/esp32/moonlive_asm_riscv.cpp` | 5 | `lines 40-47, also in src/platform/desktop/moonlive_asm_arm64.cpp:34`, duplicated block 8 | | `src/platform/esp32/platform_esp32_h264.cpp` | 5 | `platform::hlsSegment`, complex function 26 | | `test/unit/light/unit_Drivers_rendersplit.cpp` | 5 | `(static local variable) in tick`, blocking call on the render path 1 | | `test/unit/light/unit_FireEffect.cpp` | 5 | `lines 29-42, also in test/unit/light/unit_RainbowEffect.cpp:69`, duplicated block 14 | @@ -184,6 +183,7 @@ The next function worth simplifying is at the top of each file's list. | `src/light/util/RtspSession.h` | 4 | `rtsp::parseTransport`, complex function 28 | | `src/main.cpp` | 4 | `mm_main`, complex function 27 | | `src/platform/desktop/main_desktop.cpp` | 4 | `main`, deeply nested 5 | +| `src/platform/esp32/moonlive_asm_riscv.cpp` | 4 | `lines 297-303, also in src/platform/esp32/moonlive_asm_xtensa.cpp:481`, duplicated block 7 | | `test/js/ui-mooncloud.test.mjs` | 4 | `lines 6-17, also in test/js/installer-s31-webflash.test.mjs:11`, duplicated block 12 | | `test/unit/light/unit_BlurzEffect.cpp` | 4 | `lines 137-155, also in test/unit/light/unit_GEQEffect.cpp:159`, duplicated block 19 | | `test/unit/light/unit_BouncingBallsEffect.cpp` | 4 | `lines 75-88, also in test/unit/light/unit_RubiksCubeEffect.cpp:103`, duplicated block 14 | @@ -208,7 +208,7 @@ The next function worth simplifying is at the top of each file's list. | `src/light/effects/PongEffect.h` | 3 | `PongEffect::render`, complex function 15 | | `src/light/effects/SolidEffect.h` | 3 | `SolidEffect::static_cast`, complex function 36 | | `src/light/layouts/GridLayout.h` | 3 | `GridLayout in 86 files`, name spread 86 | -| `src/platform/desktop/moonlive_asm_arm64.cpp` | 3 | `lines 34-41, also in src/platform/esp32/moonlive_asm_riscv.cpp:40`, duplicated block 8 | +| `src/platform/desktop/moonlive_asm_arm64.cpp` | 3 | `lines 35-40, also in src/platform/esp32/moonlive_asm_riscv.cpp:34`, duplicated block 6 | | `test/unit/core/unit_NetworkModule_ethernet.cpp` | 3 | `lines 276-285, also in test/unit/core/unit_NetworkModule_ethernet.cpp:193`, duplicated block 10 | | `test/unit/light/unit_AuroraEffect.cpp` | 3 | `lines 40-48, also in test/unit/light/unit_PolarLut_equivalence.cpp:40`, duplicated block 9 | | `test/unit/light/unit_MoonLiveLayout.cpp` | 3 | `lines 685-935, also in test/unit/light/unit_MoonLiveLayout.cpp:403`, duplicated block 251 | @@ -346,7 +346,7 @@ The next function worth simplifying is at the top of each file's list. | `src/platform/esp32/platform_config.h` | 1 | `lines 236-250, also in src/platform/desktop/platform_config.h:71`, duplicated block 15 | | `src/platform/esp32/platform_esp32_i2s.cpp` | 1 | `platform::audioMicInit`, complex function 11 | | `src/platform/esp32/platform_esp32_tasks.cpp` | 1 | `platform::taskSnapshot`, complex function 12 | -| `src/platform/platform.h` | 1 | `platform.h`, large file 1302 | +| `src/platform/platform.h` | 1 | `platform.h`, large file 1301 | | `src/ui/install-picker.js` | 1 | `install-picker.js`, large file 1048 | | `src/ui/preview3d.js` | 1 | `preview3d.js`, large file 1431 | | `test/js/installer-eth-only.test.mjs` | 1 | `lines 13-23, also in test/js/ui-mooncloud.test.mjs:6`, duplicated block 11 | @@ -360,7 +360,7 @@ The next function worth simplifying is at the top of each file's list. | `test/js/ui-visibility.test.mjs` | 1 | `lines 7-16, also in test/js/ui-ws-scheme.test.mjs:13`, duplicated block 10 | | `test/python/test_check_docgen.py` | 1 | `test_check_docgen.py`, large file 1596 | | `test/scenario_runner.cpp` | 1 | `scenario_runner.cpp`, large file 1075 | -| `test/unit/core/unit_ControlModule.cpp` | 1 | `unit_ControlModule.cpp`, large file 2082 | +| `test/unit/core/unit_ControlModule.cpp` | 1 | `unit_ControlModule.cpp`, large file 2152 | | `test/unit/core/unit_Control_apply_absent_key.cpp` | 1 | `lines 92-103, also in test/unit/core/unit_HttpServerModule_apply.cpp:40`, duplicated block 12 | | `test/unit/core/unit_moonlive_compiler.cpp` | 1 | `unit_moonlive_compiler.cpp`, large file 1865 | | `test/unit/core/unit_moonlive_fill.cpp` | 1 | `unit_moonlive_fill.cpp`, large file 1380 | diff --git a/docs/reference/metrics/prose.md b/docs/reference/metrics/prose.md index 0b49f3278..2f2798e20 100644 --- a/docs/reference/metrics/prose.md +++ b/docs/reference/metrics/prose.md @@ -9,11 +9,11 @@ This number is the debt behind that gate, and it RATCHETS: a rise fails the chec docgen.md does. A comment is prose wherever it lives, so a `//` in the web interface and a `#` in a script are counted beside a `///` in a header. -**2950 finding(s)** across 370 file(s). +**2946 finding(s)** across 370 file(s). | rule | findings | |---|---| -| `MoonLight.EmDash` | 1532 | +| `MoonLight.EmDash` | 1528 | | `MoonLight.Weasel` | 688 | | `MoonLight.SentenceLength` | 430 | | `MoonLight.Temporal` | 215 | diff --git a/docs/reference/metrics/repo-health.json b/docs/reference/metrics/repo-health.json index ef90700d7..7401f233e 100644 --- a/docs/reference/metrics/repo-health.json +++ b/docs/reference/metrics/repo-health.json @@ -1,38 +1,38 @@ { - "commit": "4c61c409", + "commit": "48ab0058", "flash": { - "esp32s3-n16r8": 2335504, + "esp32s3-n16r8": 2336304, "esp32": 2226256, "esp32p4rev1-eth": 2177776, "esp32p4rev1-eth-wifi": 2358896, - "esp32s3-n8r8": 2335504, - "esp32s31": 2594384, + "esp32s3-n8r8": 2336304, + "esp32s31": 2595200, "esp32-16mb": 2060368, "esp32-eth": 1681040, "esp32-wrover": 1843760, "qemu": 1383648, "esp32p4rev3-eth": 2203712, - "esp32s3-zero": 2218288, + "esp32s3-zero": 2219120, "esp32-pico": 2107168, - "desktop-macos": 2270488, + "desktop-macos": 2270440, "desktop-windows": 1925120, - "esp32c3": 2334528 + "esp32c3": 2335072 }, "measured": { "esp32p4rev1-eth": "2026-10-07", - "esp32s31": "2026-10-09", + "esp32s31": "2026-10-10", "esp32": "2026-10-09", "esp32-pico": "2026-09-09", - "esp32s3-n16r8": "2026-10-09", - "esp32s3-n8r8": "2026-10-09", - "esp32s3-zero": "2026-10-09", + "esp32s3-n16r8": "2026-10-10", + "esp32s3-n8r8": "2026-10-10", + "esp32s3-zero": "2026-10-10", "esp32-16mb": "2026-09-09", "esp32p4rev1-eth-wifi": "2026-09-30", "esp32-eth": "2026-09-11", "esp32p4rev3-eth": "2026-10-08", - "desktop-macos": "2026-10-09", + "desktop-macos": "2026-10-10", "desktop-windows": "2026-09-30", - "esp32c3": "2026-10-09" + "esp32c3": "2026-10-10" }, "perf": { "esp32": { @@ -44,8 +44,8 @@ "desktop-macos": { "p50": 7, "p95": 324, - "n": 29, - "last": "2026-10-09" + "n": 30, + "last": "2026-10-10" }, "esp32s3-n16r8": { "p50": 2073, @@ -108,10 +108,10 @@ }, "State_one_document_adds_an_effect_with_its_controls": { "desktop-macos": { - "p50": 2, + "p50": 4, "p95": 387, - "n": 28, - "last": "2026-10-09" + "n": 29, + "last": "2026-10-10" }, "esp32s3-n16r8": { "p50": 2505, @@ -487,7 +487,7 @@ "p50": 7, "p95": 15, "n": 32, - "last": "2026-10-09" + "last": "2026-10-10" }, "desktop-windows": { "p50": 4, @@ -513,7 +513,7 @@ "p50": 7, "p95": 10, "n": 32, - "last": "2026-10-09" + "last": "2026-10-10" }, "desktop-windows": { "p50": 4, @@ -527,7 +527,7 @@ "p50": 1, "p95": 2, "n": 32, - "last": "2026-10-09" + "last": "2026-10-10" }, "desktop-windows": { "p50": 4, @@ -553,7 +553,7 @@ "p50": 7, "p95": 18, "n": 32, - "last": "2026-10-09" + "last": "2026-10-10" }, "esp32s3-n16r8": { "p50": 9080, @@ -579,7 +579,7 @@ "p50": 267, "p95": 355, "n": 32, - "last": "2026-10-09" + "last": "2026-10-10" } }, "Layouts_resize_reallocates_live": { @@ -587,7 +587,7 @@ "p50": 10, "p95": 19, "n": 32, - "last": "2026-10-09" + "last": "2026-10-10" }, "desktop-windows": { "p50": 93, @@ -613,7 +613,7 @@ "p50": 7, "p95": 11, "n": 32, - "last": "2026-10-09" + "last": "2026-10-10" }, "esp32s3-n16r8": { "p50": 10350, @@ -639,7 +639,7 @@ "p50": 7, "p95": 74, "n": 32, - "last": "2026-10-09" + "last": "2026-10-10" } } }, @@ -651,13 +651,13 @@ "p50": 7, "p95": 10, "n": 32, - "last": "2026-10-09" + "last": "2026-10-10" }, "Layouts_resize_reallocates_live": { "p50": 10, "p95": 19, "n": 32, - "last": "2026-10-09" + "last": "2026-10-10" } } }, @@ -681,16 +681,16 @@ } }, "loc": { - "core": 28229, + "core": 28271, "light": 31027, - "platform": 17948, + "platform": 17930, "ui": 12307, - "test": 64507, + "test": 64597, "moondeck": 30600 }, "comments": { "core": { - "lines": 6157, + "lines": 6165, "ratio": 0.242 }, "light": { @@ -698,7 +698,7 @@ "ratio": 0.269 }, "platform": { - "lines": 3660, + "lines": 3659, "ratio": 0.228 }, "ui": { @@ -706,7 +706,7 @@ "ratio": 0.298 }, "test": { - "lines": 6963, + "lines": 6968, "ratio": 0.125 }, "moondeck": { @@ -715,19 +715,19 @@ } }, "tests": { - "cases": 2394, + "cases": 2398, "scenarios": 30 }, "docs": { "md_files": 150, - "md_lines": 32267, + "md_lines": 32271, "plans_files": 44, - "backlog_lines": 3318, + "backlog_lines": 3319, "lessons_lines": 532, "claude_md_lines": 283 }, "complexity": { - "functions": 4385, + "functions": 4389, "over_threshold": 331, "worst_ccn": 128 } diff --git a/docs/reference/metrics/repo-health.md b/docs/reference/metrics/repo-health.md index 2928e52ce..d488dc2e4 100644 --- a/docs/reference/metrics/repo-health.md +++ b/docs/reference/metrics/repo-health.md @@ -1,6 +1,6 @@ # Repo health -Measured at `4c61c409`. Generated by [`moondeck/check/repo_health.py`](../../../moondeck/check/repo_health.py) on every KPI-gate run. **Do not edit by hand.** +Measured at `48ab0058`. Generated by [`moondeck/check/repo_health.py`](../../../moondeck/check/repo_health.py) on every KPI-gate run. **Do not edit by hand.** Current state only; the trend is this file's git history (`git log -p docs/reference/metrics/repo-health.md`). Nothing here fails a build: the numbers make growth visible, the judgment stays human. @@ -8,23 +8,23 @@ Current state only; the trend is this file's git history (`git log -p docs/refer | Metric | v6.0.0 | Now | Change | |---|---:|---:|---:| -| flash desktop-macos | 1,963 KB | 2,217 KB | +254.2 KB (+13.0%) | +| flash desktop-macos | 1,963 KB | 2,217 KB | +254.2 KB (+12.9%) | | flash esp32 | 2,061 KB | 2,174 KB | +112.9 KB (+5.5%) | | flash esp32p4rev1-eth | 2,022 KB | 2,127 KB | +105.0 KB (+5.2%) | | flash esp32p4rev3-eth | 2,025 KB | 2,152 KB | +126.8 KB (+6.3%) | -| flash esp32s3-n16r8 | 2,111 KB | 2,281 KB | +169.3 KB (+8.0%) | -| flash esp32s3-n8r8 | 2,038 KB | 2,281 KB | +242.5 KB (+11.9%) | -| flash esp32s3-zero | 1,977 KB | 2,166 KB | +189.5 KB (+9.6%) | -| flash esp32s31 | 2,395 KB | 2,534 KB | +138.2 KB (+5.8%) | +| flash esp32s3-n16r8 | 2,111 KB | 2,282 KB | +170.1 KB (+8.1%) | +| flash esp32s3-n8r8 | 2,038 KB | 2,282 KB | +243.3 KB (+11.9%) | +| flash esp32s3-zero | 1,977 KB | 2,167 KB | +190.4 KB (+9.6%) | +| flash esp32s31 | 2,395 KB | 2,534 KB | +139.0 KB (+5.8%) | | tick Effects_pipeline_builds_and_renders (desktop-macos) | 7 µs | 7 µs | +0 (+0.0%) | | tick Layouts_resize_reallocates_live (desktop-macos) | 12 µs | 10 µs | -2 (-16.7%) | -| lines core | 22,299 | 28,229 | +5,930 (+26.6%) | +| lines core | 22,299 | 28,271 | +5,972 (+26.8%) | | lines light | 31,054 | 31,027 | -27 (-0.1%) | -| lines platform | 16,798 | 17,948 | +1,150 (+6.8%) | +| lines platform | 16,798 | 17,930 | +1,132 (+6.7%) | | lines ui | 11,394 | 12,307 | +913 (+8.0%) | -| lines test | 57,759 | 64,507 | +6,748 (+11.7%) | +| lines test | 57,759 | 64,597 | +6,838 (+11.8%) | | lines moondeck | 29,325 | 30,600 | +1,275 (+4.3%) | -| unit tests | 2,120 | 2,394 | +274 (+12.9%) | +| unit tests | 2,120 | 2,398 | +278 (+13.1%) | | scenarios | 21 | 30 | +9 (+42.9%) | Against the release `v6.0.0`, the fixed point a user compares with; the tables below compare against the last commit. A firmware not rebuilt since `v6.0.0` is left out, and a measure the release did not record yet, such as the code report, joins from the next one. @@ -33,21 +33,21 @@ Against the release `v6.0.0`, the fixed point a user compares with; the tables b | Target | Flash | Capacity | Used | Built | |---|---:|---:|---:|:--:| -| desktop-macos | 2,217 KB (+16 B) ⚠ | - | - | yes | -| desktop-windows | 1,880 KB | - | - | **STALE 9d** | -| esp32 | 2,174 KB | 2,496 KB | 87% | carried 0d | -| esp32-16mb | 2,012 KB | 4,096 KB | 49% | **STALE 30d** | -| esp32-eth | 1,642 KB | 2,496 KB | 66% | **STALE 28d** | -| esp32-pico | 2,058 KB | 3,072 KB | 67% | **STALE 30d** | +| desktop-macos | 2,217 KB (−48 B) ✓ | - | - | yes | +| desktop-windows | 1,880 KB | - | - | **STALE 10d** | +| esp32 | 2,174 KB | 2,496 KB | 87% | carried 1d | +| esp32-16mb | 2,012 KB | 4,096 KB | 49% | **STALE 31d** | +| esp32-eth | 1,642 KB | 2,496 KB | 66% | **STALE 29d** | +| esp32-pico | 2,058 KB | 3,072 KB | 67% | **STALE 31d** | | esp32-wrover | 1,801 KB | 2,496 KB | 72% | carried (age?) | -| esp32c3 | 2,280 KB (+224 B) ⚠ | 2,496 KB | 91% | yes | -| esp32p4rev1-eth | 2,127 KB | 4,096 KB | 52% | carried 2d | -| esp32p4rev1-eth-wifi | 2,304 KB | 4,096 KB | 56% | **STALE 9d** | -| esp32p4rev3-eth | 2,152 KB | 4,096 KB | 53% | carried 1d | -| esp32s3-n16r8 | 2,281 KB | 4,096 KB | 56% | yes | -| esp32s3-n8r8 | 2,281 KB | 3,072 KB | 74% | yes | -| esp32s3-zero | 2,166 KB | 2,496 KB | 87% | yes | -| esp32s31 | 2,534 KB | 4,096 KB | 62% | yes | +| esp32c3 | 2,280 KB (+544 B) ⚠ | 2,496 KB | 91% | yes | +| esp32p4rev1-eth | 2,127 KB | 4,096 KB | 52% | carried 3d | +| esp32p4rev1-eth-wifi | 2,304 KB | 4,096 KB | 56% | **STALE 10d** | +| esp32p4rev3-eth | 2,152 KB | 4,096 KB | 53% | carried 2d | +| esp32s3-n16r8 | 2,282 KB (+800 B) ⚠ | 4,096 KB | 56% | yes | +| esp32s3-n8r8 | 2,282 KB (+800 B) ⚠ | 3,072 KB | 74% | yes | +| esp32s3-zero | 2,167 KB (+832 B) ⚠ | 2,496 KB | 87% | yes | +| esp32s31 | 2,534 KB (+816 B) ⚠ | 4,096 KB | 62% | yes | | qemu | 1,351 KB | - | - | carried (age?) | `Built: yes` was measured this run. `carried (age?)` was not rebuilt either and predates this record, so its age is unknown: it dates itself on the next build. `carried Nd` was NOT rebuilt and its number is N days old, so an absent delta says nothing about the change. **STALE** marks a carry older than 7 days: the number has gone unchecked long enough that growth will surface later as one jump, blamed on whichever commit happens to rebuild that target. `Used` is against the app slot in the firmware's own partition table. @@ -56,19 +56,19 @@ Against the release `v6.0.0`, the fixed point a user compares with; the tables b | Target | Net | New | Removed | Grown | Shrunk | Other | Since | |---|---:|---:|---:|---:|---:|---:|---| -| esp32c3 | +0.2 KB | +0.1 KB | -0.2 KB | +0.3 KB | -0.1 KB | +0.1 KB | `4c61c409` | -| esp32s3-n16r8 | +0.0 KB | +0.0 KB | +0.0 KB | +0.0 KB | +0.0 KB | +0.0 KB | `4c61c409` | -| esp32s3-n8r8 | +0.0 KB | +0.0 KB | +0.0 KB | +0.0 KB | +0.0 KB | +0.0 KB | `4c61c409` | -| esp32s3-zero | +0.0 KB | +0.0 KB | +0.0 KB | +0.0 KB | +0.0 KB | +0.0 KB | `4c61c409` | -| esp32s31 | +0.0 KB | +0.0 KB | +0.0 KB | +0.0 KB | +0.0 KB | +0.0 KB | `4c61c409` | +| esp32c3 | +0.5 KB | +1.0 KB | +0.0 KB | +0.6 KB | -0.5 KB | -0.5 KB | `48ab0058` | +| esp32s3-n16r8 | +0.8 KB | +0.1 KB | -0.1 KB | +0.9 KB | -0.2 KB | +0.1 KB | `48ab0058` | +| esp32s3-n8r8 | +0.8 KB | +0.1 KB | -0.1 KB | +0.9 KB | -0.2 KB | +0.1 KB | `48ab0058` | +| esp32s3-zero | +0.8 KB | +0.1 KB | -0.1 KB | +0.9 KB | -0.1 KB | +0.1 KB | `48ab0058` | +| esp32s31 | +0.8 KB | +1.1 KB | -0.2 KB | +0.8 KB | -0.5 KB | -0.4 KB | `48ab0058` | Largest moves: -- **esp32c3**: `mm::platform::pwmStart(unsigned long, unsigned char&)` -198 B, `mm::platform::pwmStart(unsigned char)` +126 B, `mm::DistortionWavesEffect::defineControls()` -64 B, `mm::PwmLightDriver::tick()` +56 B, `mm::FixedPointEffect::tick()` +48 B -- **esp32s3-n16r8**: none -- **esp32s3-n8r8**: none -- **esp32s3-zero**: none -- **esp32s31**: none +- **esp32c3**: `mm::moonlive::lowerWith(mm::mo` +504 B, `mm::moonlive::lowerWith(mm::mo` +504 B, `unsigned int mm::moonlive::lowerWith(mm::mo` +504 B, `mm::moonlive::lowerWith(mm::mo` +504 B, `unsigned int mm::moonlive::lowerWith blinkAt + 300) { blinkAt = t + 1000 + random16(2000) * 3; } + int closing = 150 - polarR(t - blinkAt - 150, 0); + closing = div(closing + polarR(closing, 0), 2); + return div(closing * div(height, 2), 150); + } + void tick() { fill(0, 0, 0); // The same shape as the legs' orb, from the same controls: disc, ball or egg, its height along the axis as a share of its width. @@ -54,14 +62,14 @@ class StadBeestEyeOrbEffect { // It rises and falls through the legs' whole height, squared so the low end stays slow to set. rise = mod(rise + (t - lastT) * speed * speed, 65536 * 1280); lastT = t; - h = div((span - 1) * sin(div(rise, 1280)), 65535); + h = div(143 * sin(div(rise, 1280)), 65535); int cx = div(width, 2); for (int y = 0; y < height; y = y + 1) { - // Each light of the disc stands for `span / height` lights of the legs, in the plane through the ring's middle. - int dy = div(y * span, height) - h; + // Each light of the disc stands for 144 / height lights of the legs, whose height is 144, in the plane through the ring's middle. + int dy = div(y * 144, height) - h; for (int x = 0; x < width; x = x + 1) { - int dx = div((x - cx) * span, height); + int dx = div((x - cx) * 144, height); // Along the axis, and the squared distance from it. int u = div(nx * dx + ny * dy, 32768); int rho = div(u * u * 256, bb) + div((dx * dx + dy * dy - u * u) * 256, aa); @@ -74,5 +82,13 @@ class StadBeestEyeOrbEffect { if (bright > 0) { setPaletteColor(x, y, mod(div(polarA(dx, dy), 256) + div(t, 40) + div(y * 64, height), 256), bright); } } } + // The lids, over what is drawn: the rows beyond the opening go dark. + int closed = lids(); + for (int y = 0; y < closed; y = y + 1) { + for (int x = 0; x < width; x = x + 1) { + setRGB(y * width + x, 0, 0, 0); + setRGB((height - 1 - y) * width + x, 0, 0, 0); + } + } } } diff --git a/moonlive/effects/stadbeest-sauron.mle b/moonlive/effects/stadbeest-sauron.mle index 089fdac84..a6372e291 100644 --- a/moonlive/effects/stadbeest-sauron.mle +++ b/moonlive/effects/stadbeest-sauron.mle @@ -1,4 +1,4 @@ -// StadBeestSauron: the eye wreathed in flame, a burning iris around a black slit that searches left and right. With music it turns on the beat, its flames reach out with the volume and its slit narrows on every beat. +// StadBeestSauron: the eye wreathed in flame, a burning iris around a black slit that searches left and right and blinks. With music it turns on the beat, its flames reach out with the volume and its slit narrows on every beat. class StadBeestSauronEffect { byte bpm = 12; @@ -14,6 +14,7 @@ class StadBeestSauronEffect { int to = 0; // where it turns to bool wasOnBeat = false; // whether the last frame was on a beat, so one beat counts once byte flash = 0; // the beat's flash, fading + int blinkAt = 3000; // when the next blink starts, in ms int dimensions() { return 2; } @@ -47,6 +48,7 @@ class StadBeestSauronEffect { int heard = audioBeat(); if (sensitivity == 0) { heard = 0; } flash = flash - div(flash + 15, 16); + if (t > blinkAt + 300) { blinkAt = t + 1500 + random16(6000); } // the next blink, a few seconds on // A rising edge is a beat, unless it follows the last one too closely. if (heard > wasOnBeat) { if (t - lastBeat > 250) { @@ -77,6 +79,8 @@ class StadBeestSauronEffect { // An almond nearly as wide as the disc and half as high, the slit inside it narrowing on a beat and widening with the volume. int hw = div(rim * 15, 16); int hh = div(rim * 9, 16); + // A blink closes the almond and opens it again within 300 ms. + if (t > blinkAt) { hh = 8 + div((hh - 8) * polarR(t - blinkAt - 150, 0), 150); } // At least half a light either side of the gaze, so the slit always covers a column of lights. int sw = 8 + div(slit * rim, 1024) + div(loud * rim, 8192); int pul = 256; diff --git a/moonlive/services/stadbeest-autopilot.mls b/moonlive/services/stadbeest-autopilot.mls index 22073fd38..4c96cb70c 100644 --- a/moonlive/services/stadbeest-autopilot.mls +++ b/moonlive/services/stadbeest-autopilot.mls @@ -1,10 +1,11 @@ -// StadBeestAutopilot: runs the StadBeest unattended. Every few minutes a new scene moves on to the next look (walking, the orb, the thrusters) and picks a palette (stadbeest-fire for the thrusters), a mood, how much the music counts and whether it flashes on the beat; within a scene the energy breathes once a minute. It moves the control surface, so the legs follow here and the eyes over OSC, each on the look's own controls through automap. +// StadBeestAutopilot: runs the StadBeest unattended. Every few minutes a new scene moves on to the next look (walking, the orb, the thrusters) and picks a palette (stadbeest-fire in a third of the thrusters scenes), a mood, how much the music counts and whether it flashes on the beat; within a scene the energy breathes once a minute. It moves the control surface, so the legs follow here and the eyes over OSC, each on the look's own controls through automap. class StadBeestAutopilot { bool run = true; byte seconds = 180; int scene = -1; // the scene running, counted from boot + int sceneAt = -1000000; // when it started, in ms, so a new length only moves the next scene int look = 0; // the scene's look: 0 walking, 1 the orb, 2 the thrusters, one switch each int mood = 128; // the scene's energy, 0 calm to 255 wild int palette = 0; // the scene's palette @@ -43,12 +44,12 @@ class StadBeestAutopilot { void tick20ms() { if (run == 0) { return; } - int now = div(t, seconds * 1000); - if (now != scene) { - scene = now; + if (t - sceneAt >= seconds * 1000) { + scene = scene + 1; + sceneAt = t; look = mod(scene, 3); palette = random16(60); // any built-in palette - if (look == 2) { palette = 64; } // the thrusters and the burning eye in stadbeest-fire, its place in the palette list on every device + if (look == 2) { if (random16(3) == 0) { palette = 64; } } // a third of the thrusters scenes burn in stadbeest-fire, its place in the palette list on every device mood = random16(256); pulseOn = random16(2); hearing = 80 + random16(150); diff --git a/src/core/moonlive/MoonLiveIr.h b/src/core/moonlive/MoonLiveIr.h index 48ef3b0db..5e54f74a1 100644 --- a/src/core/moonlive/MoonLiveIr.h +++ b/src/core/moonlive/MoonLiveIr.h @@ -139,10 +139,13 @@ constexpr uint8_t idxCount(int32_t p) { return uint8_t((p >> 16) & 0xff); } /// Branch targets one IR program may use. static constexpr uint8_t kIrLabels = 40; -// THE COST IS STACK: doubling these would pass 2 KB, so move them to the heap instead. +// THE COST IS STACK: a label is a two-byte code position, since no program passes the 16 KB code cap, so 96 of them take what 48 four-byte ones did. /// Labels and fixups an assembler's tables hold. -static constexpr uint8_t kAsmLabels = 48; +static constexpr uint8_t kAsmLabels = 96; static constexpr uint8_t kAsmFixups = 96; +/// Where a label is bound in the code, or kUnbound before it is. +using CodePos = uint16_t; +static constexpr CodePos kUnbound = 0xFFFF; // What is live at once rather than a total, since a block hands its slots back at its brace. /// How many frame slots one program may hold at once. diff --git a/src/core/services/MidiService.h b/src/core/services/MidiService.h index e00bde4a4..bcf332883 100644 --- a/src/core/services/MidiService.h +++ b/src/core/services/MidiService.h @@ -102,6 +102,7 @@ class MidiService : public MoonModule, public ControlSurface { /// Show one surface control on the desk, in the profile's messages. void sendValue(SurfaceControl kind, uint8_t index, uint8_t value) override { + if (kind == SurfaceControl::Encoder) value = ringShare(index, value); uint8_t m[3]; uint8_t slot; if (profile == kProfileApc40 ? !apcMessage(kind, index, value, m, slot) : !mackieMessage(kind, index, value, m, slot)) return; @@ -110,6 +111,15 @@ class MidiService : public MoonModule, public ControlSurface { if (connected_ && greeted_) sendChangedSlots(); } + /// An encoder's value as its share of what its target takes, on 0..255, so a ring is full at the target's top whatever its range. + static uint8_t ringShare(uint8_t index, uint8_t value) { + int lo = 0, hi = 255; + auto* c = ControlModule::active(); + if (!c || !c->targetRange(SurfaceControl::Encoder, index, lo, hi) || hi <= lo) return value; + const int v = value < lo ? lo : (value > hi ? hi : value); + return static_cast((v - lo) * 255 / (hi - lo)); + } + /// Show the Control card's display line on a Mackie desk's LCD, at once when the desk is there and on its greeting otherwise. void sendDisplay(const char* text) override { mm::formatTo(lcdText_, sizeof(lcdText_), "%s", text ? text : ""); diff --git a/src/core/services/MoonLiveService.h b/src/core/services/MoonLiveService.h index fa771b312..4ec7b76ed 100644 --- a/src/core/services/MoonLiveService.h +++ b/src/core/services/MoonLiveService.h @@ -76,6 +76,9 @@ class MoonLiveService : public MoonModule { MoonModule::defineControls(); } + /// The script's controls exist once prepare has compiled it, so a saved value waits for that. + bool declaresControlsAtPrepare() const override { return true; } + /// Only naming a different script recompiles, a value change updating a byte the tick reads. bool affectsPrepare(const char* controlName) const override { return std::strcmp(controlName, "script") == 0; diff --git a/src/core/system/ControlModule.h b/src/core/system/ControlModule.h index a43a1401a..ef2d6aa5c 100644 --- a/src/core/system/ControlModule.h +++ b/src/core/system/ControlModule.h @@ -354,6 +354,7 @@ class ControlModule : public MoonModule, public ListSource { if (std::strstr(controlName, "Target") != nullptr) { rebuildControls(); followTargets(); + resendEncoders(); return; } for (uint8_t i = 0; i < kFaderCount; i++) { @@ -545,7 +546,16 @@ class ControlModule : public MoonModule, public ListSource { } for (uint8_t b = 0; b < 3; b++) for (; next[b] < kAutoSlots; next[b]++) changed |= setAuto(banks[b][next[b]], nullptr, nullptr); - if (changed) rebuildControls(); // the cards show what each slot drives now + if (!changed) return; + rebuildControls(); // the cards show what each slot drives now + followTargets(); + resendEncoders(); + } + + /// Show every encoder again, since a ring is scaled by what its knob drives, which just changed. + void resendEncoders() { + for (uint8_t s = 0; s < surfaceCount_; s++) + for (uint8_t i = 0; i < kEncoderCount; i++) surfaces_[s]->sendValue(SurfaceControl::Encoder, i, encoders_[i]); } /// Automap after every rebuild walk, which is when the focus and a script's controls can change. @@ -553,28 +563,24 @@ class ControlModule : public MoonModule, public ListSource { /// Drives whatever `switchTarget` declares. void driveSwitch(uint8_t index) { - const char* target = switchTarget(index); - if (!target || index >= kSwitchCount) return; - const char* dot = std::strchr(target, '.'); - if (!dot) return; + if (index >= kSwitchCount) return; + char module[24]; + const char* name = splitTarget(switchTarget(index), module); + if (!name) return; auto* sched = Scheduler::instance(); if (!sched) return; - char module[24]; - const size_t n = std::min(static_cast(dot - target), sizeof(module) - 1); - std::memcpy(module, target, n); - module[n] = '\0'; // A button takes every write as a press, so a switch drives one on the way down only. - const ControlDescriptor* tc = findControl(module, dot + 1); + const ControlDescriptor* tc = findControl(module, name); if (tc && tc->type == ControlType::Button && !switches_[index]) return; // An unchanged target is not rewritten, as in driveSurface; `enabled` is no declared control yet reads back the same way, and rewriting it rebuilds the tree. int32_t current = 0; - if ((!tc || tc->type != ControlType::Button) && sched->getControlWide(module, dot + 1, current) + if ((!tc || tc->type != ControlType::Button) && sched->getControlWide(module, name, current) && (current != 0) == switches_[index]) return; char body[32]; std::snprintf(body, sizeof(body), "{\"value\":%s}", switches_[index] ? "true" : "false"); - sched->setControl(module, dot + 1, body); + sched->setControl(module, name, body); // On or off rather than 1 or 0, and a module's `enabled` named by its module, since every such switch drives `enabled`. - writeStrip("%s %s", std::strcmp(dot + 1, "enabled") == 0 ? module : dot + 1, switches_[index] ? "on" : "off"); + writeStrip("%s %s", std::strcmp(name, "enabled") == 0 ? module : name, switches_[index] ? "on" : "off"); } /// Read every bound control back, so a surface FOLLOWS what it drives. @@ -601,22 +607,48 @@ class ControlModule : public MoonModule, public ListSource { return nullptr; } + /// What a surface control drives, as "Module.control", or null when it drives nothing yet. + const char* targetOf(SurfaceControl kind, uint8_t index) const { + return kind == SurfaceControl::Switch ? switchTarget(index) + : kind == SurfaceControl::Encoder ? encoderTarget(index) + : surfaceTarget(index); + } + + /// Split "Module.control" into the module's name, written to `module`, and the control's, returned; null when there is none. + static const char* splitTarget(const char* target, char (&module)[24]) { + const char* dot = target ? std::strchr(target, '.') : nullptr; + if (!dot) return nullptr; + const size_t n = std::min(static_cast(dot - target), sizeof(module) - 1); + std::memcpy(module, target, n); + module[n] = '\0'; + return dot + 1; + } + + /// The values a control takes, from `lo` to `hi`, a choice counted to its last option. + static void rangeOf(const ControlDescriptor& c, int& lo, int& hi) { + lo = c.min; + hi = (c.type == ControlType::Select || c.type == ControlType::Palette) ? static_cast(c.max) - 1 + : static_cast(c.max); + } + + /// The values what a surface control drives takes; false when it drives nothing. + bool targetRange(SurfaceControl kind, uint8_t index, int& lo, int& hi) const { + char module[24]; + const char* name = splitTarget(targetOf(kind, index), module); + const ControlDescriptor* tc = name ? findControl(module, name) : nullptr; + if (tc) rangeOf(*tc, lo, hi); + return tc != nullptr; + } + /// One control's read-back. bool pullTarget(SurfaceControl kind, uint8_t index, uint8_t& value) { - const char* target = kind == SurfaceControl::Switch ? switchTarget(index) - : kind == SurfaceControl::Encoder ? encoderTarget(index) - : surfaceTarget(index); - if (!target) return false; // unassigned: nothing to follow - const char* dot = std::strchr(target, '.'); - if (!dot) return false; + char module[24]; + const char* name = splitTarget(targetOf(kind, index), module); + if (!name) return false; // unassigned: nothing to follow auto* sched = Scheduler::instance(); if (!sched) return false; - char module[24]; - const size_t n = std::min(static_cast(dot - target), sizeof(module) - 1); - std::memcpy(module, target, n); - module[n] = '\0'; uint8_t live = 0; - if (!sched->getControl(module, dot + 1, live)) return false; + if (!sched->getControl(module, name, live)) return false; if (live == value) return false; value = live; return true; @@ -624,34 +656,28 @@ class ControlModule : public MoonModule, public ListSource { /// Write a surface control's value onto whatever it targets. void driveSurface(SurfaceControl kind, uint8_t index) { - const char* target = kind == SurfaceControl::Encoder ? encoderTarget(index) - : surfaceTarget(index); - if (!target) return; // unassigned - const char* dot = std::strchr(target, '.'); - if (!dot) return; + char module[24]; + const char* name = splitTarget(targetOf(kind, index), module); + if (!name) return; // unassigned auto* sched = Scheduler::instance(); if (!sched) return; - char module[24]; - const size_t n = std::min(static_cast(dot - target), sizeof(module) - 1); - std::memcpy(module, target, n); - module[n] = '\0'; uint8_t value = kind == SurfaceControl::Encoder ? encoders_[index] : faders_[index]; // Clamped to the TARGET's range before writing: - if (const ControlDescriptor* tc = findControl(module, dot + 1)) { - const int hi = (tc->type == ControlType::Select || tc->type == ControlType::Palette) - ? static_cast(tc->max) - 1 : static_cast(tc->max); + if (const ControlDescriptor* tc = findControl(module, name)) { + int lo = 0, hi = 255; + rangeOf(*tc, lo, hi); if (value > hi) value = static_cast(hi < 0 ? 0 : hi); - if (value < tc->min) value = tc->min; + if (value < lo) value = static_cast(lo); } // And the control itself holds what it wrote, so the next read agrees with the target. if (kind == SurfaceControl::Encoder) encoders_[index] = value; else faders_[index] = value; // An unchanged target is not rewritten: an OSC echo of a sent value would otherwise read as a player taking a self-playing game's control. int32_t current = 0; - if (sched->getControlWide(module, dot + 1, current) && current == value) return; + if (sched->getControlWide(module, name, current) && current == value) return; char body[32]; std::snprintf(body, sizeof(body), "{\"value\":%u}", static_cast(value)); - sched->setControl(module, dot + 1, body); - showOnStrip(module, dot + 1, value); + sched->setControl(module, name, body); + showOnStrip(module, name, value); followTargets(); // siblings on the same target update now, not at the next pass } diff --git a/src/light/drivers/ParallelLedDriver.h b/src/light/drivers/ParallelLedDriver.h index 76f4725a5..123e2c3e7 100644 --- a/src/light/drivers/ParallelLedDriver.h +++ b/src/light/drivers/ParallelLedDriver.h @@ -539,9 +539,9 @@ class ParallelLedDriver : public DriverBase { const uint64_t mask = maskLo32 | (static_cast(maskHi32) << 32); // constant shift: cheap if (shift) { // DATA WORDS ONLY: the pulse-start and tail are frame constants, prefilled once. - const uint32_t segT1 = platform::cycleCount(); // TEMP DIAGNOSTIC + const uint32_t segT1 = platform::cycleCount(); // the instrument's split: gather above, transpose below encodeWs2812ShiftData(wire, mask, physPins_, latchBit_, outputsPerPin(), outCh, out); - const uint32_t segT2 = platform::cycleCount(); // TEMP DIAGNOSTIC + const uint32_t segT2 = platform::cycleCount(); dbgSegGatherCy += segT1 - segT0; // memset+mask+gather (since segT0 / previous row's end) dbgSegEmitCy += segT2 - segT1; // the transpose+emit dbgSegRows += 1; diff --git a/src/platform/desktop/moonlive_asm_arm64.cpp b/src/platform/desktop/moonlive_asm_arm64.cpp index c3d51b095..4d2be9a52 100644 --- a/src/platform/desktop/moonlive_asm_arm64.cpp +++ b/src/platform/desktop/moonlive_asm_arm64.cpp @@ -31,20 +31,6 @@ constexpr bool armScratchOutsideMap() { static_assert(armScratchOutsideMap(), "a scratch register is also a vreg — calls will corrupt it"); -Label HostAssembler::newLabel() { - if (labelCount_ == 0) for (auto& p : labelPos_) p = -1; - if (labelCount_ >= kMaxLabels) { overflow_ = true; return 0; } // same overflow signal as emit32 - Label l = labelCount_++; - labelPos_[l] = -1; - return l; -} -void HostAssembler::bind(Label l) { if (l < kMaxLabels) labelPos_[l] = static_cast(len_); } - -// Record a pending branch fixup, guarding the fixed table, a script with too many branches sets overflow_ rather than writing past fixups_ (the same failure path as a full code buffer). -void HostAssembler::addFixup(size_t at, Label label, FixKind kind) { - if (fixupCount_ >= kMaxFixups) { overflow_ = true; return; } - fixups_[fixupCount_++] = {at, label, kind}; -} void HostAssembler::emit32(uint32_t w) { if (!buf_ || len_ + 4 > kCap) { overflow_ = true; return; } @@ -294,8 +280,8 @@ void HostAssembler::patchBranches() { if (!buf_ || overflow_) return; for (uint8_t i = 0; i < fixupCount_; i++) { const Fixup& f = fixups_[i]; + if (labelPos_[f.label] == kUnbound) continue; // unbound label: leave the branch as-is (overflow_ already failed the compile) int32_t target = labelPos_[f.label]; - if (target < 0) continue; // unbound label — leave the branch as-is (overflow_ already failed the compile) int32_t rel = (target - static_cast(f.at)) >> 2; // PC-relative, /4 uint32_t w; std::memcpy(&w, buf_ + f.at, 4); if (f.kind == FixKind::Call) { diff --git a/src/platform/desktop/moonlive_asm_host.h b/src/platform/desktop/moonlive_asm_host.h index c5443b390..1ac93b3d9 100644 --- a/src/platform/desktop/moonlive_asm_host.h +++ b/src/platform/desktop/moonlive_asm_host.h @@ -77,10 +77,17 @@ class HostAssembler { void emitBytes(const uint8_t* p, size_t n); // --- labels --- + // One definition for both host ISAs, since a table running out is the same failure as a full code buffer. /// A fresh label, to be bound once and branched to any number of times. - Label newLabel(); + Label newLabel() { + if (labelCount_ == 0) for (auto& p : labelPos_) p = kUnbound; + if (labelCount_ >= kMaxLabels) { overflow_ = true; return 0; } + const Label l = labelCount_++; + labelPos_[l] = kUnbound; + return l; + } /// Mark l's position = current offset. - void bind(Label l); + void bind(Label l) { if (len_ >= kUnbound) overflow_ = true; else if (l < kMaxLabels) labelPos_[l] = static_cast(len_); } // --- the call frame --- /// Open a frame with room for `slots` spilled values, parking a frame pointer at its base. @@ -175,7 +182,10 @@ class HostAssembler { enum class FixKind : uint8_t { Branch, Call }; struct Fixup { size_t at; Label label; FixKind kind = FixKind::Branch; }; /// Bounds-checked. - void addFixup(size_t at, Label label, FixKind kind = FixKind::Branch); + void addFixup(size_t at, Label label, FixKind kind = FixKind::Branch) { + if (fixupCount_ >= kMaxFixups) { overflow_ = true; return; } + fixups_[fixupCount_++] = {at, label, kind}; + } // Heap rather than a member array, which put 2 KB on the stack and overflowed a classic ESP32. uint8_t* buf_; @@ -185,8 +195,8 @@ class HostAssembler { // Frame size, 0 without a prologue, so a teardown cannot disagree with its setup about the stack. uint16_t frameBytes_ = 0; - // Label positions (-1 = unbound) and pending branch fixups. - int32_t labelPos_[kMaxLabels]; + // Label positions (kUnbound before binding) and pending branch fixups. + CodePos labelPos_[kMaxLabels]; uint8_t labelCount_ = 0; Fixup fixups_[kMaxFixups]; uint8_t fixupCount_ = 0; diff --git a/src/platform/desktop/moonlive_asm_x86_64.cpp b/src/platform/desktop/moonlive_asm_x86_64.cpp index 5dd2ecc9d..db369f087 100644 --- a/src/platform/desktop/moonlive_asm_x86_64.cpp +++ b/src/platform/desktop/moonlive_asm_x86_64.cpp @@ -112,19 +112,6 @@ static uint8_t xr(Reg r) { return kX64Reg[r < kRegCount ? r : kRegCount - 1]; } static_assert(kX64Reg[kRegCount - 1] == x64::RAX, "rax must be the last vreg — call() relies on saving it before using it as the fn-target scratch"); -Label HostAssembler::newLabel() { - if (labelCount_ == 0) for (auto& p : labelPos_) p = -1; - if (labelCount_ >= kMaxLabels) { overflow_ = true; return 0; } - Label l = labelCount_++; - labelPos_[l] = -1; - return l; -} -void HostAssembler::bind(Label l) { if (l < kMaxLabels) labelPos_[l] = static_cast(len_); } - -void HostAssembler::addFixup(size_t at, Label label, FixKind kind) { - if (fixupCount_ >= kMaxFixups) { overflow_ = true; return; } - fixups_[fixupCount_++] = {at, label, kind}; -} // Emit bytes through the existing path, which owns the bounds check and the overflow flag; instructions here are variable-length, so a small local buffer holds any single one. // There is no fixed-word emitter on this architecture: the header declares one for the sibling, where a fixed word is the natural unit. @@ -746,8 +733,8 @@ void HostAssembler::patchBranches() { if (!buf_ || overflow_) return; for (uint8_t i = 0; i < fixupCount_; i++) { const Fixup& f = fixups_[i]; + if (labelPos_[f.label] == kUnbound) continue; // unbound label: leave the branch as-is (overflow_ already failed the compile) int32_t target = labelPos_[f.label]; - if (target < 0) continue; // unbound label — leave alone if (f.kind == FixKind::Call) { // `call rel32` at [f.at]: opcode E8 at f.at, imm32 at f.at+1. rel is relative to the byte AFTER the imm32 field, so subtract (f.at + 5). int32_t rel = target - (int32_t(f.at) + 5); diff --git a/src/platform/esp32/moonlive_asm_riscv.cpp b/src/platform/esp32/moonlive_asm_riscv.cpp index 53250967e..9effd6fce 100644 --- a/src/platform/esp32/moonlive_asm_riscv.cpp +++ b/src/platform/esp32/moonlive_asm_riscv.cpp @@ -38,11 +38,11 @@ void RiscvAssembler::emit32(uint32_t w) { } Label RiscvAssembler::newLabel() { - if (labelCount_ == 0) for (auto& p : labelPos_) p = -1; + if (labelCount_ == 0) for (auto& p : labelPos_) p = kUnbound; if (labelCount_ >= kMaxLabels) { overflow_ = true; return 0; } // same overflow signal as emit32 - Label l = labelCount_++; labelPos_[l] = -1; return l; + Label l = labelCount_++; labelPos_[l] = kUnbound; return l; } -void RiscvAssembler::bind(Label l) { if (l < kMaxLabels) labelPos_[l] = static_cast(len_); } +void RiscvAssembler::bind(Label l) { if (len_ >= kUnbound) overflow_ = true; else if (l < kMaxLabels) labelPos_[l] = static_cast(len_); } // A call to a function in this block, the script-to-script call, linking the return address into the standard register. // The callee's prologue saves it into its own frame, which is what lets calls nest and therefore recurse. @@ -299,8 +299,8 @@ void RiscvAssembler::patchBranches() { if (!buf_ || overflow_) return; for (uint8_t i = 0; i < fixupCount_; i++) { const Fixup& f = fixups_[i]; - if (labelPos_[f.label] < 0) continue; // unbound label — leave as-is (overflow_ already failed the compile) - int32_t off = labelPos_[f.label] - static_cast(f.at); + if (labelPos_[f.label] == kUnbound) continue; // unbound label: leave as-is (overflow_ already failed the compile) + int32_t off = static_cast(labelPos_[f.label]) - static_cast(f.at); uint32_t w; std::memcpy(&w, buf_ + f.at, 4); if (f.kind == FixKind::Branch) { // The short branch reaches a few kilobytes and no further, past which the mask below truncates the offset silently and the branch lands on whatever the low bits name. diff --git a/src/platform/esp32/moonlive_asm_riscv.h b/src/platform/esp32/moonlive_asm_riscv.h index 71dd07039..0f9a06239 100644 --- a/src/platform/esp32/moonlive_asm_riscv.h +++ b/src/platform/esp32/moonlive_asm_riscv.h @@ -161,7 +161,7 @@ class RiscvAssembler { // Frame size, 0 without a prologue, so a teardown cannot disagree with its setup about the stack. uint16_t frameBytes_ = 0; - int32_t labelPos_[kMaxLabels]; + CodePos labelPos_[kMaxLabels]; uint8_t labelCount_ = 0; struct Fixup { size_t at; Label label; FixKind kind = FixKind::Branch; }; Fixup fixups_[kMaxFixups]; diff --git a/src/platform/esp32/moonlive_asm_xtensa.cpp b/src/platform/esp32/moonlive_asm_xtensa.cpp index bab475b5a..77bb01994 100644 --- a/src/platform/esp32/moonlive_asm_xtensa.cpp +++ b/src/platform/esp32/moonlive_asm_xtensa.cpp @@ -180,11 +180,11 @@ void XtensaAssembler::spillLoad(Reg r, uint8_t slot) { } Label XtensaAssembler::newLabel() { - if (labelCount_ == 0) for (auto& p : labelPos_) p = -1; + if (labelCount_ == 0) for (auto& p : labelPos_) p = kUnbound; if (labelCount_ >= kMaxLabels) { overflow_ = true; return 0; } // same overflow signal as emit - Label l = labelCount_++; labelPos_[l] = -1; return l; + Label l = labelCount_++; labelPos_[l] = kUnbound; return l; } -void XtensaAssembler::bind(Label l) { if (l < kMaxLabels) labelPos_[l] = static_cast(len_); } +void XtensaAssembler::bind(Label l) { if (len_ >= kUnbound) overflow_ = true; else if (l < kMaxLabels) labelPos_[l] = static_cast(len_); } // Record a pending branch fixup, guarding the fixed table (overflow_ rather than an OOB write). void XtensaAssembler::addFixup(size_t at, Label label, FixKind kind) { @@ -483,11 +483,11 @@ void XtensaAssembler::patchBranches() { if (!buf_ || overflow_) return; for (uint8_t i = 0; i < fixupCount_; i++) { const Fixup& f = fixups_[i]; - if (labelPos_[f.label] < 0) continue; // unbound label — leave as-is (overflow_ already failed the compile) + if (labelPos_[f.label] == kUnbound) continue; // unbound label: leave as-is (overflow_ already failed the compile) uint32_t enc = 0; if (f.kind == FixKind::Jump) { // `j`: the displacement is relative to the byte AFTER the instruction and occupies bits 6..23: eighteen signed bits, so it reaches any script the code buffer can hold. Range-checked: refusing beats silently retargeting a jump. - const int32_t off = labelPos_[f.label] - (static_cast(f.at) + 4); + const int32_t off = static_cast(labelPos_[f.label]) - (static_cast(f.at) + 4); if (off < -131072 || off > 131071) { overflow_ = true; return; } enc = 0x06u | ((static_cast(off) & 0x3ffffu) << 6); } else { @@ -496,7 +496,7 @@ void XtensaAssembler::patchBranches() { // It stays because the alternative to noticing is a call landing mid-instruction, which the assembler rejects outright. // The indirect form has no such rule, which is why a call INTO a block always worked while one inside it did not. const int32_t base = static_cast(f.at & ~size_t(3)); - const int32_t byteOff = labelPos_[f.label] - (base + 4); + const int32_t byteOff = static_cast(labelPos_[f.label]) - (base + 4); if ((byteOff & 3) != 0) { overflow_ = true; return; } const int32_t off = byteOff >> 2; if (off < -131072 || off > 131071) { overflow_ = true; return; } diff --git a/src/platform/esp32/moonlive_asm_xtensa.h b/src/platform/esp32/moonlive_asm_xtensa.h index 04c8fd1f2..d5019d902 100644 --- a/src/platform/esp32/moonlive_asm_xtensa.h +++ b/src/platform/esp32/moonlive_asm_xtensa.h @@ -166,7 +166,7 @@ class XtensaAssembler { size_t len_ = 0; bool overflow_ = false; - int32_t labelPos_[kMaxLabels]; + CodePos labelPos_[kMaxLabels]; uint8_t labelCount_ = 0; Fixup fixups_[kMaxFixups]; uint8_t fixupCount_ = 0; diff --git a/test/scenarios/core/scenario_Control_a_palette_preset_changes_only_the_palette.json b/test/scenarios/core/scenario_Control_a_palette_preset_changes_only_the_palette.json index 9a03ba56a..2594e95e1 100644 --- a/test/scenarios/core/scenario_Control_a_palette_preset_changes_only_the_palette.json +++ b/test/scenarios/core/scenario_Control_a_palette_preset_changes_only_the_palette.json @@ -178,10 +178,10 @@ "p95": 324, "min": 5, "max": 462, - "n": 29, - "samples": [5, 462, 324, 5, 5, 5, 7, 5, 6, 5, 6, 6, 6, 5, 5, 13, 6, 5, 11, 8, 8, 8, 8, 8, 9, 14, 8, 8, 8] + "n": 30, + "samples": [5, 462, 324, 5, 5, 5, 7, 5, 6, 5, 6, 6, 6, 5, 5, 13, 6, 5, 11, 8, 8, 8, 8, 8, 9, 14, 8, 8, 8, 11] }, - "last_updated": "2026-10-09" + "last_updated": "2026-10-10" }, "esp32s3-n16r8": { "tick_us": { diff --git a/test/scenarios/core/scenario_State_one_document_adds_an_effect_with_its_controls.json b/test/scenarios/core/scenario_State_one_document_adds_an_effect_with_its_controls.json index eeb29fc6f..e1e189989 100644 --- a/test/scenarios/core/scenario_State_one_document_adds_an_effect_with_its_controls.json +++ b/test/scenarios/core/scenario_State_one_document_adds_an_effect_with_its_controls.json @@ -69,14 +69,14 @@ "observed": { "desktop-macos": { "tick_us": { - "p50": 2, + "p50": 4, "p95": 387, "min": 1, "max": 555, - "n": 28, - "samples": [367, 555, 1, 387, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 4, 1, 7, 7, 8, 7, 7, 8, 7, 7, 7, 7] + "n": 29, + "samples": [367, 555, 1, 387, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 4, 1, 7, 7, 8, 7, 7, 8, 7, 7, 7, 7, 8] }, - "last_updated": "2026-10-09" + "last_updated": "2026-10-10" }, "esp32s3-n16r8": { "tick_us": { diff --git a/test/scenarios/light/scenario_Drivers_output_and_brightness.json b/test/scenarios/light/scenario_Drivers_output_and_brightness.json index 593581dee..00007c329 100644 --- a/test/scenarios/light/scenario_Drivers_output_and_brightness.json +++ b/test/scenarios/light/scenario_Drivers_output_and_brightness.json @@ -107,9 +107,9 @@ "min": 6, "max": 17, "n": 32, - "samples": [6, 7, 7, 7, 7, 7, 17, 6, 7, 7, 7, 7, 9, 8, 7, 7, 7, 6, 8, 15, 8, 7, 7, 7, 7, 7, 7, 7, 7, 8, 7, 8] + "samples": [7, 7, 7, 7, 7, 17, 6, 7, 7, 7, 7, 9, 8, 7, 7, 7, 6, 8, 15, 8, 7, 7, 7, 7, 7, 7, 7, 7, 8, 7, 8, 8] }, - "last_updated": "2026-10-09" + "last_updated": "2026-10-10" }, "desktop-windows": { "tick_us": { diff --git a/test/scenarios/light/scenario_Effects_pipeline_builds_and_renders.json b/test/scenarios/light/scenario_Effects_pipeline_builds_and_renders.json index 754a6e42a..af5c1ade2 100644 --- a/test/scenarios/light/scenario_Effects_pipeline_builds_and_renders.json +++ b/test/scenarios/light/scenario_Effects_pipeline_builds_and_renders.json @@ -54,10 +54,10 @@ "p95": 7, "min": 1, "max": 7, - "n": 18, - "samples": [1, 1, 1, 1, 1, 1, 1, 1, 6, 6, 6, 6, 6, 6, 6, 7, 6, 6] + "n": 19, + "samples": [1, 1, 1, 1, 1, 1, 1, 1, 6, 6, 6, 6, 6, 6, 6, 7, 6, 6, 7] }, - "last_updated": "2026-10-09" + "last_updated": "2026-10-10" } } }, @@ -86,11 +86,11 @@ "p50": 1, "p95": 7, "min": 1, - "max": 7, + "max": 8, "n": 32, - "samples": [1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6] + "samples": [1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 8] }, - "last_updated": "2026-10-09" + "last_updated": "2026-10-10" }, "desktop-windows": { "tick_us": { @@ -118,9 +118,9 @@ "min": 6, "max": 46, "n": 32, - "samples": [6, 7, 7, 7, 46, 7, 6, 6, 6, 6, 7, 7, 7, 7, 7, 6, 6, 10, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 7, 7, 7] + "samples": [7, 7, 7, 46, 7, 6, 6, 6, 6, 7, 7, 7, 7, 7, 6, 6, 10, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 7, 7, 7, 6] }, - "last_updated": "2026-10-09" + "last_updated": "2026-10-10" }, "desktop-windows": { "tick_us": { diff --git a/test/scenarios/light/scenario_Effects_swap_while_running.json b/test/scenarios/light/scenario_Effects_swap_while_running.json index 47479bb74..ebeb465e4 100644 --- a/test/scenarios/light/scenario_Effects_swap_while_running.json +++ b/test/scenarios/light/scenario_Effects_swap_while_running.json @@ -86,9 +86,9 @@ "min": 1, "max": 2, "n": 32, - "samples": [1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + "samples": [1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] }, - "last_updated": "2026-10-09" + "last_updated": "2026-10-10" }, "desktop-windows": { "tick_us": { @@ -168,9 +168,9 @@ "min": 1, "max": 4, "n": 32, - "samples": [1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + "samples": [1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] }, - "last_updated": "2026-10-09" + "last_updated": "2026-10-10" }, "desktop-windows": { "tick_us": { diff --git a/test/scenarios/light/scenario_Effects_teardown_under_a_running_pipeline.json b/test/scenarios/light/scenario_Effects_teardown_under_a_running_pipeline.json index 122faabe5..6a7eb4051 100644 --- a/test/scenarios/light/scenario_Effects_teardown_under_a_running_pipeline.json +++ b/test/scenarios/light/scenario_Effects_teardown_under_a_running_pipeline.json @@ -68,9 +68,9 @@ "min": 6, "max": 81, "n": 32, - "samples": [7, 7, 6, 7, 7, 7, 7, 18, 7, 6, 7, 81, 7, 7, 7, 7, 7, 15, 7, 7, 12, 7, 7, 8, 7, 8, 8, 8, 8, 8, 8, 8] + "samples": [7, 6, 7, 7, 7, 7, 18, 7, 6, 7, 81, 7, 7, 7, 7, 7, 15, 7, 7, 12, 7, 7, 8, 7, 8, 8, 8, 8, 8, 8, 8, 10] }, - "last_updated": "2026-10-09" + "last_updated": "2026-10-10" }, "esp32s3-n16r8": { "tick_us": { @@ -149,9 +149,9 @@ "min": 4, "max": 32, "n": 32, - "samples": [4, 4, 4, 7, 4, 5, 5, 32, 4, 4, 4, 12, 5, 5, 5, 4, 6, 5, 5, 4, 7, 4, 4, 5, 4, 6, 6, 6, 6, 6, 4, 5] + "samples": [4, 4, 7, 4, 5, 5, 32, 4, 4, 4, 12, 5, 5, 5, 4, 6, 5, 5, 4, 7, 4, 4, 5, 4, 6, 6, 6, 6, 6, 4, 5, 9] }, - "last_updated": "2026-10-09" + "last_updated": "2026-10-10" }, "esp32s3-n16r8": { "tick_us": { @@ -226,9 +226,9 @@ "min": 6, "max": 19, "n": 32, - "samples": [7, 7, 7, 7, 7, 7, 7, 19, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 6, 7, 15, 7, 7, 9, 7, 8, 8, 8, 7, 7, 7, 7] + "samples": [7, 7, 7, 7, 7, 7, 19, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 6, 7, 15, 7, 7, 9, 7, 8, 8, 8, 7, 7, 7, 7, 9] }, - "last_updated": "2026-10-09" + "last_updated": "2026-10-10" }, "esp32s3-n16r8": { "tick_us": { @@ -313,9 +313,9 @@ "min": 6, "max": 18, "n": 32, - "samples": [7, 7, 6, 7, 7, 7, 7, 18, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 6, 7, 14, 7, 7, 7, 7, 7, 7, 7, 8, 7, 7, 7] + "samples": [7, 6, 7, 7, 7, 7, 18, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 6, 7, 14, 7, 7, 7, 7, 7, 7, 7, 8, 7, 7, 7, 10] }, - "last_updated": "2026-10-09" + "last_updated": "2026-10-10" }, "esp32s3-n16r8": { "tick_us": { @@ -406,9 +406,9 @@ "min": 6, "max": 31, "n": 32, - "samples": [6, 7, 6, 7, 7, 7, 7, 31, 6, 6, 6, 6, 7, 7, 7, 7, 7, 11, 6, 7, 13, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7] + "samples": [7, 6, 7, 7, 7, 7, 31, 6, 6, 6, 6, 7, 7, 7, 7, 7, 11, 6, 7, 13, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 11] }, - "last_updated": "2026-10-09" + "last_updated": "2026-10-10" }, "esp32s3-n16r8": { "tick_us": { @@ -495,9 +495,9 @@ "min": 3, "max": 25, "n": 32, - "samples": [3, 3, 3, 4, 4, 4, 4, 25, 4, 3, 3, 5, 4, 4, 4, 4, 4, 5, 4, 4, 9, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5] + "samples": [3, 3, 4, 4, 4, 4, 25, 4, 3, 3, 5, 4, 4, 4, 4, 4, 5, 4, 4, 9, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5] }, - "last_updated": "2026-10-09" + "last_updated": "2026-10-10" }, "esp32s3-n16r8": { "tick_us": { @@ -600,9 +600,9 @@ "min": 3, "max": 20, "n": 32, - "samples": [4, 3, 3, 4, 4, 4, 4, 20, 4, 3, 3, 4, 4, 4, 4, 4, 4, 6, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5] + "samples": [3, 3, 4, 4, 4, 4, 20, 4, 3, 3, 4, 4, 4, 4, 4, 4, 6, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 7] }, - "last_updated": "2026-10-09" + "last_updated": "2026-10-10" }, "esp32s3-n16r8": { "tick_us": { diff --git a/test/scenarios/light/scenario_Layers_stack_and_blend_live.json b/test/scenarios/light/scenario_Layers_stack_and_blend_live.json index de2862026..357096355 100644 --- a/test/scenarios/light/scenario_Layers_stack_and_blend_live.json +++ b/test/scenarios/light/scenario_Layers_stack_and_blend_live.json @@ -92,9 +92,9 @@ "min": 8, "max": 24, "n": 32, - "samples": [9, 8, 8, 8, 8, 8, 8, 24, 8, 8, 8, 9, 8, 8, 8, 8, 9, 11, 8, 8, 12, 9, 9, 8, 8, 8, 8, 9, 9, 10, 11, 9] + "samples": [8, 8, 8, 8, 8, 8, 24, 8, 8, 8, 9, 8, 8, 8, 8, 9, 11, 8, 8, 12, 9, 9, 8, 8, 8, 8, 9, 9, 10, 11, 9, 10] }, - "last_updated": "2026-10-09" + "last_updated": "2026-10-10" } } }, @@ -136,9 +136,9 @@ "min": 13, "max": 37, "n": 32, - "samples": [15, 15, 15, 15, 15, 15, 15, 35, 15, 15, 15, 15, 15, 15, 14, 15, 16, 37, 13, 15, 19, 15, 15, 15, 15, 15, 15, 16, 16, 16, 19, 16] + "samples": [15, 15, 15, 15, 15, 15, 35, 15, 15, 15, 15, 15, 15, 14, 15, 16, 37, 13, 15, 19, 15, 15, 15, 15, 15, 15, 16, 16, 16, 19, 16, 15] }, - "last_updated": "2026-10-09" + "last_updated": "2026-10-10" } } }, @@ -224,9 +224,9 @@ "min": 18, "max": 46, "n": 32, - "samples": [21, 20, 20, 20, 21, 20, 20, 46, 21, 20, 20, 21, 20, 20, 20, 20, 21, 29, 18, 20, 24, 20, 20, 21, 20, 21, 21, 21, 21, 21, 24, 21] + "samples": [20, 20, 20, 21, 20, 20, 46, 21, 20, 20, 21, 20, 20, 20, 20, 21, 29, 18, 20, 24, 20, 20, 21, 20, 21, 21, 21, 21, 21, 24, 21, 20] }, - "last_updated": "2026-10-09" + "last_updated": "2026-10-10" } } }, @@ -264,9 +264,9 @@ "min": 121, "max": 225, "n": 32, - "samples": [124, 123, 122, 123, 124, 124, 123, 225, 124, 122, 123, 126, 124, 123, 123, 123, 125, 141, 121, 123, 162, 124, 123, 123, 123, 123, 123, 125, 125, 125, 128, 124] + "samples": [123, 122, 123, 124, 124, 123, 225, 124, 122, 123, 126, 124, 123, 123, 123, 125, 141, 121, 123, 162, 124, 123, 123, 123, 123, 123, 125, 125, 125, 128, 124, 124] }, - "last_updated": "2026-10-09" + "last_updated": "2026-10-10" } } }, @@ -304,9 +304,9 @@ "min": 262, "max": 454, "n": 32, - "samples": [275, 270, 264, 271, 267, 266, 267, 454, 280, 262, 266, 304, 267, 265, 264, 275, 267, 309, 267, 265, 355, 265, 265, 265, 265, 264, 265, 274, 284, 291, 280, 267] + "samples": [270, 264, 271, 267, 266, 267, 454, 280, 262, 266, 304, 267, 265, 264, 275, 267, 309, 267, 265, 355, 265, 265, 265, 265, 264, 265, 274, 284, 291, 280, 267, 272] }, - "last_updated": "2026-10-09" + "last_updated": "2026-10-10" } } }, @@ -338,12 +338,12 @@ "tick_us": { "p50": 56, "p95": 85, - "min": 54, + "min": 51, "max": 100, "n": 32, - "samples": [56, 56, 56, 56, 58, 57, 60, 85, 56, 56, 56, 65, 56, 65, 55, 56, 69, 56, 56, 56, 100, 56, 56, 56, 56, 56, 56, 56, 57, 61, 54, 56] + "samples": [56, 56, 56, 58, 57, 60, 85, 56, 56, 56, 65, 56, 65, 55, 56, 69, 56, 56, 56, 100, 56, 56, 56, 56, 56, 56, 56, 57, 61, 54, 56, 51] }, - "last_updated": "2026-10-09" + "last_updated": "2026-10-10" } } }, @@ -367,9 +367,9 @@ "min": 51, "max": 103, "n": 32, - "samples": [52, 52, 52, 53, 53, 54, 53, 97, 52, 52, 54, 57, 53, 54, 52, 52, 75, 103, 52, 52, 76, 52, 52, 58, 52, 52, 52, 53, 54, 55, 51, 55] + "samples": [52, 52, 53, 53, 54, 53, 97, 52, 52, 54, 57, 53, 54, 52, 52, 75, 103, 52, 52, 76, 52, 52, 58, 52, 52, 52, 53, 54, 55, 51, 55, 53] }, - "last_updated": "2026-10-09" + "last_updated": "2026-10-10" } } }, @@ -400,12 +400,12 @@ "tick_us": { "p50": 52, "p95": 205, - "min": 51, + "min": 48, "max": 281, "n": 32, - "samples": [51, 51, 51, 52, 52, 57, 51, 85, 51, 51, 52, 56, 51, 56, 51, 52, 51, 205, 52, 51, 281, 51, 51, 51, 52, 51, 55, 51, 54, 52, 54, 52] + "samples": [51, 51, 52, 52, 57, 51, 85, 51, 51, 52, 56, 51, 56, 51, 52, 51, 205, 52, 51, 281, 51, 51, 51, 52, 51, 55, 51, 54, 52, 54, 52, 48] }, - "last_updated": "2026-10-09" + "last_updated": "2026-10-10" } } } diff --git a/test/scenarios/light/scenario_Layouts_resize_reallocates_live.json b/test/scenarios/light/scenario_Layouts_resize_reallocates_live.json index 2ce74766d..1e6691db6 100644 --- a/test/scenarios/light/scenario_Layouts_resize_reallocates_live.json +++ b/test/scenarios/light/scenario_Layouts_resize_reallocates_live.json @@ -82,9 +82,9 @@ "min": 6, "max": 23, "n": 32, - "samples": [7, 6, 6, 7, 6, 7, 7, 14, 7, 6, 7, 23, 7, 7, 7, 7, 7, 20, 8, 8, 22, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 7] + "samples": [6, 6, 7, 6, 7, 7, 14, 7, 6, 7, 23, 7, 7, 7, 7, 7, 20, 8, 8, 22, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 7, 7] }, - "last_updated": "2026-10-09" + "last_updated": "2026-10-10" }, "desktop-windows": { "tick_us": { @@ -164,9 +164,9 @@ "min": 9, "max": 22, "n": 32, - "samples": [10, 10, 10, 10, 11, 10, 11, 19, 10, 11, 10, 22, 10, 11, 10, 10, 10, 17, 10, 10, 19, 10, 10, 11, 10, 11, 11, 11, 11, 10, 9, 11] + "samples": [10, 10, 10, 11, 10, 11, 19, 10, 11, 10, 22, 10, 11, 10, 10, 10, 17, 10, 10, 19, 10, 10, 11, 10, 11, 11, 11, 11, 10, 9, 11, 9] }, - "last_updated": "2026-10-09" + "last_updated": "2026-10-10" }, "desktop-windows": { "tick_us": { @@ -253,9 +253,9 @@ "min": 6, "max": 14, "n": 32, - "samples": [6, 7, 6, 6, 6, 7, 7, 14, 6, 6, 6, 9, 6, 7, 7, 7, 7, 9, 7, 6, 14, 6, 7, 7, 7, 7, 7, 7, 7, 7, 6, 7] + "samples": [7, 6, 6, 6, 7, 7, 14, 6, 6, 6, 9, 6, 7, 7, 7, 7, 9, 7, 6, 14, 6, 7, 7, 7, 7, 7, 7, 7, 7, 6, 7, 7] }, - "last_updated": "2026-10-09" + "last_updated": "2026-10-10" }, "desktop-windows": { "tick_us": { diff --git a/test/scenarios/light/scenario_Modifiers_reshape_the_mapping.json b/test/scenarios/light/scenario_Modifiers_reshape_the_mapping.json index 03378b5c2..8feca06b5 100644 --- a/test/scenarios/light/scenario_Modifiers_reshape_the_mapping.json +++ b/test/scenarios/light/scenario_Modifiers_reshape_the_mapping.json @@ -67,9 +67,9 @@ "min": 6, "max": 19, "n": 32, - "samples": [6, 6, 6, 7, 7, 7, 7, 19, 7, 6, 6, 8, 6, 7, 8, 11, 7, 8, 8, 6, 10, 7, 7, 8, 7, 7, 7, 7, 7, 8, 7, 7] + "samples": [6, 6, 7, 7, 7, 7, 19, 7, 6, 6, 8, 6, 7, 8, 11, 7, 8, 8, 6, 10, 7, 7, 8, 7, 7, 7, 7, 7, 8, 7, 7, 7] }, - "last_updated": "2026-10-09" + "last_updated": "2026-10-10" }, "esp32s3-n16r8": { "tick_us": { @@ -156,9 +156,9 @@ "min": 3, "max": 11, "n": 32, - "samples": [3, 3, 3, 3, 3, 3, 3, 11, 3, 3, 3, 4, 4, 4, 3, 3, 3, 5, 4, 3, 9, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4] + "samples": [3, 3, 3, 3, 3, 3, 11, 3, 3, 3, 4, 4, 4, 3, 3, 3, 5, 4, 3, 9, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4] }, - "last_updated": "2026-10-09" + "last_updated": "2026-10-10" }, "esp32s3-n16r8": { "tick_us": { @@ -238,9 +238,9 @@ "min": 3, "max": 9, "n": 32, - "samples": [3, 3, 3, 3, 3, 3, 3, 8, 3, 3, 3, 4, 3, 3, 3, 3, 3, 5, 4, 3, 9, 3, 3, 4, 3, 4, 3, 3, 4, 4, 4, 4] + "samples": [3, 3, 3, 3, 3, 3, 8, 3, 3, 3, 4, 3, 3, 3, 3, 3, 5, 4, 3, 9, 3, 3, 4, 3, 4, 3, 3, 4, 4, 4, 4, 4] }, - "last_updated": "2026-10-09" + "last_updated": "2026-10-10" }, "esp32s3-n16r8": { "tick_us": { @@ -319,9 +319,9 @@ "min": 2, "max": 6, "n": 32, - "samples": [2, 2, 2, 2, 2, 2, 2, 6, 2, 2, 2, 3, 3, 2, 3, 2, 2, 3, 3, 3, 5, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3] + "samples": [2, 2, 2, 2, 2, 2, 6, 2, 2, 2, 3, 3, 2, 3, 2, 2, 3, 3, 3, 5, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3] }, - "last_updated": "2026-10-09" + "last_updated": "2026-10-10" }, "esp32s3-n16r8": { "tick_us": { @@ -406,9 +406,9 @@ "min": 3, "max": 11, "n": 32, - "samples": [3, 3, 3, 3, 3, 3, 3, 11, 3, 3, 3, 4, 3, 3, 3, 3, 3, 5, 4, 5, 7, 3, 3, 4, 3, 4, 3, 4, 4, 4, 4, 4] + "samples": [3, 3, 3, 3, 3, 3, 11, 3, 3, 3, 4, 3, 3, 3, 3, 3, 5, 4, 5, 7, 3, 3, 4, 3, 4, 3, 4, 4, 4, 4, 4, 4] }, - "last_updated": "2026-10-09" + "last_updated": "2026-10-10" }, "esp32s3-n16r8": { "tick_us": { @@ -495,9 +495,9 @@ "min": 3, "max": 9, "n": 32, - "samples": [3, 4, 3, 3, 3, 4, 3, 9, 3, 3, 3, 4, 3, 3, 3, 3, 3, 4, 4, 3, 6, 3, 3, 4, 3, 4, 3, 3, 4, 4, 3, 4] + "samples": [4, 3, 3, 3, 4, 3, 9, 3, 3, 3, 4, 3, 3, 3, 3, 3, 4, 4, 3, 6, 3, 3, 4, 3, 4, 3, 3, 4, 4, 3, 4, 4] }, - "last_updated": "2026-10-09" + "last_updated": "2026-10-10" }, "esp32s3-n16r8": { "tick_us": { @@ -582,9 +582,9 @@ "min": 6, "max": 20, "n": 32, - "samples": [6, 6, 6, 6, 7, 7, 7, 20, 7, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, 7, 7, 7, 7, 7, 7, 7, 7, 8, 7, 7] + "samples": [6, 6, 6, 7, 7, 7, 20, 7, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, 7, 7, 7, 7, 7, 7, 7, 7, 8, 7, 7, 8] }, - "last_updated": "2026-10-09" + "last_updated": "2026-10-10" }, "esp32s3-n16r8": { "tick_us": { diff --git a/test/scenarios/light/scenario_Palettes_a_script_drives_the_effects.json b/test/scenarios/light/scenario_Palettes_a_script_drives_the_effects.json index 04aabb650..992e642eb 100644 --- a/test/scenarios/light/scenario_Palettes_a_script_drives_the_effects.json +++ b/test/scenarios/light/scenario_Palettes_a_script_drives_the_effects.json @@ -107,9 +107,9 @@ "min": 6, "max": 202, "n": 32, - "samples": [6, 6, 202, 11, 6, 74, 74, 7, 6, 6, 7, 6, 6, 6, 7, 8, 11, 7, 7, 9, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 7] + "samples": [6, 202, 11, 6, 74, 74, 7, 6, 6, 7, 6, 6, 6, 7, 8, 11, 7, 7, 9, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 7, 9] }, - "last_updated": "2026-10-09" + "last_updated": "2026-10-10" } } }, @@ -175,9 +175,9 @@ "min": 6, "max": 205, "n": 32, - "samples": [6, 7, 205, 7, 7, 115, 108, 8, 6, 6, 7, 7, 7, 7, 7, 7, 8, 6, 6, 11, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7] + "samples": [7, 205, 7, 7, 115, 108, 8, 6, 6, 7, 7, 7, 7, 7, 7, 8, 6, 6, 11, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6] }, - "last_updated": "2026-10-09" + "last_updated": "2026-10-10" } } } diff --git a/test/unit/core/moonlive_device_codegen.inc b/test/unit/core/moonlive_device_codegen.inc index 0c95502df..77f5f32e2 100644 --- a/test/unit/core/moonlive_device_codegen.inc +++ b/test/unit/core/moonlive_device_codegen.inc @@ -187,26 +187,28 @@ TEST_CASE("an unencodable script is refused, not truncated, on " MM_ISA_NAME) { // The assembler is a LOCAL in lowerWith, and lowerWith runs on the render task, so its size is // stack a 12 KB task has to have spare while a script compiles. Its two fixed tables dominate it: -// 4 bytes per label and 8 per fixup, so raising kAsmLabels/kAsmFixups is a stack decision wearing a -// capacity costume. 16/32 put lowerWith at 480 bytes on the classic ESP32 and 48/96 puts it at -// 1120, which is the largest frame on the compile chain (2128 bytes nested). +// 2 bytes per label (a code position, under the 16 KB code cap) and 8 per fixup, so raising +// kAsmLabels/kAsmFixups is a stack decision wearing a capacity costume. 48 four-byte labels and 96 +// fixups put lowerWith at 1120 bytes on the classic ESP32, the largest frame on the compile chain +// (2128 bytes nested); 96 two-byte labels take the same table bytes. // // This bound is a TRIPWIRE, not a target: it exists so that raising the tables is a deliberate act // with a number attached, rather than something noticed when a board bootloops. A P4 has already // been lost to an oversized frame on this path. If this fails, either the growth is wrong, or the // tables belong on the heap next to the code buffer, which was moved off the stack for this reason. TEST_CASE("the " MM_ISA_NAME " assembler stays small enough to build on a render task") { - // Asserted in TABLE ENTRIES rather than bytes, because bytes here are the host's: these backends - // are compiled on a 64-bit machine to run their real emitter, a Fixup holds a size_t, and - // sizeof() therefore overstates the device object. The entry counts are the same everywhere and - // they are what actually gets raised, so they are the honest thing to pin. + // Asserted in the tables' DEVICE bytes rather than sizeof(), because sizeof() here is the host's: + // these backends are compiled on a 64-bit machine to run their real emitter, a Fixup holds a + // size_t, and the host object overstates the device one. A label is a CodePos everywhere and a + // device Fixup is 8 bytes, so the device bytes follow from the entry counts. // // The device figure, measured on the classic ESP32 image rather than derived: lowerWith's frame - // is 480 bytes at 16/32 and 1120 at 48/96: 4 bytes per label and 8 per fixup. Re-measure with - // `xtensa-esp-elf-objdump -d` and grep the `entry a1, N` of lowerWith after changing either. - INFO(MM_ISA_NAME " assembler = " << sizeof(MM_ISA_ASM) << " bytes on this 64-bit host"); - CHECK(mm::moonlive::kAsmLabels <= 64); - CHECK(mm::moonlive::kAsmFixups <= 128); + // is 1120 bytes with these tables at 960 bytes. Re-measure with `xtensa-esp-elf-objdump -d` and + // grep the `entry a1, N` of lowerWith after changing either. + constexpr size_t kDeviceFixupBytes = 8; + const size_t tableBytes = mm::moonlive::kAsmLabels * sizeof(mm::moonlive::CodePos) + mm::moonlive::kAsmFixups * kDeviceFixupBytes; + INFO(MM_ISA_NAME " assembler = " << sizeof(MM_ISA_ASM) << " bytes on this 64-bit host, tables " << tableBytes << " on a device"); + CHECK(tableBytes <= 1280); // 64 four-byte labels and 128 fixups, the allowance before labels shrank } // A class whose functions call each other has to place each function where a call can REACH it. diff --git a/test/unit/core/unit_ControlModule.cpp b/test/unit/core/unit_ControlModule.cpp index 7e55b7c29..abd682e22 100644 --- a/test/unit/core/unit_ControlModule.cpp +++ b/test/unit/core/unit_ControlModule.cpp @@ -1612,6 +1612,33 @@ TEST_CASE("a MIDI desk shows the surface: fader motors, SELECT lights and knob r midi.release(); } +// A ring shows a knob's value as its share of what the knob drives, so it is full at the target's top whatever that target's range. +TEST_CASE("a MIDI desk's knob ring fills over the range of what the knob drives") { + Device d; + mm::MidiService midi; + midi.defineControls(); + REQUIRE(d.scheduler.setControl("Control", "encoder2Target", "{\"value\":\"Drivers.motionHold\"}") == mm::Scheduler::SetControlResult::Ok); + REQUIRE(d.scheduler.setControl("Control", "encoder2", "{\"value\":240}") == mm::Scheduler::SetControlResult::Ok); // motionHold's top + midi.prepare(); + CHECK(deskSlot(midi, 17) == "b0312b"); // encoder2's ring, all eleven lights + midi.release(); +} + +// A knob given another target keeps its value, so its ring is sent again for the new range. +TEST_CASE("a MIDI desk's knob ring follows a new target with the same value") { + Device d; + mm::MidiService midi; + midi.defineControls(); + REQUIRE(d.scheduler.setControl("Drivers", "brightness", "{\"value\":200}") == mm::Scheduler::SetControlResult::Ok); + REQUIRE(d.scheduler.setControl("Drivers", "motionHold", "{\"value\":200}") == mm::Scheduler::SetControlResult::Ok); + REQUIRE(d.scheduler.setControl("Control", "encoder2Target", "{\"value\":\"Drivers.brightness\"}") == mm::Scheduler::SetControlResult::Ok); + midi.prepare(); + CHECK(deskSlot(midi, 17) == "b03128"); // 200 of 255: eight lights + REQUIRE(d.scheduler.setControl("Control", "encoder2Target", "{\"value\":\"Drivers.motionHold\"}") == mm::Scheduler::SetControlResult::Ok); + CHECK(deskSlot(midi, 17) == "b03129"); // 200 of 240: nine + midi.release(); +} + // A desk that reports its motorized fader's position back must land on the value it was sent, or the two would chase each other. TEST_CASE("a fader position sent to a MIDI desk decodes back to the same value") { Device d; @@ -1972,6 +1999,49 @@ TEST_CASE("a Mackie desk shared over the network shows the display line of the d mm::platform::setTestUsbMidiDesk(false); } +// A quick turn arrives as several knob messages in one USB read and one network packet, so each must keep its direction on the way. +TEST_CASE("a Mackie desk shared over the network turns a knob down as well as up") { + Device d; + mm::platform::setTestUsbMidiDesk(true); + mm::MidiService bridge; + bridge.source = mm::MidiService::kSourceUsb; + bridge.share = true; + bridge.port = 26104; + bridge.prepare(); + mm::MidiService midi; + midi.defineControls(); + midi.source = mm::MidiService::kSourceNetwork; + midi.port = 26204; + auto& cs = midi.controls(); + for (uint8_t i = 0; i < cs.count(); i++) + if (std::strcmp(cs[i].name, "host") == 0) std::strcpy(static_cast(cs[i].ptr), "127.0.0.1:26104"); + midi.prepare(); + const auto exchange = [&] { + midi.tick20ms(); + bridge.tick20ms(); + sentToDesk(); + std::this_thread::sleep_for(std::chrono::milliseconds(5)); + }; + for (int i = 0; i < 200 && std::string(bridge.status()).find("shared with") != 0; i++) exchange(); + REQUIRE(std::string(bridge.status()).find("shared with") == 0); + + const uint8_t start = surfaceValue(d, "encoder1"); + const uint8_t up[1][4] = {{0x0B, 0xB0, 0x10, 0x0A}}; + mm::platform::injectTestUsbMidi(up, 1); + for (int i = 0; i < 200 && surfaceValue(d, "encoder1") == start; i++) exchange(); + const uint8_t raised = surfaceValue(d, "encoder1"); + CHECK(raised > start); + const uint8_t down[5][4] = {{0x0B, 0xB0, 0x10, 0x41}, {0x0B, 0xB0, 0x10, 0x41}, {0x0B, 0xB0, 0x10, 0x42}, + {0x0B, 0xB0, 0x10, 0x41}, {0x0B, 0xB0, 0x10, 0x41}}; + mm::platform::injectTestUsbMidi(down, 5); + for (int i = 0; i < 200 && surfaceValue(d, "encoder1") == raised; i++) exchange(); + for (int i = 0; i < 20; i++) exchange(); + CHECK(surfaceValue(d, "encoder1") == raised - 6); + midi.release(); + bridge.release(); + mm::platform::setTestUsbMidiDesk(false); +} + // A Mackie desk's LCD shows what the Control card's display shows, centered on its top row. TEST_CASE("a Mackie desk's LCD shows the Control card's display line") { Device d; diff --git a/test/unit/core/unit_MoonLiveService.cpp b/test/unit/core/unit_MoonLiveService.cpp index 780812573..a5d83eeb6 100644 --- a/test/unit/core/unit_MoonLiveService.cpp +++ b/test/unit/core/unit_MoonLiveService.cpp @@ -11,6 +11,7 @@ #include "core/module/Scheduler.h" #include "core/module/MoonModule.h" #include "core/system/FilesystemModule.h" +#include "core/module/StateDocument.h" #include "platform/platform.h" #include @@ -129,6 +130,23 @@ TEST_CASE("a scripted service declares its own controls, which a user can set") CHECK(sawThreshold); } +// A script's controls exist only once it compiles, so a saved value for one lands after the compile rather than being dropped. +TEST_CASE("a saved value of a script's own control survives the boot") { + Rig rig; + writeScript("t_saved.mls", + "class Saved {\n" + " byte seconds = 180;\n" + " void defineControls() { addControl(\"seconds\", seconds, 1, 255); }\n" + " void tick20ms() { }\n" + "}\n"); + const StateDocumentResult r = applyStateDocument(rig.scheduler, R"({"Script": {"script": "t_saved.mls", "seconds": 85}})", StateSource::Stored); + REQUIRE(r.ok); + rig.scheduler.prepareTree(); + int32_t seconds = 0; + REQUIRE(rig.scheduler.getControlWide("Script", "seconds", seconds)); + CHECK(seconds == 85); +} + // A script names its own choices, so a setting with a few modes reads as words on the card rather than as numbers on a slider. TEST_CASE("a script declares a dropdown with addSelect, its value the index of the name picked") { Rig rig; diff --git a/test/unit/light/unit_Effects_framerate.cpp b/test/unit/light/unit_Effects_framerate.cpp index 97490e76f..819ac0217 100644 --- a/test/unit/light/unit_Effects_framerate.cpp +++ b/test/unit/light/unit_Effects_framerate.cpp @@ -39,6 +39,8 @@ double meanLit(Make make, int fps, int seconds) { MoonModule* effect = make(); effect->defineControls(); layer.addChild(effect); + // Set before setup, which seeds an effect's random draws from the clock: unset, it reads the real clock and every run draws differently. + platform::setTestNowMs(100000u); layouts.applyState(); layer.applyState(); From b19af284aabc2718e0cb7bccbde2f134b2687783 Mon Sep 17 00:00:00 2001 From: ewowi Date: Sat, 10 Oct 2026 13:09:28 +0200 Subject: [PATCH 2/2] Scale a knob ring in 64 bits, process the review of the branch MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A knob driving a control with a range wider than a byte scales its ring without overflow, and the autopilot's comment says what a new scene length does. Commit: src +2/-2 lines | test +0/-0 lines **UI** - MidiService computes a ring's share in 64 bits, since an int target's range can span the whole int. **Light domain** - StadBeest autopilot: its comment says a new length moves where the running scene ends; "thruster scenes". **Docs/CI** - "thruster scenes" in the StadBeest page; the docgen report one warning lower. **Reviews** - 🐇 ringShare could overflow int → 64-bit arithmetic. - 🐇 "the thrusters scenes" → "thruster scenes", in the page and the script. - 🐇 Store the scene length at its start so fader 8 only affects later scenes → declined: a long scene would then run its full length after a shorter one is set; the comment now says what the live comparison does. - 🐇 The shared-desk test uses loopback sockets and sleeps → declined: it follows the file's other RTP-MIDI tests, and a fake transport for all of them is its own change. Co-Authored-By: Claude Opus 5.5 --- docs/how-to/multi-board-installation.md | 2 +- docs/reference/metrics/docgen.md | 12 ++++++------ moonlive/services/stadbeest-autopilot.mls | 6 +++--- src/core/services/MidiService.h | 4 ++-- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/how-to/multi-board-installation.md b/docs/how-to/multi-board-installation.md index 764f4c36c..7592ec933 100644 --- a/docs/how-to/multi-board-installation.md +++ b/docs/how-to/multi-board-installation.md @@ -258,7 +258,7 @@ A [MoonLiveService](../moonmodules/core/services.md#moonliveservice) on the lead - **Scenes:** every `seconds`, three minutes by default, it picks a new scene. A scene moves on to the next look, walking, the orb or the thrusters, by switching `switch3` to `switch5`. - It picks a built-in palette, in a third of the thrusters scenes [`stadbeest-fire.mlp`](https://github.com/MoonModules/MoonLight/blob/main/moonlive/palettes/stadbeest-fire.mlp), a mood from calm to wild, how much the music counts and `pulse` on or off. + It picks a built-in palette, in a third of the thruster scenes [`stadbeest-fire.mlp`](https://github.com/MoonModules/MoonLight/blob/main/moonlive/palettes/stadbeest-fire.mlp), a mood from calm to wild, how much the music counts and `pulse` on or off. That palette is computed every frame: louder music burns hotter, a beat flares the hot end white, and the flames flicker. A palette has the same number on every device, so the eyes and the mouth pick the same one. - **Breathing:** within a scene the energy rises and falls once a minute, through `fader2`, the tempo of whatever look runs. diff --git a/docs/reference/metrics/docgen.md b/docs/reference/metrics/docgen.md index 0e6bd7233..d0bf9091f 100644 --- a/docs/reference/metrics/docgen.md +++ b/docs/reference/metrics/docgen.md @@ -4,7 +4,7 @@ Generated by [`moondeck/check/check_docgen.py`](../../../moondeck/check/check_do Every place the generated documentation breaks the shape [the standards](../../contributing/documentation-standards.md#the-card) define. Current state only: the trend is this file's git history. The list only shrinks. -**0 error(s)** and **4287 warning(s)** across 413 page(s). +**0 error(s)** and **4286 warning(s)** across 413 page(s). **5460 appendix line(s)** after `@moreinfo`. This only falls as well: a cleanup cuts first, and moves only what neither the code, the test name nor the spec says. @@ -17,7 +17,7 @@ The split is temporary. It stages the sweep rather than ranking the two kinds of | Rule | Errors | Warnings | |---|---:|---:| | split paragraphs | 0 | 1791 | -| over-wide comment lines | 0 | 1583 | +| over-wide comment lines | 0 | 1582 | | appendix sections nothing refers to | 0 | 369 | | multi-line comment blocks | 0 | 317 | | over-long sentences | 0 | 82 | @@ -31,7 +31,7 @@ The unit a sweep runs in: one summary page and the headers it owns, as the [hier | Summary page | Errors | Warnings | |---|---:|---:| | `(tests, no card)` | 0 | 2064 | -| `platform/index.md` | 0 | 744 | +| `platform/index.md` | 0 | 743 | | `light/effects.md` | 0 | 403 | | `core/system.md` | 0 | 203 | | `core/supporting.md` | 0 | 181 | @@ -71,7 +71,7 @@ By rule, warnings: 1360 over-wide comment lines, 271 split paragraphs, 197 multi ### platform/index.md -**0 error(s)** and **744 warning(s)** across 31 file(s). +**0 error(s)** and **743 warning(s)** across 31 file(s). | Findings | File | | |---:|---|---| @@ -80,14 +80,14 @@ By rule, warnings: 1360 over-wide comment lines, 271 split paragraphs, 197 multi | 68 | `src/platform/esp32/moonlive_asm_xtensa.cpp` | warning | | 67 | `src/platform/esp32/platform_esp32_i80.cpp` | warning | | 61 | `src/platform/esp32/platform_esp32_rmt.cpp` | warning | -| 43 | `src/platform/desktop/moonlive_asm_arm64.cpp` | warning | +| 42 | `src/platform/desktop/moonlive_asm_arm64.cpp` | warning | | 33 | `src/platform/esp32/platform_esp32_parlio.cpp` | warning | | 32 | `src/platform/esp32/moonlive_asm_riscv.cpp` | warning | | 23 | `src/platform/esp32/platform_esp32_i2s.cpp` | warning | | 20 | `src/platform/esp32/platform_esp32_improv.cpp` | warning | | 1-19 each | *21 more warning files, 146 findings* | | -By rule, warnings: 398 split paragraphs, 218 over-wide comment lines, 114 multi-line comment blocks, 14 appendix sections nothing refers to. +By rule, warnings: 398 split paragraphs, 217 over-wide comment lines, 114 multi-line comment blocks, 14 appendix sections nothing refers to. ### light/effects.md diff --git a/moonlive/services/stadbeest-autopilot.mls b/moonlive/services/stadbeest-autopilot.mls index 4c96cb70c..cc67f507f 100644 --- a/moonlive/services/stadbeest-autopilot.mls +++ b/moonlive/services/stadbeest-autopilot.mls @@ -1,11 +1,11 @@ -// StadBeestAutopilot: runs the StadBeest unattended. Every few minutes a new scene moves on to the next look (walking, the orb, the thrusters) and picks a palette (stadbeest-fire in a third of the thrusters scenes), a mood, how much the music counts and whether it flashes on the beat; within a scene the energy breathes once a minute. It moves the control surface, so the legs follow here and the eyes over OSC, each on the look's own controls through automap. +// StadBeestAutopilot: runs the StadBeest unattended. Every few minutes a new scene moves on to the next look (walking, the orb, the thrusters) and picks a palette (stadbeest-fire in a third of the thruster scenes), a mood, how much the music counts and whether it flashes on the beat; within a scene the energy breathes once a minute. It moves the control surface, so the legs follow here and the eyes over OSC, each on the look's own controls through automap. class StadBeestAutopilot { bool run = true; byte seconds = 180; int scene = -1; // the scene running, counted from boot - int sceneAt = -1000000; // when it started, in ms, so a new length only moves the next scene + int sceneAt = -1000000; // when it started, in ms, so a new length moves where it ends rather than restarting the count int look = 0; // the scene's look: 0 walking, 1 the orb, 2 the thrusters, one switch each int mood = 128; // the scene's energy, 0 calm to 255 wild int palette = 0; // the scene's palette @@ -49,7 +49,7 @@ class StadBeestAutopilot { sceneAt = t; look = mod(scene, 3); palette = random16(60); // any built-in palette - if (look == 2) { if (random16(3) == 0) { palette = 64; } } // a third of the thrusters scenes burn in stadbeest-fire, its place in the palette list on every device + if (look == 2) { if (random16(3) == 0) { palette = 64; } } // a third of the thruster scenes burn in stadbeest-fire, its place in the palette list on every device mood = random16(256); pulseOn = random16(2); hearing = 80 + random16(150); diff --git a/src/core/services/MidiService.h b/src/core/services/MidiService.h index bcf332883..a82cf180b 100644 --- a/src/core/services/MidiService.h +++ b/src/core/services/MidiService.h @@ -116,8 +116,8 @@ class MidiService : public MoonModule, public ControlSurface { int lo = 0, hi = 255; auto* c = ControlModule::active(); if (!c || !c->targetRange(SurfaceControl::Encoder, index, lo, hi) || hi <= lo) return value; - const int v = value < lo ? lo : (value > hi ? hi : value); - return static_cast((v - lo) * 255 / (hi - lo)); + const int64_t v = value < lo ? lo : (value > hi ? hi : value); + return static_cast((v - lo) * 255 / (static_cast(hi) - lo)); // wide, since an int target's range can span the whole int } /// Show the Control card's display line on a Mackie desk's LCD, at once when the desk is there and on its greeting otherwise.