From 73e52cb9c33a3bd4b69ef1dba05bff8021254bf1 Mon Sep 17 00:00:00 2001 From: ewowi Date: Mon, 7 Sep 2026 13:12:43 +0200 Subject: [PATCH 1/3] MoonLive functions take arguments, and a fork says so MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Scripts can now define helpers that take parameters, which is what lets one function be called many times with different values instead of communicating through class members. Editing a shipped script still forks it, but the card now says whether your copy is current or the library has moved on, and the palette picker no longer offers a script it cannot select. Performance: desktop 1846 KB, ESP32 image 1,978,768 bytes (53% partition free), tick unchanged. 1879 unit tests (+24 cases), 27 scenarios, 0 failures. **Core** - MoonLive functions take arguments, by value. They pass through a block in the arena rather than the frame: each function opens its own frame and a slot is addressed off the current frame pointer, so a caller cannot reach its callee's slots at all on Xtensa's windowed ABI. No backend's call sequence changed. The callee copies its arguments out at entry, which is what lets ONE block serve every depth, recursion included. - The status line names a shadowing copy: `edited copy`, or `edited copy, shipped one updated` when the library has changed since the fork was made. Lineage is recorded on the write hook, so every writer gets it, and cleared on revert. Saving a shipped script unchanged now creates no copy at all. **Light domain** - Scripted palettes were listed but unselectable: the scan read only the user directory while the UI downloads to the factory one, and the control's ceiling was baked before the file arrived. Both fixed; the picker's retry and its "reopen the picker" message are gone. - Moving heads reach their beam: `setGobo`/`setRotate` on EffectBase and all five fixture roles from a script. MovingHeadEffect gains gobo, rotate and a beat-rolled pattern. - `draw::ring` and `draw::strokeLine`, sub-pixel and antialiased, and FixedPointEffect: eleven demos ported from Sutaburosu's fixed-point canvas. - Rings241 gains `angleFirst`; AudioVolume removed as too simple. **Scripts** - Three layouts (se16, lightcrafter16, sixteen-rings) and five moving-head scripts, prefixed `mh-` so a rig's scripts group together. - balls, crosshair, mh-sweep and ripples rewritten onto arguments. Verified byte-identical output over 8 frames; ripples got 22% smaller because naming the wave computes each source once instead of twice per pixel. **Tests** - Function arguments (by-value semantics, recursion, nested calls, arity), the palette scan and control ceiling, ring/strokeLine, the fork predicates. - scenario_modifier_chain uses PreviewDriver rather than NetworkSendDriver: a modifier-composition test had socket behavior in it (CodeRabbit #29). **Docs/CI** - The script comment rule names three places, one line each; all 52 scripts comply. MoonLive README documents forking and the three status states. **Reviews** - πŸ‡ CodeRabbit #29, scenario finding: fixed. Its `tick_us` half was dismissed with the reason recorded: a measure step records rather than asserts, and that recording is the per-commit performance trend. Not verified: the ESP32 firmware-fresh gate fails, correctly, because the S3 binary predates the new layout scripts. Function arguments ran on desktop, S3 and P4; the fork marker has only run on desktop. Co-Authored-By: Claude Opus 5 (1M context) --- docs/architecture.md | 2 +- .../light/effects/AudioVolumeEffect.gif | Bin 638076 -> 0 bytes .../light/effects/AudioVolumeEffect.png | Bin 11407 -> 0 bytes docs/backlog/backlog-core.md | 20 +- docs/backlog/backlog-light.md | 28 +- .../generative-fields-analysis-bottom-up.md | 4 +- docs/coding-standards.md | 14 +- docs/gettingstarted.md | 2 +- docs/metrics/repo-health.json | 152 ++--- docs/metrics/repo-health.md | 92 +-- docs/moonmodules/light/MoonLiveLayout.md | 2 +- docs/moonmodules/light/MoonLiveModifier.md | 2 +- docs/moonmodules/light/effects.md | 69 +- docs/moonmodules/light/layouts.md | 1 + docs/tutorials/generative-effects.md | 2 +- moonlive/README.md | 35 +- moonlive/effects/balls.mle | 28 +- moonlive/effects/crosshair.mle | 22 +- moonlive/effects/{aim.mle => mh-aim.mle} | 0 moonlive/effects/mh-ambient.mle | 34 + moonlive/effects/mh-sweep.mle | 47 ++ moonlive/effects/mh-troy.mle | 40 ++ moonlive/effects/mh-wowi.mle | 31 + moonlive/effects/ripples.mle | 21 +- moonlive/effects/sweep.mle | 43 -- moonlive/layouts/lightcrafter16.mll | 36 ++ moonlive/layouts/se16.mll | 47 ++ moonlive/layouts/sixteen-rings.mll | 46 ++ moonlive/palettes/beat-flash.mlp | 3 +- moonlive/palettes/spectrum.mlp | 3 +- moonlive/palettes/temperature.mlp | 3 +- moonlive/services/button.mls | 4 +- moonlive/services/power.mls | 2 + moonlive/services/sweep.mls | 4 +- src/core/AudioFrame.h | 2 +- src/core/AudioService.h | 2 +- src/core/HttpServerModule.cpp | 9 + src/core/moonlive/MoonLiveBuiltins.h | 34 +- src/core/moonlive/MoonLiveCompiler.cpp | 103 ++- src/light/draw.h | 66 ++ src/light/drivers/Drivers.h | 52 +- src/light/effects/AudioVolumeEffect.h | 61 -- src/light/effects/ColorTrailsEffect.h | 102 ++- src/light/effects/EffectBase.h | 14 + src/light/effects/FixedPointEffect.h | 594 ++++++++++++++++++ src/light/effects/MovingHeadEffect.h | 63 +- src/light/layers/Layer.h | 16 + src/light/layouts/Rings241Layout.h | 19 +- src/light/moonlive/MoonLiveBuiltins_light.h | 47 +- src/light/moonlive/MoonLiveEffect.h | 11 +- src/light/moonlive/MoonLiveScript.h | 43 +- src/light/moonlive/MoonLiveScriptFile.h | 118 ++++ src/light/moonlive/script_catalog.h | 36 +- src/main.cpp | 4 +- src/ui/app.js | 49 +- test/CMakeLists.txt | 3 + test/js/ui-picker-scripts.test.mjs | 34 +- test/scenario_runner.cpp | 2 - .../scenario_MoonModule_control_change.json | 22 +- .../light/scenario_Audio_mutation.json | 31 +- test/scenarios/light/scenario_Aurora_fps.json | 58 +- .../light/scenario_Driver_mutation.json | 32 +- .../light/scenario_Effects_composition.json | 6 +- .../light/scenario_Fields_polar_lut.json | 70 +-- .../light/scenario_Fluid_solver.json | 132 ++-- .../light/scenario_GridBlacks_blackpixel.json | 10 +- .../light/scenario_GridLayout_resize.json | 18 +- .../light/scenario_Layer_base_pipeline.json | 8 +- .../light/scenario_Layer_memory_1to1.json | 4 +- .../light/scenario_Layouts_mutation.json | 26 +- .../scenario_MoonLiveEffect_controls.json | 28 +- .../scenario_MoonLiveEffect_livescript.json | 86 +-- .../light/scenario_MoonLive_pipeline.json | 26 +- .../scenario_MultiplyModifier_memory_lut.json | 8 +- .../scenario_MultiplyModifier_pipeline.json | 4 +- .../light/scenario_Trails_ladder.json | 72 +-- .../light/scenario_modifier_chain.json | 37 +- .../light/scenario_modifier_swap.json | 12 +- test/scenarios/light/scenario_perf_full.json | 94 +-- test/scenarios/light/scenario_perf_light.json | 18 +- .../light/scenario_peripheral_grid_sweep.json | 84 +-- .../light/scenario_peripheral_switch.json | 36 +- test/unit/core/unit_moonlive_compiler.cpp | 108 ++++ test/unit/light/unit_AudioLevel.cpp | 6 - test/unit/light/unit_ColorTrailsEffect.cpp | 89 +++ test/unit/light/unit_Drivers_livePalettes.cpp | 121 ++++ test/unit/light/unit_FixedPointEffect.cpp | 112 ++++ test/unit/light/unit_MoonLiveMotion.cpp | 12 +- .../unit/light/unit_MoonLiveScriptResolve.cpp | 95 +++ test/unit/light/unit_MoonLiveScripts.cpp | 11 +- test/unit/light/unit_MovingHeadEffect.cpp | 88 +++ test/unit/light/unit_Rings241Layout.cpp | 35 ++ test/unit/light/unit_draw.cpp | 87 +++ 93 files changed, 3120 insertions(+), 889 deletions(-) delete mode 100644 docs/assets/light/effects/AudioVolumeEffect.gif delete mode 100644 docs/assets/light/effects/AudioVolumeEffect.png rename moonlive/effects/{aim.mle => mh-aim.mle} (100%) create mode 100644 moonlive/effects/mh-ambient.mle create mode 100644 moonlive/effects/mh-sweep.mle create mode 100644 moonlive/effects/mh-troy.mle create mode 100644 moonlive/effects/mh-wowi.mle delete mode 100644 moonlive/effects/sweep.mle create mode 100644 moonlive/layouts/lightcrafter16.mll create mode 100644 moonlive/layouts/se16.mll create mode 100644 moonlive/layouts/sixteen-rings.mll delete mode 100644 src/light/effects/AudioVolumeEffect.h create mode 100644 src/light/effects/FixedPointEffect.h create mode 100644 test/unit/light/unit_ColorTrailsEffect.cpp create mode 100644 test/unit/light/unit_Drivers_livePalettes.cpp create mode 100644 test/unit/light/unit_FixedPointEffect.cpp diff --git a/docs/architecture.md b/docs/architecture.md index fd08747e..c7301e27 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -324,7 +324,7 @@ The defining line is the **data relationship, not the connector**: *does the mod Services are **user-add/deletable children of the `Services` container** β€” the core-domain twin of the light pipeline's `Effects`/`Drivers`: a top-level container holding user-added children of one role. The firmware is identical whether or not the hardware is wired, so the user adds the module when they solder a gyro on and removes it later, reusing the generic child add/replace/delete + persistence machinery (`Services` declares `acceptsChildRoles("service")`). Fixed device infrastructure (identity, network, the inspection tools Tasks/I2cScan) lives under **System** instead, wired by code, not user-added β€” that is the System/Services split. Direction is per-module, not a role: a service may read (gyro), write (relay), or both, so one `Service` role spans the category. Each is a header-only or `.h`+`.cpp` core module under `src/core/`, reaches hardware only through a domain-neutral platform primitive (`platform::i2c*`, `platform::audioMic*`, …), and gets a spec in `docs/moonmodules/core/services.md` (enforced by `check_specs.py`). Most poll in `tick20ms`/`tick1s`; the exception is a service whose data an effect consumes *every frame*: [AudioService](moonmodules/core/moxygen/AudioService.md) reads + analyses its IΒ²S microphone in `tick()` because the audio effects react per render tick, and its per-tick cost (one FFT) is part of the render budget. Automatic bus-probe detection is out of scope; the manual path is the foundation. -**An effect reads a service's data** via the shared-struct pull pattern from [Β§ Data exchange](#data-exchange-between-modules), no new mechanism: the service owns a small POD struct overwritten in place each poll/tick, and the consuming effect holds a `const` pointer to it. The first concrete case is audio: AudioService produces an `AudioFrame` (level + 16-band spectrum + peak) that [AudioVolumeEffect](moonmodules/light/effects.md) and [AudioSpectrumEffect](moonmodules/light/effects.md) consume. It reaches the frame through a static `AudioService::latestFrame()` rather than a boot-time setter, a small variation on the pattern, because an audio effect can be added through the UI *after* boot and must still find the one live mic (a setter only wired the boot instance). The active mic registers itself in `setup()` and clears the pointer in `release()`, so add/remove in any order returns either the live frame or a static silent one, never null. A service that only *displays* its readings (the gyro today) skips the consumer side entirely. +**An effect reads a service's data** via the shared-struct pull pattern from [Β§ Data exchange](#data-exchange-between-modules), no new mechanism: the service owns a small POD struct overwritten in place each poll/tick, and the consuming effect holds a `const` pointer to it. The first concrete case is audio: AudioService produces an `AudioFrame` (level + 16-band spectrum + peak) that [AudioSpectrumEffect](moonmodules/light/effects.md) and the other audio effects consume. It reaches the frame through a static `AudioService::latestFrame()` rather than a boot-time setter, a small variation on the pattern, because an audio effect can be added through the UI *after* boot and must still find the one live mic (a setter only wired the boot instance). The active mic registers itself in `setup()` and clears the pointer in `release()`, so add/remove in any order returns either the live frame or a static silent one, never null. A service that only *displays* its readings (the gyro today) skips the consumer side entirely. ## Multi-device runtime diff --git a/docs/assets/light/effects/AudioVolumeEffect.gif b/docs/assets/light/effects/AudioVolumeEffect.gif deleted file mode 100644 index fdc9303369f47a172ae209678d6934e8d6eea5a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 638076 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
  • 6^2o`_9?X$fC% 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

    L!}2FCa7m_;mFV0L>FNI@cui@6G1x<5MD6P zId%-1M*lBDXeRlKt{1+4h7vABTW%N=0WWF@mkocs06G+z@pF%Mve8wa5o-)4&;TFB zLOFO4`E%2^8c$=^pAv|;EGTgGfZpw}UL#x@tqxqshmulK85(-92tLX_+LEC?pWOei*$(kYqA>s zLL{I8I{&G2^U_|Q-L|V&hOR9g!?JQX@AR#VL6$;?bB*ZTZrq$!1ppH1UKz?04M<9< zuEzoCqToCrekm>njfyl(iESO!NZsi}gmqdP##fvXw`VASQH^?)I%S;QJ&gExY~Dsf z?$jqG5ryf#q*8hr{-)~jDQ7EnY%z=)wEP+hs)-IWnLk&mvCzNPh@=$3^EGPP;VEBQ+d8*cSw?{% zKzTU8ws8bgJhq5yL^6~ras33G9N0+5!9hGFcwMyQPQ^3M8MBxEXW`_DVc?69)O-`4wdc(_(~b9YN1w77#`%9_6q^7NER2_9#~z+9d|o& zv&h^S{gge_l#E;aYo*d63DL#~fHfZMs;QM=$xSe|z~#77w;j7C)t4VX5N}a|8{dG{~X z#1(hds{Slv>a>HyIUu3QI&bwtc{H~M4lgkLrwgP?vet@ma|*WEu6f32nuX#z1Jer9 zY~fs4VZh#_5Rge4e$VEDRLG}x&}=^VS>%^N3EUnMOn-y|w+i-Ex=)!&?8QGF#L@4^ zqOO(~(#rnc#%kBtXdKUYDYzDaF8a17ipefPnR&!^qesSVriiPskR8UsMF+-a8pTI@ zliG3ZX`#!?KhP0o>#;M4K2s7dXV5G{wa&sv$FKA9Hpb_1>f|CZIKtY7YkdLDTdm z{BsNq43lCmk-q7A#;fL9Tibc=LKjKcVy9&IGmUTiHmA+$Y~rCj|3Dqb3(K8Y=FdxW zrBfTU&ldv`L{Vp$BHmqiiU?_?8!pTM7LUnm`+G0~|2HC&s_n4;KVh)+Q4G0wPtc+E zp$yUzVQ^+k4+)Uy%F8u+ysYFMJl75A+O9J_tVmE^kT$f1OMS!=;kC8{Ut$+<~P z-r>avpwu;tUY1ck=>qv+h4TF0PdT*%HMVA+!#QTEb$HY=a}CtdZy{nBIT3S?-Z~5| zViwu7D~}lI9d3=tqJtG~|8~E{$iR!C)_PgKiB-A8kec+XwQo<~q4I6DmIPpnGjOe7 zBHeJx-=Q(^oQ42!UfIhfgx~WM2a@9Lf)5NkzN;vRh&mEK?(E~njm)IpaAJCVUX#6T z!T{66l9q}mXwcS}0=*%rE+3?AuuU5s3mA(8aKGkrx(r=0lX zj}}ZG`kJ$<7ITX2Bb6-*$kQmVn^P6(77(gx^?*_4WD4c@YHc@-DkYRb1|8B*|Halp zgIk7NiP@=<+~18aoB06WDq_$MN@AzaIDSdktDGJlNu;bV@d~lImLx=uq@4QX&q3`~ zuu7?kRd_z_UvXq`h6U~EZ?#d{^0d7m_z2eAFHXxXHG#FgaEs2$?Run9qS1uK3qs zyJdy&#F4o1Dk=pA#^HI_<*aOp!ISzcZC2TS zxKv>qSG7}N;SxVP``-=WO*EL`e5J3%;g;PSWC(C?Lb)3!MEJzSBqa6@9#b~Q$9D#) z`Q(CV=`TO#simVqdyR{bp8ifR43TV0K*K&~sG_z6OzF0~Vt}yy%O4j6it2{jKR*H$ z;YII9+e`8_kEpfPpknLW|Wa1@(^1el;5_UR`%qWxOY)?eCAi zC$&48>ta!+elyGw^lwi64gt#{{zPgxb`!NsSD||FES-=n$SR}XI5e%b&WJ1nD8IR8 z^!LSV*ZjVBTHH-E7XON2E(HjK2%?;TITI}u3<+70>KMrxE;6>>vnP1+D_Ei-52h+T z@$>7)t3PW!!Y)6tb+~UfOoIkJjwnY@=X=erpSfsR_wUhy3y9tM`&nx@*mo~rbI1sY zY&-os%Qyb5^1cWxxPGr($x}*!1@NhFSH6AY3$U6;o!KZZ+h!5yfRt1=^tq4&?)utp zJXs30@6G6sZkpO2OoxSEDGzF~!`_~3M#(HSi7$~98#hFtKG8KcF7KC7UIXusL^iEM|c~J z`tJ9;;}fakRU7kl+C$j&PS@?bL8gElQ_IEMdhN z0L69u^3*lv=6^e_-mql}!&J)DSRNq?aWQ(fH?u``781_NiA*C%=`2ONC6BdinwFMQ zmX-l)T#lY)F`;cQk{?%Lf=RXp|9lh%*@3e1IYr+0CbHk{%U6oNw+YK-g|!aH8wgp= z+mg%UwmOf?EtWnr>R*a@fY0{gNoRxbERk8?{rSyD{pMNp)xo4Lu{M#6xaRW>thtQjbKAf zMn<|Lv7C0yG%CKZ@>LD%>SC;NBkk# z{ap6A{5ISTcFnj^cvP93-Z_N-PqW8}nK@~D5S$d!NnRTQ3V`5coM=!?IKxP=O&SY1a^mcDTPetN-tG|%K)!}m+}4quCZ zhI~Itg@qnTJe+{St!A2gSQ?#F==X~a*;%ZO)QzuKTvOa=oE_?K9G*ny|`#&)?B}FgSl7 zh9OJhJ}T$`So-aFSR&OGQ=l-7b&}&qYUNx0EZiepHm>baymxuMdI#4yNJRWHI6@}W za$O44%_qNFV2X(6j%|n2{YIvjSg%~d-5OF@Qgv2-@_0%8S#ezRwGKH7-F`GM3}*YA zylFn`XFHwlEk_r$cjg1@k8|%|N56u1D4?cX)LX^|ckevLzuhJsApKld@!+Y>Et6pU%Y<&&YTWfrOP7Q(ssO?w9 zFA#BBT*jL?U>MD6ZPG}v(Z=505Ou??W0{G~S2*ZCiD4DbH^BYv2?vzvWy+Gm?76^& zZ}qGzb=V%%Z3I1s|90&H`smvwfq&otj_Z1Fu!j34|F0I1*5qGL?Mfq7n+L^hI%;a0 z6Lvbgs~^T{-`6!uQs@TH4`<%_2gdv`nHoSKW6^n5-u_NIrvcG6GJ9GKej&Gon>g1& z^0|W;XbL%Zs9%ITF!&0sxLiUH*T8?DS1@-h0I~#fVeR_n1kMpTAr-K%{z1m@wABcS z!H6W{fAO_EmWt2zAQj~CE_46gICg`m%KTVxXR}kf|3;=ELFX(EQ)Pc>1DapzvR~)- z#VDwuj#)oJj^pz~JJ*WC9P;ly1WWVNca73LP3u|uPlj#yn8-%=tISRNAB%ECV>NzD z-^5g{!e@&>7GTGwyYezfP!2x$d#_3@6LeF@9&i)ZWXjQCn9~d?K5$0%w)7T&YWcJJ z^mSvTxIs6wl5rJws{8BH+vL{%kD^!0rnmS7SY3)Ozx=!9w!Sm#RAMCpr`{hr$iJbp zpnK!Tq(^Ziw%~m}D2L&jQU%?XW?!09g|Kg4_N8Ag8x4s+gsc`X?B8flchNRJa37uJO@TMsox)aHr{tHH$Fz* zHaM&+tFzuQ?BWXWdVyow9_PW9g_SxU`#psc6=?Nny!4ZoOR%#VSyqf2k5o z3j}UOhR_iS?QMDif;9WZN^e*c>Dwv27gRtPmlB#+T9)aZWgGXcF+iy#LlkT8hSK@D9 z7f((h_Eb)rN#U>RBp&R~8}1p&-tttR@?IHV=qBN?TbJL8LNdyrz^SO zN=BlMpU=nBXS0HcQB7mk68+`f9?+<+@`gkBiphW9tVj3_M&;I}iml{=yD4nT6hGs4 z=c==+-}kjUuCX-VtE&l?PA}idKie493s1Txu$Mn*8Oo8k$!z};F=AnX4r67=H(jXA z*>7X%=lifBVX?BUdA$

    2)j${w;ds1SyrXTS9+blAb9wmDZ*Q@kSuoT*$O_uqT`?vk+@R-~=iBl?$`L5ZrGGz;MX*ce;TR)^iUcf$>OT3Rc zbJj-f!CrrTM)37~D+ZttKGZ=_DpUGpO#Uw2y6Ld}N?s&Ntb@Td8AWqSi^w-k2_VfZ zTW=9k5$M@#gfVZnf@Fk1;3AT+7-c_uaSX*$3bb8#S}X)S`)%0Z>X9mAQXr-jDTaHF zR>%iW^u~s2p-9|plN)%&nM4=lYpYgYdwq`s2duyvJc4?KQDW)}lFq^NO#qoaoFIQP|^1-d?zR!@Z<>Z{jYvW2@Y+S|(m;1Ywv z7b;m+Yn_ieFUQC-{aXZ>*Iy@EJAgxf$|$qB*?LJfyPVySVZ8VqW;w0MfhzSQUpS)4 zB01H8`UY9wRsD48U|l|5gjzzkjjOg{A>%-{;r$ogLXT-$D4reG7tKO99~8wQDA=Cp zVb*($Ex5+(EqXPcor8$*5V{j!7Rfb#D(h~cpL z7L-1)3j9Ct|DudO!;th(u$9M*+jERdp`alnn#+m@8Hp)x z>d^V*^%hwuHO00EXkY5aw<$Kyz%%1V=%ZvnQ%7+!Xb(yQY1m*Cr9n|Q5*?uG4XGL( zZT(24zPQ-X1QWJm0=H6JDkyu@(5!c*f74nf8s756tVQqJ`2n7GYxP)cQVGZ%UiT&P zom>Ft1`o7;v1)xS!|BSNo<6h>S7E%?iIlE4&|av#?=C6IX!4r~tHYGh=W`Ocd7cw? zGH)DW^)X-extxYwF6M`?{nBOxWp2_~#r`nE&kO1#y1wlSxLV>*75s7x-KV+X3^q?9EbEEpr2m-^GS^8JE`+itd)d|0XWA!77N=FUa&K4fpXZzRW3q2lu z^5vV0?&F^Pi+1_3g=)dJhIZ>q4^flGkFHL`?`4U1M(|d-v?$*njwPh^+aesfN5sX2Ga*+Uo zcojr<8Z9r-f%OVnz~}M&0m=VkB$W--hXNGz1NF^BiIy)H?CEq_R4& z4n1Anu(f=*&Z|}AIDU&1EhRW!VG6Qmj972A^1Vr>z|Xk%g`O!0zrN|mqv|E^NHEDS zbdf-(8Lb-uQ`^SyCQ3vZeK+rII`j^z?)1RLByhGzerYNP9I#v%WP($0_xp}l-J)Uu zAzC$QdZ9+@L&wY?cd{43RPJ-`MCH*GHAt?nX#V$^TJpvY$5icQ!&agl8{f8>F3jf^lSz%DIrHgR(qnSPpfO{ z!QI|oe-h2ts|AlKw}*Jze{zb#O{I?0cYoLGYf}>Um#H`lPt(<1g1^X0kN0n0 zB|FM%24E$ih+aYD%vX5*W+lrysFTW<7D>h8<#OW-@s4%rE$6>XY)B>_Irw)(E*0Qh zzu~Z#;jN};cFfCP!z3Zzw=M*d4E-ki`>tVfG=s!OwrvqCQ;)(@_6tUTqOG{D$7D7n z5@!1WdsL-jW37&F&=`w4YNkv%FvKwtMIthi{3%3*H90LOr^r}=%L8dPB6s$HRL8KE z6FE!IGpn4a8}o8Z(GHTy=fcT8dMztA8>L^XgWN$^Gc|MXtFm8XQ)#`KjHE>d&M}2z zR_0O5>Z)sFgwL*062A3`LAitsq)25zJ91g z4-KX}mjh3iFw=)tAd~kVVdB!;069{K&YWYE=NGg|hX-hbui*K9=lnvD>vAHu1h)9L z8+#_{ZlpE&FKr@&OtHDS4J8v&v>>Xi3shplu=7yyb#NB;rN{egE4;zFUqQv!@;d60 zLLVm?2OR+Mibq9PqwBQUw7^x*Gj)ss_F%ZJAbecF&zLo^4G)4#OTf?XT7&3PqX_w%Kr+B(?A^nXt=EoPO_PtC&?e^KS>#+oL9WzC zipUX6{%9*rr5KC*Hd;Vtdpf(p2O~qNGWf0G?{HKxf}-SC?aeL75y?byGgJ~~+k-O1=esXTceof$p$GeKHLUCac>)Yz!q7S#GMUjr7*8|FsL^Sej z=D%mUR5H)`V#P&kF`@2(nDec~^(J>pY=Yxc+)l`mGtHQUmn5@*VR6h0k9&DHosD_K z((RPJR$%{t081o0v;G;W>kB>D(@hgcJ`rA#Q*_bAY+P66r*b1OKwGA1Bu~(@0Mcew zwPMq&mpLe;sZN0GQ$4wYv)*sPpgiaGS`BqMI&|}jY9);7PUE+HqH>(<{M4Y+XNGs( zsY8}-bVMTAU0|i1uQlb+M=T^Kew@tjale0bS++T(V(Mh+1L8xf1vL@kgQthlzdRo$80sYg?*5?fRYLsYF)O^iu{gPR4q(6FFL z&Pec1j;jsY-A{XZ6N7r4$YEw&6#Rq2O^oo`|NagC$M0v#Jn|{-Q~>yt?rwK7ds%#J zKf<&o4KOsgkk2GQ!5%mD!W|Xy#Q-NeubgK5@2%SPz7#@lNn9t)%*w6Csv-9%HZSDoisPqxjZ@?kC#?i5o`W{brP zLUtST)rZRG7wl$CwZ|#6)Xboa%W18<2=VR~?&ts>v`%egvs>#-&je2Y{imyHSTbWX zcS@gr^sUbT1DMucU7u879VK#JTl;5gCBngE#ZdbBJZNUW>gu1kgLXSMJH4>?Q%^wG zJ0$hKY-*9>xbU*;@BO>ZgZHxoco8q-9$Va#x;#%v7{Rv)DRD<}=}GMNafkocE}$s5 z0MBM!Fa*0AAR|YbB5^E#Jnc2KDctR)PFm)y8!a9_=3ayVKRlrkJ6%?lvR3Zf+f!d} z7z>t!hkSVxr>!wnFAqD*S-9Qp%2cXWkICH6+HAGK3zzSSI{4_J#zL2Fa1lcXip`i6 zF=?_|`ZSd7?R+UdLf`6^F34`$Drl3I4wh^iCj&nk9Pd{!a|1k~i`J`~7)on@!5$?{ z1#>z9#!v2!SLNEL$P{F`Ly);^<^0{-vcPcr==>9v0Vnr|pqj?R;im@K-q zw<;tpHX@Gx%i%l6pKjQnSn0%8MmF5)u<%vBp5_+$_<*KIXE!{RgV?4e5h!n$7!mT< zS?7Nqq>cum4WL%~<)+8I{+|(ZHr{;2X4`A0%nxa(y+7rA%TCN(xSAg_$)7 zP9V?eR&MU;d9fMI;PDjNR`?~)1%!Zt*8?GXD%sSt-x%Et>%z@>yz&4d$$(aN6#aPs zpN39FR=>wTBWv=&op{s18U>;yTR(bS=V3>@;lmdY_q`miy{SI4uISo+fT1hy27kO} z4OJX;UtyhuLPKs9Xy6nBM#)TQ*~MWfKoDg!m>Pn@y9J_K19V8|-9BDk%8SBXHSk#( znYgfvHd?;l_VicJa>YJ<8=HMgI)iG<3ec}W-Qc03(Vf*o$qlQ1VRe>HIVRU+$^==NZFqb))*@&sC(+IOV!M)Vmvw%P2s zVAdG2{|wh?aq2>$857@j+I|tRw(s3#jiF1s6{V8W?@5*#e!=;k1WW)keT^Lp5&q%z z5?Ya+o@PRdv73)nNDxGeeup&u93^@5yfmG#XLoC9A~KvEy%&br{!^Iy!c7Dq#yBBL z?-J_<5pJr+(8&qo%1lfNH#RcCpjtb_QS>GAuD9l61jn9NJH+FlC`B;WC7;V{ywD(1 zxC|-oG1#Io5uv5+)xhy#k1r*9ahcJa-W}9(dOvscq)vG;cRUWMK!&takG-D+{a3F}PBfdQUk>q6f z?yZm?O1>Z{WJQ7!DPT&SK(R{$gYVLR^~oW?klO1lqt_mxjtYmTs!psP2lxE7Gfd@1 z-#+rFqCT^i2Ai>SrQ=BCMlZky-~Q&HHjVA`oei3i{NF6b736jp3)=sb&G>{x3SeUX zhd{@PmoY0c2~MR9o8_{+wG!#oEn1roZwDsIC-7lGA%;1BA3ar}@6uc+d5>zQE%eXj zP~cwuujt%93a%Y!1q4b4Eyv> zb(d1)?Cz2b$?hI;2PgzIuT*O1J9QcPeWWawFU;DlU;bRLgAN8_*BqgMSyk3m)>gTC z>ABfiW^7s2juN@F4D84n$v}$vLMRsslzm*_yf<OJEmx+&X1$cbnY zuSK(jnNutaW=~eLjdZn3WsseKUZ#Lr-{D+dmiqzatCxWcU?oXTv+Cg)+Bj}UN?(Xm zSUNZlU=9wU9-9lZa-|l!D$_~r?f}9I={(-tlaxnf2>W_#ZY0!`^S9P}xP4qb3wzqU zbiXh8GgAUb%YLDV1z|lruh)B28njhVXHrKw zzQ04WydNWY8keW;MfB^H_4DoDU%cd11xP!~X`~+5S1<&l;Z<}#uM;5XPe`6wlIc0J z9Z`08-pZN!sp9!k#&0y^o{mX(d3QQqB>ZNRPw&#AS(~I%8z+bYZ zJvjTR{?1`7cUJ36%>G+U>!VFCmEq@3S>pOG@@v8dW=zRzqY1~!{W)GUZqe{)wYC(h zt+H%*>|6c&^_i*<+EOZT1i}!HNlT5&y9~jYb?(!ClQ!3Joe^jW_~#Na@wmPfqXegE zWi@|On1=ScbTZV#wA|1pU8n&Yyj5t){E?g6p{c*2la*V%RH~d6sMC9;FgHpPW?F|L z%B#31dgW~ZuV`R%gdZsC5RM8{aPI=2thm6*qjwe_Jdzj71-%9FaB$aYDPq{u|NQ3$ zO-}2#?Wcr=B9YxPZzgN%8b3wWlrb394RibcM)h6ktL9RheJ7Z<0x)vz8FFxvB1cd( z-X!iCVUr4(9@;lEm$sEZ|9kn6!>_RsjT9k7yJLLi1`3b?Y915&r}+lX7DzmL zO}IuXcECyf;kXhjT(8?6*IGH~_Ug(SEQ%KojoQ@&5T|>NouLjOy_3V|{H@dvZN2Iq z+PlIEorMtKPxuh_+Fy_2-n4w%*IF}usPMYK`A3QIt|pIMG(I`sByxTl1-}TIUSH*| zc^DoH^NClVJg3X7RLvbiKhb5f*W;t7QT+}dn>aoOSN*e1=hZqes>W#1Wpa~@NM7@!*9NCVBfEVyOI9|e1Pdw(yzZda-%F&c|tW$9ktaaS^jA6|P81&(2P z9!>1z9pDUV>n^1QPckoq0{@m*s;Bs;MY@?`C@h;6i;t{Kfx0(Q1P_lSt_pYUqwC2r zL#g;yEW$G|N+OD*+LzLrzJFokguQ6`j@ITEvB zCDPqT>=+4`v+17qgpuocwyGv1aLi5cUDjo8a-mUfsiNKze|y(b*vG?X%E-audYqeL z!F;})0#bPGwL0~_H^QSzM<-!@k<0TT{Q46RiRtEh9Y1L5-Q4fpL6v6`{6t|`U21J_ z>eM2hQUooln(iI6o7KSkTnWxnt@8_%va``Dm5SeS6jOTSWH1{i#4EEJS3X76U{8Jq z2r46KnFYKaDvg_qZUGpOoJPjkL+EWKu<*lUH%%xPd)crsuf2XFX7(=%| zdP1EVDM`kzUcuxsv>~+PLGBX|*MW}%$a-DEk89aVha~u!6z4cJPX~^qhRp@jiDrDx z@5dSDu&T{5#WY0K->bE|b{Q4V9}(z6_b6XgPiZqHSfo@X^Qf)X z(P>V)83tVw>8MA0OE3n~)v#O+x?Mm1?i^$o0l8N!p0BZV?};nYd7~8Oc2Qg(Oal)H z9<4h3Y*Bw`ii!(PJyGG0i}o1H`S`yy)7#jfQBjJ&?_7FF`9dG6BFflq<5u%t4^NhD z2Xo@{6#l1I+Tggulx zAS%P<*@+~x*U@=4#);u>tl?OqTp2wyI#@qZ(J!B+jHb%q{}40%|0-qv51ZQXV+mp4 z^LSKrW)(~?aifp_C{|JgiI!mmyo8;$L7Gn#_BEA)GK&lb2t!DVb+smm5YlVp&lso` zMadFnOk?yTbZurc@y`|2ClcEdD1y;IEh$nrJ>W+~WsE0LPN1Qv!T=?U|G8)+5>Dz{ xfp8FF#HMkx@ktYZe8Bu7Uj3ZF{ns}@Lr6K=(H=U|=6^;YWF!>Ct3-{0{}&hQF3JD^ diff --git a/docs/backlog/backlog-core.md b/docs/backlog/backlog-core.md index 882da853..d7356d09 100644 --- a/docs/backlog/backlog-core.md +++ b/docs/backlog/backlog-core.md @@ -128,7 +128,7 @@ declared rather than for a buffer to fill, and to time out on stall rather than RISC-V coprocessor-context save on INTERRUPT ENTRY. That is a symptom of something faulting inside an ISR context rather than a bug in the kernel itself, and the P4 is the only RISC-V target with a coprocessor, which is why no other board shows it. The prior art at - [Plan-20260718](../history/plans/archive/Plan-20260718%20-%20MoonI80%20lapping-v2%20clock-oracle%20ring%20(shipped).md) + `Plan-20260718 - MoonI80 lapping-v2 clock-oracle ring` (in the plans archive) is a DIFFERENT cause with the same panic name (an ISR reading PSRAM while a flash write disabled the cache, fixed with a `spi_flash_cache_enabled()` defer guard) and is worth re-reading first: the same shape on another ISR would present exactly like this. @@ -153,7 +153,7 @@ DevicesModule discovers via **passive UDP presence** (UDP 65506) feeding a [`Dev - **Live peer state** β€” a discovered peer's brightness / on-off shown in our list, refreshed by polling its REST `/json` after discovery gives the IP (discovery = UDP/mDNS, state = REST). The read-side complement to the command half. - **Non-IP transports (board-gated, far future)** β€” Tasmota-MQTT / zigbee2mqtt need an MQTT client; **direct Zigbee/Thread** (S31/C6/H2 802.15.4 radio) makes projectMM the *hub itself*, driving bulbs over the mesh with no gateway β€” the standout differentiator, the biggest lift. Same plugin philosophy, a transport addition + board gate. -Full design + the reasoned transport split: [Plan-20260629 β€” UDP device discovery + mDNS advertise-only (shipped)](../history/plans/archive/Plan-20260629%20-%20UDP%20device%20discovery%20%2B%20mDNS%20advertise-only%20%28shipped%29.md). +Full design + the reasoned transport split: `Plan-20260629 - UDP device discovery + mDNS advertise-only` (in the plans archive). ## MoonBase follow-ups @@ -1073,14 +1073,20 @@ They are **not** CI failures (CI is Debug) and each one inspected so far is a fa Not done with the multi-destination/tab-UI merge because 17 warnings across four core files is its own change, not a tail on someone else's. -## MoonLive core/platform layering + JIT sdkconfig scoping (CodeRabbit #29, 4 findings) +## MoonLive core/platform layering + JIT sdkconfig scoping (CodeRabbit #29, 3 findings left) -Four 🟠 Major boundary findings from the PR #29 review are real but each is its own scoped change, not a tail on the ring branch. The Critical sibling (a `cpl<3` overflow guard in the MoonLive effect's `tick`) landed with the branch it was found on; these four are backlogged: +Four 🟠 Major boundary findings from the PR #29 review are real but each is its own scoped change, not a tail on the ring branch. The Critical sibling (a `cpl<3` overflow guard in the MoonLive effect's `tick`) landed with the branch it was found on. + +**One of the four is CLOSED (2026-09-07):** the scenario now uses `PreviewDriver`, the in-process +sink, instead of `NetworkSendDriver`. Its `tick_us` half was reviewed and DISMISSED rather than +fixed: a `measure` step asserts nothing, it records, and that recording is what feeds repo-health's +per-commit performance trend. A reviewer reading the file could not see that; deleting the +baselines would have blinded the trend to fix nothing. Recorded here so it is not re-raised. + +The three that remain: - **Core includes platform, compiled core in `mm_core`.** `src/core/moonlive/MoonLive.cpp` `#include`s `platform/platform.h` and calls the exec-memory API directly, and the root `CMakeLists.txt` compiles `MoonLive.cpp`/`MoonLiveCompiler.cpp` into `mm_core` and links `mm_core β†’ mm_platform` β€” violating the header-only-core / no-platform-includes contract both files declare. The runtime exec-memory placement layer wants a core-neutral injected interface (or to move out of `src/core`), so the compiled/platform-dependent surface sits behind `mm_platform` and `mm_core` stays INTERFACE-only. These two are one change (same boundary). - **W^X disabled in the board default.** `esp32/sdkconfig.defaults.esp32s3-n16r8` turns off `CONFIG_ESP_SYSTEM_MEMPROT_FEATURE` and enables `CONFIG_HEAP_HAS_EXEC_HEAP` for *every* build on that board, even with no MoonLive effect installed. The JIT genuinely needs a writable-then-executable heap, but that belongs in a dedicated MoonLive/JIT opt-in overlay or an explicit build profile, not the board default β€” so a stock build keeps memory protection on. -- **A scenario rides timing + network.** `test/scenarios/light/scenario_modifier_chain.json` carries `tick_us` baselines (host-performance dependent) and routes a modifier-chain-composition test through `NetworkSendDriver` (pulls network-path behavior into a test that is not about the network). It wants an in-process sink and structural assertions so it stays hermetic, per the `test/**` "no timing or network dependence" rule. - ## MoonI80 prime-only ring: no stall backstop (sibling-path gap) **Found:** πŸ‘Ύ Reviewer, pre-commit on the whole-frame stall fix (2026-07-22). @@ -1342,7 +1348,7 @@ Lower risk than the RGMII case (six pins rather than twelve, and nothing of ours ## Input transports: foot pedals, USB game controllers, and MoonLive at the pins (2026-09-01) -`ButtonService` shipped with the [GPIO seam](../history/plans/Plan-20260901%20-%20Input%20services%20and%20the%20GPIO%20seam.md) +`ButtonService` shipped with the [GPIO seam](../history/plans/Plan-20260901%20-%20Input%20mapping%20and%20scripted%20sensors.md) (`gpioInputBegin` / `gpioRead` / `gpioWrite`). It names a target as `Module.control` and writes it through `Scheduler::setControl`, so a press and an OSC message are indistinguishable downstream. Three follow-ups build on that seam rather than beside it. diff --git a/docs/backlog/backlog-light.md b/docs/backlog/backlog-light.md index f096df52..d7ba0ce0 100644 --- a/docs/backlog/backlog-light.md +++ b/docs/backlog/backlog-light.md @@ -368,7 +368,7 @@ So the fix is scoped to the preview, and the open question is where travel is de fixture someone plugged in. The leanest thing that stops the lie. - **The light preset** β€” correct once two different heads run at once, but a preset is a *channel-role* layout today, and carrying physical travel widens what a preset means. Belongs - with the [fixture model](#fixture-model--moving-heads-beams-long-term), not before it. + with the [fixture model](#fixture-model-moving-heads-beams-long-term), not before it. **Positioning is 8-bit while the fixture offers 16.** The bench head has a fine channel for each axis ([light fixtures reference](../reference/light-fixtures.md)); both sit unused, so pan resolves @@ -450,7 +450,7 @@ writes are sequential: for each output row, walk its source row once and emit `s each light's colour, then `memcpy` that finished row to the remaining `scale - 1` rows of the block. Same output, one pass through the destination in address order. -### Sprite follow-ups (draw::sprite + FlyingToasters shipped; [spec + plan](../history/plans/Plan-20260827%20-%20Sprites%20and%20flying%20toasters.md)) +### Sprite follow-ups (draw::sprite + FlyingToasters shipped; spec + plan in the plans archive) Deliberately deferred when sprites landed: P4 PPA acceleration behind the same `draw::sprite` signature (the 2D-DMA blitter the WLED-MM-P4 world uses via LovyanGFX; ours would sit in the @@ -826,3 +826,27 @@ The LED-driver increments **shipped**: increment 1 (RMT/WS2812B single-strand on I2S0 first. (The shared lane-driver scaffolding extraction β€” when a 3rd parallel backend lands β€” is tracked separately under [Β§ Extract shared lane-driver scaffolding](#extract-shared-lane-driver-scaffolding-when-the-3rd-parallel-backend-lands-deferred) above.) + +## Downloading a scripted palette can repoint the active one (2026-09-06) + +Found while testing the palette-download fixes. A `.mlp` that sorts BEFORE an already-installed one +silently changes what the current selection points at: with `fire.mlp` active at index 60, +downloading `beat-flash.mlp` re-sorts the scripted tail and index 60 becomes `beat-flash.mlp`. The +stored value never moved; what it means did. + +[Palette.h](../../src/light/Palette.h) already reasons about exactly this and solves half of it. A +palette selection is an index: it persists, it rides `seg[0].pal` over the WLED API, and Home +Assistant renders `paletteNames` positionally, so scripted palettes sort AFTER the built-ins and the +sixty built-in indices are fixed forever. What is not solved is the scripted tail among itself, and +that tail now grows at runtime, which is what the download path made reachable. + +Nobody has reported it, and the blast radius is small: a rig with one scripted palette cannot hit it, +and the value re-reads correctly the moment the user picks again. It matters most where a preset or +an MQTT/HA automation stores the index and replays it later, which is the case where nobody is +watching the LEDs when it changes. + +**What it would take:** persist the scripted palette by NAME alongside the index and re-resolve the +index on load, so a stored selection survives a re-sort. `paletteScript` already holds the resolved +file name for the editor, so the value exists; what is missing is using it as the authority when the +list changes. The alternative, appending new scripts rather than sorting them, keeps indices stable +but makes the picker unreadable as the list grows, which is the trade the sort was chosen over. diff --git a/docs/backlog/generative-fields-analysis-bottom-up.md b/docs/backlog/generative-fields-analysis-bottom-up.md index 777ebdc2..c8296656 100644 --- a/docs/backlog/generative-fields-analysis-bottom-up.md +++ b/docs/backlog/generative-fields-analysis-bottom-up.md @@ -156,7 +156,7 @@ Against Part 1's blocks, measured on this tree: | Particles | pool, gravity, drag, bounce, collide, splat render | βœ… | | Stored-field simulation | none | ⬜ (out of scope unless the top-down wants fluid) | -The persistence contract advection needs already exists: the Layer does not clear between frames, and "a read-prior effect reads last frame's pixels via `draw::get` / `draw::blur`; the persistence *is* its state" ([architecture.md Β§ Buffer persistence](../architecture.md#buffer-persistence--the-layer-does-not-clear-each-frame)). What is missing is the resampler and the bit depth. +The persistence contract advection needs already exists: the Layer does not clear between frames, and "a read-prior effect reads last frame's pixels via `draw::get` / `draw::blur`; the persistence *is* its state" ([architecture.md Β§ Buffer persistence](../architecture.md#buffer-persistence-the-layer-does-not-clear-each-frame)). What is missing is the resampler and the bit depth. `PolarNoiseEffect` is the Part 1 shader already: polar addressing, `warp8` in polar space (the angle warped by noise), `kaleido`, a palette, with `octaves` and `warp` exposed as the cost knobs and the header stating the cost ("~4 samples/pixel at octaves=2 … on a large wall drop `octaves` to 1"). @@ -194,7 +194,7 @@ What each shipped target brings, from the IDF SoC capability headers and our own | desktop | GHz class | double and single | NEON / SSE / AVX | unbounded | 20-40Γ— an S3 per core, plus SIMD ([performance.md](../performance.md), the `collide` measurement) | | Teensy 4.x (Cortex-M7), a future target | 1 Γ— 600 MHz | single and double | none (DSP instructions) | 1 MB internal, no PSRAM | not measured; listed in [architecture.md Β§ Scaling to available memory](../architecture.md#scaling-to-available-memory) as a supported class | -**Can the FPU help?** Every target has one, so a float kernel is legal everywhere, and the repo already has the precedent: `raymarch.h` is compiled only where the SoC declares an FPU, as "the one bounded exception to the integer-only render path", while `shader.h` stays fixed point and runs everywhere ([power-functions.md Β§ Raymarching](../moonmodules/light/power-functions.md#raymarching--one-technique-inside-a-shader)). The honest expectation: on these cores a float multiply costs about what an integer multiply costs, so an FPU does not make a noise sample cheaper; it makes square roots, arctangents and trig cheap enough to skip the tables, and it lets a float reference algorithm run unconverted where an exact fixed-point port is not worth writing yet. The portable contract stays fixed point; the FPU is a per-target acceleration behind it, per the standing decision. +**Can the FPU help?** Every target has one, so a float kernel is legal everywhere, and the repo already has the precedent: `raymarch.h` is compiled only where the SoC declares an FPU, as "the one bounded exception to the integer-only render path", while `shader.h` stays fixed point and runs everywhere ([power-functions.md Β§ Raymarching](../moonmodules/light/power-functions.md#raymarching-one-technique-inside-a-shader)). The honest expectation: on these cores a float multiply costs about what an integer multiply costs, so an FPU does not make a noise sample cheaper; it makes square roots, arctangents and trig cheap enough to skip the tables, and it lets a float reference algorithm run unconverted where an exact fixed-point port is not worth writing yet. The portable contract stays fixed point; the FPU is a per-target acceleration behind it, per the standing decision. **Where the family shines on an MCU.** The S3 is the baseline this document measures against because it is the bench board with numbers, not because it is the target. The P4 is the natural home of the shader half: the highest clock, four-lane SIMD, hardware loops and 32 MB of PSRAM put a 64Β² composition and a 128Β² single-layer field inside its budget, and the S31 sits next to it on every axis. The classic is the portable floor, the target that keeps the contract honest. The top-down should size the showcases for the P4 and S31, keep them running on the S3, and let the classic degrade by the cost knobs. diff --git a/docs/coding-standards.md b/docs/coding-standards.md index 94966a51..0950d313 100644 --- a/docs/coding-standards.md +++ b/docs/coding-standards.md @@ -20,7 +20,17 @@ Decided once; not re-derived per file. - **Consider extending before creating.** When adding a feature, check whether an existing module extends cleanly; a new file is fine if genuinely cleaner, but justify it. - **Do not remove comments** unless they are outdated or factually wrong. Comments document intent and context; removing them silently loses knowledge. - **Reference, don't copy.** Prior art (friend repos, datasheets, our own prototype branches) holds proven approaches: study it, take the ideas, write our own code, never copy or trace the structure. Credits live in the [friend-repo digests](friend-repos/README.md) and per-module prior-art sections. -- **Minimal comments in MoonLive scripts.** A `.mle`/`.mll`/`.mlm` is a user-facing artifact shown in an editor on the device's own card, not a C++ source file: the reader is looking at the effect, and a comment block longer than the code buries it. One or two lines at the top saying what the effect IS, and a short note only where a line would otherwise read as a mistake. Everything else, the reasoning behind a formulation, the measured numbers, the language limits it works around, belongs in the commit message or the roadmap. This is the one place the "do not remove comments" rule above yields: on these files, trim. +- **Minimal comments in MoonLive scripts, in exactly three places.** A `.mle`/`.mll`/`.mlm`/`.mls`/`.mlp` is a user-facing artifact shown in an editor on the device's own card, not a C++ source file: the reader is looking at the effect, and a comment block longer than the code buries it. So the budget is fixed, and it is one line each: + + | where | what it says | + |---|---| + | **one line at the top** | what the script IS, in a phrase a user would recognize | + | **one line after each `addControl`** | what that knob does, from the user's side | + | **one line before each function the script defines itself** | what that helper does, so a reader need not decode it | + + The third is the one to get right as scripts grow helpers: a named function is a promise about what it does, and the line is where that promise is written. Lifecycle functions (`tick`, `defineControls`, `placeLights`, `modifyLogical`, …) need no line: their names are the contract and the reader already knows them. + + Everything else, the reasoning behind a formulation, the measured numbers, the language limits it works around, belongs in the commit message or the roadmap. This is the one place the "do not remove comments" rule above yields: on these files, trim. - **Present-tense litmus.** "There is no MCLK pin" states a property (keep); "no X anymore" narrates a removal (cut it; describe the path that exists). ## Prefer integers, store values in their native shape @@ -198,7 +208,7 @@ Two corollaries. **Reference a module generically** in prose outside its own hom - `light/{effects,modifiers,layouts,drivers,supporting}.md` β€” the light-catalog + light-supporting pages (a type may later split by library into `effects_wled.md` / `effects_moonmodules.md`, still flat). - `core/{services,supporting,ui}.md` β€” the core-services (user-facing modules), core-supporting, and web-UI summary pages. - **The Links column** is assembled by the hook in a fixed order β€” **πŸ§ͺ Tests Β· πŸ“„ Technical Β· attribution Β· βŒ„ details** β€” each with a Material icon (`:material-…:`, rendered as inline SVG by `pymdownx.emoji`, the same mechanism as the tag emoji in the Name column) so a link's *type* is scannable. A card carries these lines: a `[Tests](../../../tests/unit-tests.md#)` line (omitted when the module has no unit test β€” a missing Tests link truthfully means "untested"), a **`Detail: [technical](../moxygen/.md)`** line pointing at the generated technical page, and an `Origin:` attribution line. `check_specs` matches each block to its `.h` via that `moxygen/.md` link, so keep the link's target on it. + **The Links column** is assembled by the hook in a fixed order (**πŸ§ͺ Tests Β· πŸ“„ Technical Β· attribution Β· βŒ„ details**), each with a Material icon (`:material-…:`, rendered as inline SVG by `pymdownx.emoji`, the same mechanism as the tag emoji in the Name column) so a link's *type* is scannable. A card carries these lines: a `[Tests](tests/unit-tests.md#)` line (omitted when the module has no unit test, so a missing Tests link truthfully means "untested"), a **`Detail: [technical](../moxygen/.md)`** line pointing at the generated technical page, and an `Origin:` attribution line. `check_specs` matches each block to its `.h` via that `moxygen/.md` link, so keep the link's target on it. Cross-file design rationale that no single `.h` owns (module interactions, buffer-lifecycle coupling) is a prose section beneath a summary page's table β€” a `## β€” details` section the hook links from the row as `βŒ„ details`. That's the only home for it, so a module needs no page of its own. diff --git a/docs/gettingstarted.md b/docs/gettingstarted.md index 8adcdf3d..8b77a6c4 100644 --- a/docs/gettingstarted.md +++ b/docs/gettingstarted.md @@ -85,7 +85,7 @@ Leave **Release** and **Firmware** at their suggested values (the newest stable build, and the firmware that matches your device). Tick **Erase chip first** only if you're starting clean, switching firmware, or updating a 4 MB classic board (esp32 / wrover / eth) from a release before v4.0. That last update must erase: -its partition layout changed ([MIGRATING](../MIGRATING.md)), and if the device already holds +its partition layout changed ([MIGRATING](MIGRATING.md)), and if the device already holds config you care about, back it up first ("Back up a device's config first" on the installer page): erasing wipes WiFi credentials and all settings, and the backup brings them back after the flash (its report lists anything it could not carry). diff --git a/docs/metrics/repo-health.json b/docs/metrics/repo-health.json index 5b41349e..a0ddf6af 100644 --- a/docs/metrics/repo-health.json +++ b/docs/metrics/repo-health.json @@ -1,10 +1,10 @@ { - "commit": "7f46574a", + "commit": "2f6fb80e", "flash": { - "esp32s3-n16r8": 2065376, - "desktop": 1855496, + "esp32s3-n16r8": 2084720, + "desktop": 1891304, "esp32": 2023776, - "esp32p4rev1-eth": 1955408, + "esp32p4rev1-eth": 1979232, "esp32p4rev1-eth-wifi": 2019392, "esp32s3-n8r8": 1971008, "esp32s31": 2348592, @@ -17,29 +17,29 @@ "esp32-pico": 2071584 }, "measured": { - "esp32p4rev1-eth": "2026-09-06", + "esp32p4rev1-eth": "2026-09-07", "esp32s31": "2026-09-06", "esp32": "2026-09-06", "esp32-pico": "2026-09-06", - "esp32s3-n16r8": "2026-09-06", - "desktop": "2026-09-06" + "esp32s3-n16r8": "2026-09-07", + "desktop": "2026-09-07" }, "perf": { "desktop": { - "tick_us": 137, - "fps": 7299, + "tick_us": 172, + "fps": 5813, "scenario_p50": { "Layer_base_pipeline": { "p50": 71, - "p95": 179, + "p95": 197, "n": 32, - "last": "2026-09-06" + "last": "2026-09-07" }, "Layer_memory_1to1": { "p50": 5, "p95": 40, "n": 32, - "last": "2026-09-06" + "last": "2026-09-07" } } }, @@ -50,10 +50,10 @@ "scenario_matrix": { "MoonModule_control_change": { "desktop-macos": { - "p50": 144, + "p50": 143, "p95": 248, "n": 32, - "last": "2026-09-06" + "last": "2026-09-07" }, "esp32-eth-wifi": { "p50": 89895, @@ -169,7 +169,7 @@ "p50": 26, "p95": 70, "n": 32, - "last": "2026-09-06" + "last": "2026-09-07" }, "desktop-windows": { "p50": 40, @@ -192,18 +192,18 @@ }, "Aurora_fps": { "desktop-macos": { - "p50": 1514, + "p50": 1518, "p95": 1828, - "n": 23, - "last": "2026-09-06" + "n": 26, + "last": "2026-09-07" } }, "Driver_mutation": { "desktop-macos": { - "p50": 21, - "p95": 64, + "p50": 20, + "p95": 88, "n": 32, - "last": "2026-09-06" + "last": "2026-09-07" }, "desktop-windows": { "p50": 42, @@ -226,10 +226,10 @@ }, "Effects_composition": { "desktop-macos": { - "p50": 169, + "p50": 148, "p95": 768, "n": 32, - "last": "2026-09-06" + "last": "2026-09-07" }, "desktop-windows": { "p50": 549, @@ -240,26 +240,26 @@ }, "Fields_polar_lut": { "desktop-macos": { - "p50": 1234, - "p95": 1402, - "n": 24, - "last": "2026-09-06" + "p50": 1239, + "p95": 1686, + "n": 27, + "last": "2026-09-07" } }, "Fluid_solver": { "desktop-macos": { - "p50": 220, - "p95": 249, - "n": 17, - "last": "2026-09-06" + "p50": 222, + "p95": 259, + "n": 20, + "last": "2026-09-07" } }, "GridBlacks_blackpixel": { "desktop-macos": { "p50": 2, - "p95": 12, + "p95": 16, "n": 32, - "last": "2026-09-06" + "last": "2026-09-07" }, "esp32s3-n16r8": { "p50": 267, @@ -285,7 +285,7 @@ "p50": 127, "p95": 311, "n": 32, - "last": "2026-09-06" + "last": "2026-09-07" }, "esp32-eth-wifi": { "p50": 82231, @@ -327,9 +327,9 @@ "Layer_base_pipeline": { "desktop-macos": { "p50": 71, - "p95": 179, + "p95": 197, "n": 32, - "last": "2026-09-06" + "last": "2026-09-07" }, "desktop-windows": { "p50": 118, @@ -343,7 +343,7 @@ "p50": 5, "p95": 40, "n": 32, - "last": "2026-09-06" + "last": "2026-09-07" }, "desktop-windows": { "p50": 1, @@ -354,10 +354,10 @@ }, "Layouts_mutation": { "desktop-macos": { - "p50": 96, + "p50": 97, "p95": 248, "n": 32, - "last": "2026-09-06" + "last": "2026-09-07" }, "desktop-windows": { "p50": 111, @@ -407,9 +407,9 @@ "MoonLiveEffect_livescript": { "desktop-macos": { "p50": 6, - "p95": 22, + "p95": 18, "n": 32, - "last": "2026-09-06" + "last": "2026-09-07" }, "esp32s3-n16r8": { "p50": 8255, @@ -459,7 +459,7 @@ "p50": 6, "p95": 21, "n": 32, - "last": "2026-09-06" + "last": "2026-09-07" }, "desktop-windows": { "p50": 1, @@ -471,9 +471,9 @@ "MultiplyModifier_memory_lut": { "desktop-macos": { "p50": 3, - "p95": 21, + "p95": 19, "n": 32, - "last": "2026-09-06" + "last": "2026-09-07" }, "desktop-windows": { "p50": 3, @@ -487,7 +487,7 @@ "p50": 126, "p95": 283, "n": 32, - "last": "2026-09-06" + "last": "2026-09-07" }, "desktop-windows": { "p50": 225, @@ -498,18 +498,18 @@ }, "Trails_ladder": { "desktop-macos": { - "p50": 355, - "p95": 608, - "n": 18, - "last": "2026-09-06" + "p50": 360, + "p95": 442, + "n": 21, + "last": "2026-09-07" } }, "modifier_chain": { "desktop-macos": { - "p50": 47, - "p95": 123, + "p50": 44, + "p95": 112, "n": 32, - "last": "2026-09-06" + "last": "2026-09-07" }, "desktop-windows": { "p50": 69, @@ -529,7 +529,7 @@ "p50": 24, "p95": 87, "n": 32, - "last": "2026-09-06" + "last": "2026-09-07" }, "esp32-eth": { "p50": 1010, @@ -567,7 +567,7 @@ "p50": 279, "p95": 1114, "n": 32, - "last": "2026-09-06" + "last": "2026-09-07" }, "esp32s3-n16r8": { "p50": 16915, @@ -599,7 +599,7 @@ "p50": 17, "p95": 61, "n": 32, - "last": "2026-09-06" + "last": "2026-09-07" }, "esp32s3-n16r8": { "p50": 2485, @@ -640,10 +640,10 @@ "last": "2026-07-25" }, "desktop-macos": { - "p50": 308, + "p50": 296, "p95": 881, "n": 32, - "last": "2026-09-06" + "last": "2026-09-07" }, "desktop-windows": { "p50": 649, @@ -667,9 +667,9 @@ }, "desktop-macos": { "p50": 4, - "p95": 16, + "p95": 14, "n": 32, - "last": "2026-09-06" + "last": "2026-09-07" }, "esp32p4rev1-eth": { "p50": 217, @@ -693,32 +693,32 @@ } }, "loc": { - "core": 25516, - "light": 34615, + "core": 25626, + "light": 35607, "platform": 18036, - "ui": 10204, - "test": 56361, + "ui": 10213, + "test": 57065, "moondeck": 22570 }, "comments": { "core": { - "lines": 10242, + "lines": 10297, "ratio": 0.434 }, "light": { - "lines": 13197, - "ratio": 0.419 + "lines": 13517, + "ratio": 0.417 }, "platform": { "lines": 6336, "ratio": 0.385 }, "ui": { - "lines": 3014, - "ratio": 0.312 + "lines": 3024, + "ratio": 0.313 }, "test": { - "lines": 10536, + "lines": 10687, "ratio": 0.214 }, "moondeck": { @@ -727,20 +727,20 @@ } }, "tests": { - "cases": 1955, + "cases": 1979, "scenarios": 27 }, "docs": { - "md_files": 219, - "md_lines": 36362, - "plans_files": 115, - "backlog_lines": 6747, + "md_files": 220, + "md_lines": 36733, + "plans_files": 116, + "backlog_lines": 6777, "lessons_lines": 705, "claude_md_lines": 259 }, "complexity": { - "functions": 3441, - "over_threshold": 239, + "functions": 3473, + "over_threshold": 245, "worst_ccn": 108 } } diff --git a/docs/metrics/repo-health.md b/docs/metrics/repo-health.md index 183df585..8ef38cc2 100644 --- a/docs/metrics/repo-health.md +++ b/docs/metrics/repo-health.md @@ -1,6 +1,6 @@ # Repo health -Measured at `7f46574a`. Generated by [`moondeck/check/repo_health.py`](../../moondeck/check/repo_health.py) on every KPI-gate run. **Do not edit by hand.** +Measured at `2f6fb80e`. 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/metrics/repo-health.md`). Nothing here fails a build: the numbers make growth visible, the judgment stays human. @@ -8,19 +8,19 @@ Current state only; the trend is this file's git history (`git log -p docs/metri | Target | Flash | Capacity | Used | Built | |---|---:|---:|---:|:--:| -| desktop | 1,812 KB (+0 KB) ⚠ | - | - | yes | -| esp32 | 1,976 KB (+2 KB) ⚠ | 2,496 KB | 79% | yes | +| desktop | 1,847 KB (+35 KB) ⚠ | - | - | yes | +| esp32 | 1,976 KB | 2,496 KB | 79% | carried 1d | | esp32-16mb | 1,767 KB | - | - | carried (age?) | | esp32-eth | 1,365 KB | - | - | carried (age?) | -| esp32-pico | 2,023 KB (+2 KB) ⚠ | 3,072 KB | 66% | yes | +| esp32-pico | 2,023 KB | 3,072 KB | 66% | carried 1d | | esp32-wrover | 1,801 KB | - | - | carried (age?) | -| esp32p4rev1-eth | 1,910 KB | 4,096 KB | 47% | yes | +| esp32p4rev1-eth | 1,933 KB (+23 KB) ⚠ | 4,096 KB | 47% | yes | | esp32p4rev1-eth-wifi | 1,972 KB | - | - | carried (age?) | | esp32p4rev3-eth | 1,605 KB | - | - | carried (age?) | -| esp32s3-n16r8 | 2,017 KB | 4,096 KB | 49% | yes | +| esp32s3-n16r8 | 2,036 KB (+19 KB) ⚠ | 4,096 KB | 50% | yes | | esp32s3-n8r8 | 1,925 KB | - | - | carried (age?) | | esp32s3-zero | 1,747 KB | - | - | carried (age?) | -| esp32s31 | 2,294 KB | 4,096 KB | 56% | yes | +| esp32s31 | 2,294 KB | 4,096 KB | 56% | carried 1d | | 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. @@ -29,40 +29,40 @@ Current state only; the trend is this file's git history (`git log -p docs/metri | Target | Tick | FPS | |---|---:|---:| -| desktop | 137 Β΅s (βˆ’17 Β΅s) βœ“ | 7,299 (+806) βœ“ | +| desktop | 172 Β΅s (+35 Β΅s) ⚠ | 5,813 (βˆ’1,486) ⚠ | | esp32 | 8,354 Β΅s | 119 | ### Scenario tick by target (p50 of each sample window) | Scenario | desktop-macos | desktop-windows | esp32 | esp32s3-n16r8 | esp32p4rev1-eth | esp32s31 | esp32-eth | esp32-eth-wifi | unknown | |---|---|---|---|---|---|---|---|---|---| -| Audio_mutation | 26 (βˆ’2) βœ“ | 40 ? | 13,152 | 47 ? | - | - | - | - | - | -| Aurora_fps | 1,514 (+8) ⚠ | - | - | - | - | - | - | - | - | -| Driver_mutation | 21 (βˆ’11) βœ“ | 42 ? | 12,812 | 39 ? | - | - | - | - | - | -| Effects_composition | 169 (βˆ’197) βœ“ | 549 ? | - | - | - | - | - | - | - | -| Fields_polar_lut | 1,234 (+6) ⚠ | - | - | - | - | - | - | - | - | -| Fluid_solver | 220 (βˆ’2) βœ“ | - | - | - | - | - | - | - | - | -| GridBlacks_blackpixel | 2 (βˆ’3) βœ“ | 8 ? | 269 ? | 267 ? | - | - | - | - | - | -| GridLayout_resize | 127 (βˆ’1) βœ“ | 219 ? | 1,352 ? | 1,011 ? | 1,143 ? | - | 95,771 ? | 82,231 ? | - | -| Layer_base_pipeline | 71 (βˆ’23) βœ“ | 118 ? | - | - | - | - | - | - | - | -| Layer_memory_1to1 | 5 (βˆ’4) βœ“ | 1 ? | - | - | - | - | - | - | - | -| Layouts_mutation | 96 (βˆ’42) βœ“ | 111 ? | 13,692 | 45 ? | - | - | 27 ? | - | - | +| Audio_mutation | 26 | 40 ? | 13,152 | 47 ? | - | - | - | - | - | +| Aurora_fps | 1,518 (+4) ⚠ | - | - | - | - | - | - | - | - | +| Driver_mutation | 20 (βˆ’1) βœ“ | 42 ? | 12,812 | 39 ? | - | - | - | - | - | +| Effects_composition | 148 (βˆ’21) βœ“ | 549 ? | - | - | - | - | - | - | - | +| Fields_polar_lut | 1,239 (+5) ⚠ | - | - | - | - | - | - | - | - | +| Fluid_solver | 222 (+2) ⚠ | - | - | - | - | - | - | - | - | +| GridBlacks_blackpixel | 2 | 8 ? | 269 ? | 267 ? | - | - | - | - | - | +| GridLayout_resize | 127 | 219 ? | 1,352 ? | 1,011 ? | 1,143 ? | - | 95,771 ? | 82,231 ? | - | +| Layer_base_pipeline | 71 | 118 ? | - | - | - | - | - | - | - | +| Layer_memory_1to1 | 5 | 1 ? | - | - | - | - | - | - | - | +| Layouts_mutation | 97 (+1) ⚠ | 111 ? | 13,692 | 45 ? | - | - | 27 ? | - | - | | MoonLiveEffect_controls | 11 ? | - | 12,901 | 4,624 ? | - | - | - | - | - | -| MoonLiveEffect_livescript | 6 (βˆ’3) βœ“ | - | 13,433 ? | 8,255 ? | 11,336 ? | - | - | - | - | -| MoonLive_pipeline | 6 (βˆ’4) βœ“ | 1 ? | 9,604 ? | 3,278 ? | - | 11,398 ? | - | - | 4,393 ? | -| MoonModule_control_change | 144 (+1) ⚠ | 262 ? | 212 ? | 166 ? | 165 ? | - | 111,731 ? | 89,895 ? | - | +| MoonLiveEffect_livescript | 6 | - | 13,433 ? | 8,255 ? | 11,336 ? | - | - | - | - | +| MoonLive_pipeline | 6 | 1 ? | 9,604 ? | 3,278 ? | - | 11,398 ? | - | - | 4,393 ? | +| MoonModule_control_change | 143 (βˆ’1) βœ“ | 262 ? | 212 ? | 166 ? | 165 ? | - | 111,731 ? | 89,895 ? | - | | MqttModule_haDiscovery_toggle | 3 ? | - | 36 ? | 36 ? | - | - | - | - | - | -| MultiplyModifier_memory_lut | 3 (βˆ’1) βœ“ | 3 ? | - | - | - | - | - | - | - | +| MultiplyModifier_memory_lut | 3 | 3 ? | - | - | - | - | - | - | - | | MultiplyModifier_pipeline | 126 | 225 ? | - | - | - | - | - | - | - | | NetworkModule_eth_reconfigure | - | - | 1,169 ? | 97,843 ? | - | - | - | - | - | | NetworkModule_mdns_toggle | 13 ? | - | 36 ? | 36 ? | 21 ? | - | 109,767 ? | 93,963 ? | - | -| Trails_ladder | 355 (+2) ⚠ | - | - | - | - | - | - | - | - | -| modifier_chain | 47 (βˆ’8) βœ“ | 69 ? | 13,337 | - | - | - | - | - | - | -| modifier_swap | 24 (βˆ’9) βœ“ | 41 ? | 12,250 | 354 ? | 362 ? | - | 1,010 ? | - | - | -| perf_full | 279 (βˆ’150) βœ“ | 592 ? | 10,392 | 16,915 ? | 17,433 ? | - | - | - | - | -| perf_light | 17 (βˆ’10) βœ“ | 35 ? | 2,183 | 2,485 ? | 2,038 ? | - | - | - | - | -| peripheral_grid_sweep | 308 (βˆ’177) βœ“ | 649 ? | 6,991 ? | - | 11,495 ? | 12,273 ? | - | - | - | -| peripheral_switch | 4 (βˆ’3) βœ“ | 9 ? | 437 | 46 ? | 217 ? | - | - | - | - | +| Trails_ladder | 360 (+5) ⚠ | - | - | - | - | - | - | - | - | +| modifier_chain | 44 (βˆ’3) βœ“ | 69 ? | 13,337 | - | - | - | - | - | - | +| modifier_swap | 24 | 41 ? | 12,250 | 354 ? | 362 ? | - | 1,010 ? | - | - | +| perf_full | 279 | 592 ? | 10,392 | 16,915 ? | 17,433 ? | - | - | - | - | +| perf_light | 17 | 35 ? | 2,183 | 2,485 ? | 2,038 ? | - | - | - | - | +| peripheral_grid_sweep | 296 (βˆ’12) βœ“ | 649 ? | 6,991 ? | - | 11,495 ? | 12,273 ? | - | - | - | +| peripheral_switch | 4 | 9 ? | 437 | 46 ? | 217 ? | - | - | - | - | Microseconds. `?` marks a cell backed by fewer than 4 samples, which is a first impression rather than a percentile; several are months old and were captured during a network reconfigure, so they read as whole milliseconds. `-` means that target has never run that scenario. @@ -72,8 +72,8 @@ Microseconds. `?` marks a cell backed by fewer than 4 samples, which is a first | Scenario | p50 | p95 | n | |---|---:|---:|---:| -| Layer_base_pipeline | 71 Β΅s (βˆ’23 Β΅s) βœ“ | 179 Β΅s | 32 | -| Layer_memory_1to1 | 5 Β΅s (βˆ’4 Β΅s) βœ“ | 40 Β΅s | 32 | +| Layer_base_pipeline | 71 Β΅s | 197 Β΅s | 32 | +| Layer_memory_1to1 | 5 Β΅s | 40 Β΅s | 32 | These build a bare pipeline with no optional modules, so a change here is a change in the pipeline itself rather than in what was measured. A new module belongs in an advanced scenario, which keeps its own numbers. @@ -81,36 +81,36 @@ These build a bare pipeline with no optional modules, so a change here is a chan | Area | Lines | Comments | Comment share | |---|---:|---:|---:| -| core | 25,516 (+30) ⚠ | 10,242 | 43.4 % (+0.1 %) ⚠ | -| light | 34,615 (+57) ⚠ | 13,197 | 41.9 % | -| platform | 18,036 (+173) ⚠ | 6,336 | 38.5 % | -| ui | 10,204 | 3,014 | 31.2 % | -| test | 56,361 (+206) ⚠ | 10,536 | 21.4 % | -| moondeck | 22,570 (+7) ⚠ | 3,673 | 18.6 % | +| core | 25,626 (+110) ⚠ | 10,297 | 43.4 % | +| light | 35,607 (+992) ⚠ | 13,517 | 41.7 % (βˆ’0.2 %) βœ“ | +| platform | 18,036 | 6,336 | 38.5 % | +| ui | 10,213 (+9) ⚠ | 3,024 | 31.3 % (+0.1 %) ⚠ | +| test | 57,065 (+704) ⚠ | 10,687 | 21.4 % | +| moondeck | 22,570 | 3,673 | 18.6 % | ## Tests | Kind | Count | |---|---:| -| unit cases | 1,955 (+7) βœ“ | +| unit cases | 1,979 (+24) βœ“ | | scenarios | 27 | ## Complexity | Metric | Value | |---|---:| -| functions | 3,441 (+12) βœ“ | -| over threshold | 239 (+1) ⚠ | +| functions | 3,473 (+32) βœ“ | +| over threshold | 245 (+6) ⚠ | | worst CCN | 108 | ## Documentation | Metric | Value | |---|---:| -| markdown files | 219 | -| markdown lines | 36,362 (βˆ’207) βœ“ | -| plan files | 115 | -| backlog lines | 6,747 (βˆ’232) βœ“ | -| lessons lines | 705 (+27) ⚠ | +| markdown files | 220 (+1) ⚠ | +| markdown lines | 36,733 (+371) ⚠ | +| plan files | 116 (+1) ⚠ | +| backlog lines | 6,777 (+30) ⚠ | +| lessons lines | 705 | | CLAUDE.md lines | 259 | diff --git a/docs/moonmodules/light/MoonLiveLayout.md b/docs/moonmodules/light/MoonLiveLayout.md index 51051490..c2b659c9 100644 --- a/docs/moonmodules/light/MoonLiveLayout.md +++ b/docs/moonmodules/light/MoonLiveLayout.md @@ -65,7 +65,7 @@ A script reads whatever it declares. `byte cols = 16;` is a member the script ow ### Seeing inside a script `print(v)` logs a value and returns it, so it wraps any part of an expression: `addLight(print(x), y, 0)`. -It is for debugging and comes back out again β€” [what print costs](writing-scripts.md#debugging-print). +It is for debugging and comes back out again β€” [what print costs](https://github.com/MoonModules/projectMM/blob/main/moonlive/README.md#debugging-print). ## How the count is known diff --git a/docs/moonmodules/light/MoonLiveModifier.md b/docs/moonmodules/light/MoonLiveModifier.md index 824b8133..d871da47 100644 --- a/docs/moonmodules/light/MoonLiveModifier.md +++ b/docs/moonmodules/light/MoonLiveModifier.md @@ -37,7 +37,7 @@ setXYZ((width - 1 - xPos) * 2, yPos, zPos); // mirror, then stretch ### Seeing inside a script `print(v)` logs a value and returns it, so it wraps any part of an expression: `setXYZ(print(width - 1 - xPos), yPos, zPos)`. -It is for debugging and comes back out again β€” [what print costs](writing-scripts.md#debugging-print). +It is for debugging and comes back out again β€” [what print costs](https://github.com/MoonModules/projectMM/blob/main/moonlive/README.md#debugging-print). ## Limits diff --git a/docs/moonmodules/light/effects.md b/docs/moonmodules/light/effects.md index a0a4c500..a87411d9 100644 --- a/docs/moonmodules/light/effects.md +++ b/docs/moonmodules/light/effects.md @@ -29,7 +29,7 @@ Three emitters feed it: circles on an orbit, a Lissajous point tracing a figure Compare with [Fluid](#fluid): that one solves for pressure and gets vortices forming out of the flow's own history, at roughly twenty passes over the grid against this one's one. Reach for the solver when the medium is the subject, and for this when the subject is the color being carried. -Origin: MoonLight Β· concept by [Stefan Petrick](https://github.com/StefanPetrick), composition by Jeff (mindful_stone / [4wheeljive](https://github.com/4wheeljive)) in [AuroraPortal](https://github.com/4wheeljive/AuroraPortal/blob/main/src/programs/colorTrails_detail.hpp) Β· via [MoonLight](https://github.com/MoonModules/MoonLight/blob/main/src/MoonLight/Nodes/Effects/E_FastLED.h) +Origin: MoonLight Β· concept by [Stefan Petrick](https://github.com/StefanPetrick), composition by Jeff (mindful_stone / [4wheeljive](https://github.com/4wheeljive)) in [FlowFields](https://github.com/4wheeljive/FlowFields/blob/main/src/flows/flow_noise.h) Β· via [MoonLight](https://github.com/MoonModules/MoonLight/blob/main/src/MoonLight/Nodes/Effects/E_FastLED.h) @@ -339,6 +339,49 @@ The sprites carry their own colors (chrome, wing, crust), so the global palette Origin: projectMM original; inspired by After Dark's Flying Toasters (Berkeley Systems, 1989), suggested by Frank ([softhack007](https://github.com/softhack007)): the pixel art here is drawn fresh for this effect + + +### FixedPoint πŸ•πŸ†• Β· 2D + +Shapes placed BETWEEN pixels rather than on them. A clock hand drawn on whole pixels jumps a full +pixel at a time and reads as broken; the same hand placed at a fractional position and antialiased +moves smoothly, because a pixel's brightness carries the fraction its position cannot. + +- `demo`: which figure, or `all` to cycle them. + - **clock**: a rim, twelve tick marks and three hands geared 1:12:144. The hands run on fixed + periods from the clock rather than on `bpm`, accelerated 10x so a second sweeps in 6 seconds. + - **orbits**: four rings circling the center, each breathing on its own oscillator. + - **star web**: a pentagram inside two rings, its stroke pulsing on a third harmonic. + - **spirograph**: a pen on a wheel rolling inside a larger circle. The figure closes because + the rates share a 3:2 ratio. + - **lissajous**: two perpendicular oscillators at 3:2, with the phase creeping so the figure + morphs rather than repeating. + - **cube thin** / **cube thick**: a wireframe cube in perspective, tumbling on two axes. Depth + reads as brightness, and on the thick one as stroke width too. + - **walkers**: six points on a damped random walk, held near the middle by a weak spring. + - **boids**: seven of them on the classic three rules (separation, alignment, cohesion) with + soft walls. The flock's shape is emergent; nothing tells it to form one. + - **hypotrochoid**: the spirograph with the wheel and pen sizes varying, so each visit draws a + different rosette. + - **tree**: a recursive trunk forking six levels deep, swaying on a 9 second wind cycle and + growing on a 10 second one, so it never repeats a pose. +- `bpm`: how fast the orbits and curve figures run. The clock keeps its own periods. +- `fade`: how much of the previous frame survives, which is what leaves the trail. At 255 the + shapes are crisp with no trail. +- `dwell`: seconds each demo holds before `all` moves on (hidden unless `demo` is `all`). +- `drift`: how far the whole scene wanders from the panel's center, in pixels. The original orbits + its origin rather than pinning it; 0 pins it. +- `zoom`: the camera. It pushes in toward the second hand's tip on a 20 second cycle, so the scene + grows and slides off-center at the peak and settles back, which is what makes the clock sweep + across the panel rather than sit still. 0 holds the camera fixed. + +Built on `draw::disc` / `draw::ring` / `draw::strokeLine`, the sub-pixel family in the draw layer; +the effect computes no coverage itself. Concept and the original fixed-point canvas demos: +[Sutaburosu](https://github.com/sutaburosu) in FastLED, via MoonLight, which bundles twelve behind +one control; all eleven are ported here. + +Origin: MoonLight (Sutaburosu) + ### MovingHead πŸ’«πŸŽΆπŸŽ― Β· 1D @@ -365,11 +408,17 @@ an LED strip paints the color pattern and moves nothing. - `panRange` / `tiltRange`: how much of the fixture's travel to use. A head at full pan spends much of its sweep pointing away from the audience, so the default is a band around center. - `panCenter` / `tiltCenter`: where the sweep is centered (128 = the fixture's middle). -- `soundReactive`: move and light with the music: the beam swings wider as the room gets louder, +- `audioReactive`: move and light with the music: the beam swings wider as the room gets louder, each head takes its brightness from its own frequency band so the rig ripples rather than pulsing as one block, and a beat widens the sweep and flares the color with a short decay so a kick is visible rather than a one-frame flicker. Silence holds the rig still, which is what makes it read as reactive rather than merely animated. +- `gobo` / `rotate`: the beam's own wheels, shown only on a rig whose fixtures carry them. Both are + raw fixture bytes rather than a slot count: a gobo channel is a range per pattern and every model + splits it differently, so the fixture's manual is what says which value selects what. +- `goboOnBeat`: roll a new gobo on a bass hit instead of holding one pattern all night, then hold + that pattern for about two seconds. Without the hold a four-to-the-floor kick changes the pattern + four times a second, which reads as a flicker rather than as patterns. A fixture chain is one-dimensional, so lay the rig out as a **1 x N** grid (width 1, height N): extrude duplicates the x=0 column, so N x 1 would copy the first head's aim over every head. @@ -1178,22 +1227,6 @@ Nothing is transported. The effect keeps a short history of band frames and ever Origin: projectMM original, the radial spectrogram on `PolarLut` and the onset detector - - -### AudioVolume πŸ’«πŸŽ΅ - -AudioVolume effect preview - -A whole-grid VU meter: every light pulses with the mic level, color indexing the palette by loudness. - -- `brightness`: overall brightness ceiling for the VU pulse (1–255). - -Origin: projectMM original (VU meter) - -Detail: [technical](moxygen/AudioVolumeEffect.md) - -[Tests](../../tests/unit-tests.md#audioservice) - ### DemoReel πŸ’« Β· 3D diff --git a/docs/moonmodules/light/layouts.md b/docs/moonmodules/light/layouts.md index 0c09f7f7..bc4b7b1a 100644 --- a/docs/moonmodules/light/layouts.md +++ b/docs/moonmodules/light/layouts.md @@ -101,6 +101,7 @@ The classic 241-LED concentric-ring disc: nested rings of 1, 8, 12, 16, 24, 32, - `scale` β€” overall radius scale (1–10). - `outside in`: light 0 on the outer ring, wired inward, instead of at the center wired outward. The direction around each ring is unchanged. +- `angleFirst`: where light 0 of each ring sits, in degrees from the bottom (0-359), the same control [Ring](#ring) has. A disc is soldered with its first LED wherever the builder started, so this turns the image to match the hardware rather than re-wiring it. 0 is the unrotated placement. Origin: MoonLight Β· via [MoonLight](https://github.com/MoonModules/MoonLight/blob/main/src/MoonLight/Nodes/Layouts/L_MoonLight.h) diff --git a/docs/tutorials/generative-effects.md b/docs/tutorials/generative-effects.md index a7f3006c..070fab12 100644 --- a/docs/tutorials/generative-effects.md +++ b/docs/tutorials/generative-effects.md @@ -388,5 +388,5 @@ before trusting it, because a test that passes on both is measuring nothing. ## Where to go next - **[Power functions](../moonmodules/light/power-functions.md)**: the catalog, with what each one costs and who calls it -- **[Writing scripts](../moonmodules/light/writing-scripts.md)**: the MoonLive language reference +- **[Writing scripts](https://github.com/MoonModules/projectMM/blob/main/moonlive/README.md)**: the MoonLive language reference - **[Effects](../moonmodules/light/effects.md)**: every effect in the tree, with its controls diff --git a/moonlive/README.md b/moonlive/README.md index dcbd06fc..2a417f33 100644 --- a/moonlive/README.md +++ b/moonlive/README.md @@ -17,14 +17,16 @@ class CrosshairEffect { void defineControls() { addControl("bpm", bpm, 1, 240); } - void column() { for (int y = 0; y < height; y = y + 1) { setRGB(y * width + scale(beat(bpm, t), width), 255, 40, 0); } } - void tick() { fill(0, 0, 0); column(); } + void column(int cx) { for (int y = 0; y < height; y = y + 1) { setRGB(y * width + cx, 255, 40, 0); } } + void tick() { fill(0, 0, 0); column(scale(beat(bpm, t), width)); } } ``` These are real calls, not pasted-in text: the callee gets its own frame when it runs, which is what -lets one helper call another and lets a function recurse. A function takes no arguments yet, so a -helper is parameterized through the class's members. `effects/crosshair.mle` is the worked example. +lets one helper call another and lets a function recurse. Arguments are passed BY VALUE, so a +function that writes a parameter changes its own copy and the caller's variable is untouched. +`effects/crosshair.mle` is the worked example; `layouts/sixteen-rings.mll` is the one where the +arguments earn their place, calling one helper sixteen times with different coordinates. **A script is C++, and a compiler checks that.** Every shipped script compiles under `c++ -std=c++20 -fsyntax-only` (`test/python/test_scripts_are_cpp.py`), so the language cannot drift @@ -169,6 +171,31 @@ working script looks like. `unit_MoonLiveScripts` compiles every file here, so a script that stops parsing when the language changes fails the build rather than waiting to be pasted into a device. +## Editing a shipped script forks it + +A device keeps two copies of the library. The ones that ship live in `/.moonlive`; anything you edit +on the device is saved to `/moonlive`, and **your copy is the one that runs**. That is what makes an +edit reversible: the original is still there, so the card's delete button becomes a **revert arrow** +(β†Ί) for a script you have changed, and pressing it brings the shipped version back without needing a +network. + +The cost of that arrangement is that your copy also HIDES later updates to the shipped one, so the +card says which case it is in. Its status carries one of: + +| status | what it means | +|---|---| +| (nothing) | the shipped script is running, unedited | +| `edited copy` | your version is running; the shipped one has not changed since you forked it | +| `edited copy, shipped one updated` | your version is running, and **the library has a newer one** | + +The third is the one to act on: revert to take the new version (losing your changes), or keep yours +and ignore it. Nothing is decided for you, and nothing overwrites an edit. + +Two details worth knowing. Opening a shipped script and saving it **without changing anything** +creates no copy, so browsing the library cannot accidentally pin a script at today's version. And +the comparison is against the version you actually forked from, recorded when the fork is made, so +editing your own copy later does not make an outdated fork look current. + ## Debugging: print `print(v)` writes a value to the serial log and returns it, so it wraps any part of an expression diff --git a/moonlive/effects/balls.mle b/moonlive/effects/balls.mle index e1bda640..9d325602 100644 --- a/moonlive/effects/balls.mle +++ b/moonlive/effects/balls.mle @@ -5,11 +5,6 @@ class BallsEffect { byte size = 5; byte bpm = 20; - byte b = 0; // the ball being drawn - byte radius = 4; // that ball's radius in lights - byte px = 0; // its center, across - byte py = 0; // its center, down - int dimensions() { return 2; } string tags() { return "πŸ’«"; } @@ -20,13 +15,13 @@ class BallsEffect { addControl("bpm", bpm, 1, 120); // how fast they travel } - void drawBall() { + // One ball: a filled disc at (px, py), shaded from its center outward. + void drawBall(int px, int py, int radius, int hue) { for (int dy = 0; dy < 21; dy = dy + 1) { for (int dx = 0; dx < 21; dx = dx + 1) { - if ((dx - radius) * (dx - radius) + (dy - radius) * (dy - radius) <= radius * radius) { - setPaletteColor(px + dx, py + dy, b * 64, - 255 - scale(((dx - radius) * (dx - radius) - + (dy - radius) * (dy - radius)) * 640, 256)); + int away = (dx - radius) * (dx - radius) + (dy - radius) * (dy - radius); + if (away <= radius * radius) { + setPaletteColor(px + dx, py + dy, hue, 255 - scale(away * 640, 256)); } } } @@ -35,19 +30,16 @@ class BallsEffect { void tick() { fill(0, 0, 0); - radius = scale(height, size * 819) + 1; + int radius = scale(height, size * 819) + 1; if (width < height) { radius = scale(width, size * 819) + 1; } if (radius > 10) { radius = 10; } if (width < radius * 2 + 2) { radius = 0; } if (height < radius * 2 + 2) { radius = 0; } - for (int i = 0; i < 4; i = i + 1) { - b = i; - if (b < count) { - px = beatsin(bpm + b * 7, t, width - radius * 2 - 1); - py = beatsin(bpm + b * 5 + 3, t, height - radius * 2 - 1); - drawBall(); - } + for (int i = 0; i < count; i = i + 1) { + drawBall(beatsin(bpm + i * 7, t, width - radius * 2 - 1), + beatsin(bpm + i * 5 + 3, t, height - radius * 2 - 1), + radius, i * 64); } } } diff --git a/moonlive/effects/crosshair.mle b/moonlive/effects/crosshair.mle index ad220277..77d2e0a5 100644 --- a/moonlive/effects/crosshair.mle +++ b/moonlive/effects/crosshair.mle @@ -4,9 +4,6 @@ class CrosshairEffect { byte bpm = 30; byte spread = 3; - int cx = 0; // where the sight sits, across - int cy = 0; // where the sight sits, down - int dimensions() { return 2; } string tags() { return "πŸ’«"; } @@ -16,15 +13,18 @@ class CrosshairEffect { addControl("spread", spread, 0, 20); // how thick the lines are } - void column() { + // The vertical line of the sight. + void column(int cx) { for (int y = 0; y < height; y = y + 1) { setRGB(y * width + cx, 200, 30, 0); } } - void row() { + // The horizontal one. + void row(int cy) { for (int x = 0; x < width; x = x + 1) { setRGB(cy * width + x, 0, 90, 200); } } - void center() { + // The bright cross where the two lines meet, `spread` lights along each arm. + void center(int cx, int cy) { for (int i = 0; i < spread + spread + 1; i = i + 1) { int d = i - spread; if (cx + d >= 0) { if (cx + d < width) { setRGB(cy * width + cx + d, 255, 255, 255); } } @@ -34,10 +34,10 @@ class CrosshairEffect { void tick() { fill(0, 0, 0); - cx = scale(beat(bpm, t), width); - cy = scale(beat(bpm + 7, t), height); - column(); - row(); - center(); + int cx = scale(beat(bpm, t), width); + int cy = scale(beat(bpm + 7, t), height); + column(cx); + row(cy); + center(cx, cy); } } diff --git a/moonlive/effects/aim.mle b/moonlive/effects/mh-aim.mle similarity index 100% rename from moonlive/effects/aim.mle rename to moonlive/effects/mh-aim.mle diff --git a/moonlive/effects/mh-ambient.mle b/moonlive/effects/mh-ambient.mle new file mode 100644 index 00000000..5a8deb86 --- /dev/null +++ b/moonlive/effects/mh-ambient.mle @@ -0,0 +1,34 @@ +// Ambient: heads that drift, and lift toward the ceiling as the room gets louder. + +class AmbientEffect { + byte panBpm = 5; + byte panMin = 45; + byte panMax = 135; + byte tiltMin = 128; + byte tiltMax = 255; + + int dimensions() { return 1; } + + string tags() { return "πŸ—ΌπŸŽΆπŸŽ―"; } + + void defineControls() { + addControl("panBpm", panBpm, 1, 60); // how fast the slow drift travels + addControl("panMin", panMin, 0, 255); // one end of the drift + addControl("panMax", panMax, 0, 255); // the other end + addControl("tiltMin", tiltMin, 0, 255); // where the heads rest when the room is quiet + addControl("tiltMax", tiltMax, 0, 255); // how high they lift when it is loud + } + + void tick() { + int loud = audioLevel(); + for (int i = 0; i < height; i = i + 1) { + // Each head takes its own band, so the rig ripples rather than lifting as one block. + int band = audioBand(div(i * 16, height)); + int spread = div(i * 255, height); + int swing = beatsin(panBpm, t + spread, 255); + setPan(i, panMin + div(swing * (panMax - panMin), 255)); + setTilt(i, tiltMin + div(band * (tiltMax - tiltMin), 255)); + setRGB(i, div(loud * 255, 256), div(band * 128, 256), 64); + } + } +} diff --git a/moonlive/effects/mh-sweep.mle b/moonlive/effects/mh-sweep.mle new file mode 100644 index 00000000..026b0529 --- /dev/null +++ b/moonlive/effects/mh-sweep.mle @@ -0,0 +1,47 @@ +// Sweep: the moving-head formations, in script form. MOTION ONLY, no color. + +class SweepEffect { + byte formation = 0; + byte panBpm = 6; + byte tiltBpm = 9; + byte panRange = 128; + byte tiltRange = 96; + + int dimensions() { return 1; } + + string tags() { return "πŸ’«πŸŽ―"; } + + void defineControls() { + addControl("formation", formation, 0, 4); // 0 fan, 1 mirror, 2 chase, 3 cross, 4 unison + addControl("panBpm", panBpm, 1, 120); // how fast the heads swing sideways + addControl("tiltBpm", tiltBpm, 1, 120); // how fast they swing up and down + addControl("panRange", panRange, 0, 255); // how far the sideways swing travels + addControl("tiltRange", tiltRange, 0, 255); // how far the vertical swing travels + } + + // Aim one head. `spread` delays its sweep, `dir` reverses it: every formation is a choice of + // those two per head, which is why they are the only thing the branches below decide. + void head(int i, int spread, int dir) { + setPan(i, 128 + div((beatsin(panBpm, t + spread, 255) - 128) * dir * panRange, 256)); + setTilt(i, 128 + div((beatsin(tiltBpm, t + spread, 255) - 128) * tiltRange, 256)); + } + + void tick() { + for (int i = 0; i < height; i = i + 1) { + // One line per formation, each saying what it IS rather than which variables it sets. + if (formation == 0) { head(i, div(i * 128, height), 1); } // fan: a widening delay + if (formation == 1) { + int half = 1; // mirror: the halves oppose + if (i >= div(height, 2)) { half = 0 - 1; } + head(i, 0, half); + } + if (formation == 2) { head(i, div(i * 255, height), 1); } // chase: a travelling wave + if (formation == 3) { + int alt = 1; // cross: neighbours oppose + if (mod(i, 2) == 1) { alt = 0 - 1; } + head(i, 0, alt); + } + if (formation == 4) { head(i, 0, 1); } // unison: all as one + } + } +} diff --git a/moonlive/effects/mh-troy.mle b/moonlive/effects/mh-troy.mle new file mode 100644 index 00000000..aa05645a --- /dev/null +++ b/moonlive/effects/mh-troy.mle @@ -0,0 +1,40 @@ +// Troy: a tight sweep on the beat, with the gobo wheel rolling on the bass. + +class TroyEffect { + byte bpm = 30; + byte pan = 175; + byte tilt = 90; + byte range = 20; + byte gobo = 0; + byte cutin = 200; + + int dimensions() { return 1; } + + string tags() { return "πŸ—ΌπŸŽΆπŸŽ―"; } + + void defineControls() { + addControl("bpm", bpm, 1, 120); // how fast the heads swing + addControl("pan", pan, 0, 255); // where the sideways swing is centered + addControl("tilt", tilt, 0, 255); // where the vertical swing is centered + addControl("range", range, 0, 127); // how far either swing travels + addControl("gobo", gobo, 0, 255); // the pattern the wheel holds between rolls + addControl("cutin", cutin, 0, 255); // how loud the bass has to be to open the beam + } + + void tick() { + int bass = audioBand(0); + for (int i = 0; i < height; i = i + 1) { + int p = beatsin(bpm, t, 255); + int q = beatsin(bpm, t, 255); + if (mod(i, 2) == 0) { + p = 255 - p; + q = 255 - q; + } + setPan(i, pan - range + div((p * range * 2), 255)); + setTilt(i, tilt - range + div((q * range * 2), 255)); + setGobo(i, gobo); + if (bass > cutin) { setZoom(i, 255); } else { setZoom(i, 0); } + setRGB(i, audioBand(15), audioBand(7), bass); + } + } +} diff --git a/moonlive/effects/mh-wowi.mle b/moonlive/effects/mh-wowi.mle new file mode 100644 index 00000000..a0ca6e4d --- /dev/null +++ b/moonlive/effects/mh-wowi.mle @@ -0,0 +1,31 @@ +// Wowi: a wide slow sweep with alternate heads mirrored, and no audio at all. + +class WowiEffect { + byte bpm = 30; + byte pan = 175; + byte tilt = 90; + byte range = 20; + byte zoom = 20; + + int dimensions() { return 1; } + + string tags() { return "πŸ—ΌπŸŽ―"; } + + void defineControls() { + addControl("bpm", bpm, 1, 120); // how fast the heads swing + addControl("pan", pan, 0, 255); // where the sideways swing is centered + addControl("tilt", tilt, 0, 255); // where the vertical swing is centered + addControl("range", range, 0, 127); // how far either swing travels + addControl("zoom", zoom, 0, 255); // how tight the beam is + } + + void tick() { + for (int i = 0; i < height; i = i + 1) { + int phase = t; + if (mod(i, 2) == 0) { phase = t + 32768; } + setPan(i, pan - range + div(beatsin(bpm, phase, 255) * range * 2, 255)); + setTilt(i, tilt - range + div(beatsin(bpm, phase, 255) * range * 2, 255)); + setZoom(i, zoom); + } + } +} diff --git a/moonlive/effects/ripples.mle b/moonlive/effects/ripples.mle index a10b091e..9ba3eee3 100644 --- a/moonlive/effects/ripples.mle +++ b/moonlive/effects/ripples.mle @@ -13,17 +13,24 @@ class RipplesEffect { addControl("rings", rings, 1, 32); // how tightly the rings pack } + // One source's rings at (x, y): the distance to a source that is itself gliding, turned into a + // wave. Naming it also computes each source position ONCE, where the inline form evaluated every + // beatsin twice for the same pixel. + int wave(int x, int y, int bpmX, int bpmY) { + int dx = x - beatsin(bpmX, t, width - 1); + int dy = y - beatsin(bpmY, t, height - 1); + return scale(sin((dx * dx + dy * dy) * rings * 64), 256); + } + void tick() { for (int y = 0; y < height; y = y + 1) { for (int x = 0; x < width; x = x + 1) { + // Two sources on different rates, plus a diagonal sweep: where their rings cross is the + // interference the effect is named for. setRGB(y * width + x, - scale(sin(((x - beatsin(bpm, t, width - 1)) * (x - beatsin(bpm, t, width - 1)) - + (y - beatsin(bpm + 4, t, height - 1)) * (y - beatsin(bpm + 4, t, height - 1))) - * rings * 64), 256), - scale(sin(((x - beatsin(bpm + 7, t, width - 1)) * (x - beatsin(bpm + 7, t, width - 1)) - + (y - beatsin(bpm + 3, t, height - 1)) * (y - beatsin(bpm + 3, t, height - 1))) - * rings * 64), 256), - scale(sin((x + y) * rings * 32 + beat(bpm, t)), 256)); + wave(x, y, bpm, bpm + 4), + wave(x, y, bpm + 7, bpm + 3), + scale(sin((x + y) * rings * 32 + beat(bpm, t)), 256)); } } } diff --git a/moonlive/effects/sweep.mle b/moonlive/effects/sweep.mle deleted file mode 100644 index 22b29c6a..00000000 --- a/moonlive/effects/sweep.mle +++ /dev/null @@ -1,43 +0,0 @@ -// Sweep: the moving-head formations, in script form. MOTION ONLY, no color. - -class SweepEffect { - byte formation = 0; - byte panBpm = 6; - byte tiltBpm = 9; - byte panRange = 128; - byte tiltRange = 96; - - int dimensions() { return 1; } - - string tags() { return "πŸ’«πŸŽ―"; } - - void defineControls() { - addControl("formation", formation, 0, 4); // 0 fan, 1 mirror, 2 chase, 3 cross, 4 unison - addControl("panBpm", panBpm, 1, 120); // how fast the heads swing sideways - addControl("tiltBpm", tiltBpm, 1, 120); // how fast they swing up and down - addControl("panRange", panRange, 0, 255); // how far the sideways swing travels - addControl("tiltRange", tiltRange, 0, 255); // how far the vertical swing travels - } - - void tick() { - for (int i = 0; i < height; i = i + 1) { - int spread = 0; - int dir = 1; - if (formation == 1) { - if (i < div(height, 2)) { dir = 1; } else { dir = 0 - 1; } - } - if (formation == 2) { - spread = div(i * 255, height); - } - if (formation == 3) { - if (mod(i, 2) == 1) { dir = 0 - 1; } - } - if (formation == 0) { - spread = div(i * 128, height); - } - - setPan(i, 128 + div((beatsin(panBpm, t + spread, 255) - 128) * dir * panRange, 256)); - setTilt(i, 128 + div((beatsin(tiltBpm, t + spread, 255) - 128) * tiltRange, 256)); - } - } -} diff --git a/moonlive/layouts/lightcrafter16.mll b/moonlive/layouts/lightcrafter16.mll new file mode 100644 index 00000000..da4beafe --- /dev/null +++ b/moonlive/layouts/lightcrafter16.mll @@ -0,0 +1,36 @@ +// LightCrafter16: eight columns down, then the same eight back up, one continuous run. + +class LightCrafter16Layout { + int ledsPerPin = 10; + byte pinsAreColumns = 0; + + int dimensions() { return 2; } + + string tags() { return "πŸš₯"; } + + void defineControls() { + addControl("ledsPerPin", ledsPerPin, 1, 2047); // lights on each of the sixteen strips + addControl("pinsAreColumns", pinsAreColumns, 0, 1); // swap which axis the strips run along + } + + // One strip along `column`, running from `from` toward `to`. + void strip(int column, int from, int to) { + int dir = 1; + if (from > to) { dir = 0 - 1; } + int y = from; + for (int n = 0; n < ledsPerPin; n = n + 1) { + if (pinsAreColumns == 1) { addLight(column, y, 0); } else { addLight(y, column, 0); } + y = y + dir; + } + } + + void placeLights() { + // Out along columns 0..7 with each strip running backwards, then home along 7..0 running + // forwards: the boustrophedon a single cable makes when it has to end where it started. + for (int c = 0; c < 8; c = c + 1) { strip(c, ledsPerPin - 1, 0); } + for (int n = 0; n < 8; n = n + 1) { + int c = 7 - n; + strip(c, ledsPerPin, ledsPerPin * 2 - 1); + } + } +} diff --git a/moonlive/layouts/se16.mll b/moonlive/layouts/se16.mll new file mode 100644 index 00000000..965bd8a3 --- /dev/null +++ b/moonlive/layouts/se16.mll @@ -0,0 +1,47 @@ +// SE16: sixteen strips in a grid, wired in the pair order that board's connectors use. + +class Se16Layout { + int ledsPerPin = 10; + byte mirrored = 0; + byte pinsAreColumns = 0; + + int dimensions() { return 2; } + + string tags() { return "πŸš₯"; } + + void defineControls() { + addControl("ledsPerPin", ledsPerPin, 1, 2047); // lights on each of the sixteen strips + addControl("mirrored", mirrored, 0, 1); // 8 columns of two strips running opposite ways + addControl("pinsAreColumns", pinsAreColumns, 0, 1); // swap which axis the strips run along + } + + // One strip along `column`, running from `from` toward `to`. A return leg is the same call with + // its ends swapped, which is what the wiring does at the far end of a column. + void strip(int column, int from, int to) { + int dir = 1; + if (from > to) { dir = 0 - 1; } + int y = from; + for (int n = 0; n < ledsPerPin; n = n + 1) { + if (pinsAreColumns == 1) { addLight(column, y, 0); } else { addLight(y, column, 0); } + y = y + dir; + } + } + + void placeLights() { + if (mirrored == 1) { + // Eight columns, each carrying an outward and a return strip: the far end folds back. + for (int n = 0; n < 8; n = n + 1) { + int c = 7 - n; + strip(c, ledsPerPin, ledsPerPin * 2 - 1); + strip(c, ledsPerPin - 1, 0); + } + } else { + // Sixteen columns taken in swapped pairs, which is the order the connectors sit in. + for (int n = 0; n < 8; n = n + 1) { + int p = 7 - n; + strip(p * 2, 0, ledsPerPin - 1); + strip(p * 2 + 1, 0, ledsPerPin - 1); + } + } + } +} diff --git a/moonlive/layouts/sixteen-rings.mll b/moonlive/layouts/sixteen-rings.mll new file mode 100644 index 00000000..69c5bc93 --- /dev/null +++ b/moonlive/layouts/sixteen-rings.mll @@ -0,0 +1,46 @@ +// Sixteen rings scattered across a wall, each a circle of lights at its own spot. + +class SixteenRingsLayout { + byte ringLights = 24; + byte radius = 5; + byte spread = 1; + + int dimensions() { return 2; } + + string tags() { return "πŸš₯"; } + + void defineControls() { + addControl("ringLights", ringLights, 3, 255); // lights around each ring + addControl("radius", radius, 1, 60); // how wide a ring is + addControl("spread", spread, 1, 10); // spreads the whole arrangement out + } + + // One ring at a spot on the wall. + void ring(int cx, int cy) { + for (int i = 0; i < ringLights; i = i + 1) { + addLight(cx * spread + scale(cos(i * turn(ringLights)), radius * 2 + 1), + cy * spread + scale(sin(i * turn(ringLights)), radius * 2 + 1), 0); + } + } + + void placeLights() { + // The centers are hand-placed rather than laid out on a grid: this is one physical + // installation, and these are where its rings actually hang. + ring(59, 23); + ring(70, 28); + ring(59, 10); + ring(59, 34); + ring(47, 17); + ring(59, 46); + ring(41, 5); + ring(47, 39); + ring(35, 17); + ring(41, 53); + ring(22, 10); + ring(35, 39); + ring(22, 23); + ring(22, 46); + ring(10, 28); + ring(22, 34); + } +} diff --git a/moonlive/palettes/beat-flash.mlp b/moonlive/palettes/beat-flash.mlp index 2a13128e..169bdd57 100644 --- a/moonlive/palettes/beat-flash.mlp +++ b/moonlive/palettes/beat-flash.mlp @@ -1,5 +1,4 @@ -// Beat flash: the palette sits in a deep color and jumps to white on every drum hit, so any effect -// using it pulses with the room. Decays between beats rather than snapping back. +// Beat flash: a deep color that jumps to white on every drum hit, then decays back. class BeatFlash { byte hue = 160; diff --git a/moonlive/palettes/spectrum.mlp b/moonlive/palettes/spectrum.mlp index 7f00d0c1..71a221cf 100644 --- a/moonlive/palettes/spectrum.mlp +++ b/moonlive/palettes/spectrum.mlp @@ -1,5 +1,4 @@ -// Spectrum: the palette IS the room. Each entry takes its brightness from one frequency band, so -// every effect using this palette reacts to the music without knowing anything about audio. +// Spectrum: each entry takes its brightness from one frequency band, so the palette IS the room. class Spectrum { byte gain = 100; diff --git a/moonlive/palettes/temperature.mlp b/moonlive/palettes/temperature.mlp index d8bd9ebc..2959be3b 100644 --- a/moonlive/palettes/temperature.mlp +++ b/moonlive/palettes/temperature.mlp @@ -1,5 +1,4 @@ -// Temperature: a physical color ramp from deep blue through white to amber, the way a heated -// object actually changes color. Slide `kelvin` to move the whole palette along that curve. +// Temperature: the color a heated object glows, from deep blue through white to amber. class Temperature { byte kelvin = 128; diff --git a/moonlive/services/button.mls b/moonlive/services/button.mls index c1746e2e..eec38ecc 100644 --- a/moonlive/services/button.mls +++ b/moonlive/services/button.mls @@ -1,9 +1,11 @@ +// Button: a wired push button, driving the switch1 control. + class Button { int pin = 0; int last = 1; void defineControls() { - addControl("pin", pin, 0, 48); + addControl("pin", pin, 0, 48); // which GPIO the button is wired to } void tick20ms() { diff --git a/moonlive/services/power.mls b/moonlive/services/power.mls index 98eed595..4ebfc8b4 100644 --- a/moonlive/services/power.mls +++ b/moonlive/services/power.mls @@ -1,3 +1,5 @@ +// Power: reads supply voltage and current from two analog pins, into readouts. + class Power { int pinV = 5; int pinI = 6; diff --git a/moonlive/services/sweep.mls b/moonlive/services/sweep.mls index b101543a..3c2892b0 100644 --- a/moonlive/services/sweep.mls +++ b/moonlive/services/sweep.mls @@ -1,8 +1,10 @@ +// Sweep: drives four faders on a slow triangle, two of them inverted. + class Sweep { int bpm = 8; void defineControls() { - addControl("bpm", bpm, 1, 60); + addControl("bpm", bpm, 1, 60); // how fast the sweep travels } void tick20ms() { diff --git a/src/core/AudioFrame.h b/src/core/AudioFrame.h index b268fa90..3faa4ca9 100644 --- a/src/core/AudioFrame.h +++ b/src/core/AudioFrame.h @@ -5,7 +5,7 @@ namespace mm { // One snapshot of analysed audio, produced by AudioService (src/core/AudioService.h) -// once per render tick and consumed by audio-reactive effects (AudioVolumeEffect, +// once per render tick and consumed by audio-reactive effects ( // AudioSpectrumEffect). The producer/consumer-via-plain-struct model the codebase // already uses (PreviewDriver writes pixels HttpServer reads); the struct is the // whole contract between the two, so effects never touch I2S or the FFT. diff --git a/src/core/AudioService.h b/src/core/AudioService.h index 7782861c..df957e1c 100644 --- a/src/core/AudioService.h +++ b/src/core/AudioService.h @@ -23,7 +23,7 @@ namespace mm { /// are *recomputed* only when a full sample block has accumulated (a 512-sample /// block at 22 kHz takes ~23 ms, longer than one tick), so a tick that doesn't /// complete a block re-publishes the previous `AudioFrame` unchanged rather than -/// re-analysing. `AudioVolumeEffect` and `AudioSpectrumEffect` are the consumers, +/// re-analyzing. `AudioSpectrumEffect` and the other audio effects are the consumers, /// reaching the live frame through the static `latestFrame()`. /// /// **Named for what it does**: audio acquisition plus analysis, not for one diff --git a/src/core/HttpServerModule.cpp b/src/core/HttpServerModule.cpp index 5e9310f6..27e7d9f1 100644 --- a/src/core/HttpServerModule.cpp +++ b/src/core/HttpServerModule.cpp @@ -922,6 +922,15 @@ void HttpServerModule::applyFileChanged(const char* path) { // and deferring also sends this response before a network-reconfiguring apply can cut the // socket (the bench found both). if (auto* fs = FilesystemModule::instance()) fs->requestConfigApply(path); + // A write into the USER script directory of a name the firmware also ships is a FORK: from here + // on that copy shadows the shipped one and every library update is invisible behind it. Record + // what it was forked from, so the binding can later say "the shipped one has been updated" + // rather than leaving an edit and a stale leftover looking identical forever. + // + // Here rather than in the editor because the DEVICE is what knows both copies exist: every + // writer gets lineage, including a script pushed by a script or restored from a backup, and the + // UI stays out of a bookkeeping job it would have to repeat per caller. + moonlive::noteForkedFrom(path); if (!scheduler_) return; // requestPrepareTree, never prepareTree: the immediate walk runs a scripted layout's JIT'd code // on the CALLING task's stack (Scheduler.h:74-77), and a write arrives on the small web-server diff --git a/src/core/moonlive/MoonLiveBuiltins.h b/src/core/moonlive/MoonLiveBuiltins.h index 3de32e3d..8ee7296f 100644 --- a/src/core/moonlive/MoonLiveBuiltins.h +++ b/src/core/moonlive/MoonLiveBuiltins.h @@ -273,7 +273,39 @@ static constexpr uint8_t kDepthSlot = kCtrlBytes + kMaxSysVars * kSysVarBytes; /// stack and the rest of the render path need. static constexpr uint8_t kMaxCallDepth = 32; -static constexpr uint8_t kArenaBytes = kCtrlBytes + kMaxSysVars * kSysVarBytes + 1; // +1: kDepthSlot +/// WHERE A SCRIPT CALL'S ARGUMENTS ARE PASSED, and why they are not passed in the frame. +/// +/// Each function opens its OWN frame (`a.prologue`), and a frame slot is addressed off the current +/// frame pointer: on Xtensa through the windowed ABI's `entry a1, N`. So a caller physically cannot +/// store into the slot the callee will read, and the obvious design (stage into the callee's +/// locals) is not expressible on the target that matters most. +/// +/// The ARENA is what both activations share: every function already holds its pointer (kArg4), so +/// an argument block here costs no new register, no change to any call sequence, and in particular +/// leaves Xtensa's `call8` untouched, which is the most defect-prone code in this project. +/// +/// ONE block, not one per depth, because the CALLEE COPIES ITS ARGUMENTS INTO ITS OWN FRAME as its +/// first act. The block is therefore live only across the call instruction itself, and the two +/// cases that look dangerous both hold: in `f(g(x))` the inner call has returned (and its block is +/// dead) before the outer one writes; and in recursion the callee has already copied out before it +/// writes the block for the call it makes. Copy-at-entry is what buys the single block, so it is a +/// requirement of this design rather than an optimization of it. +static constexpr uint8_t kMaxScriptArgs = 4; // per call; a helper wanting more wants an array +static constexpr uint8_t kScriptArgBytes = 4; // one machine word, as a frame slot is +/// ALIGNED to a 4-byte boundary, because these are 32-bit slots: kDepthSlot is a single byte, so +/// the next free address is odd, and a word store there is unaligned. Xtensa faults on that, and a +/// misaligned word is a silently wrong value everywhere else. +static constexpr uint8_t kScriptArgBase = static_cast((kDepthSlot + 1 + 3) & ~3); + +/// The arena byte offset of argument `i`. +constexpr uint8_t scriptArgOffset(uint8_t i) { + return static_cast(kScriptArgBase + i * kScriptArgBytes); +} + +/// Sized from the argument block's own END, not from a sum of the parts: the block is ALIGNED up +/// from kDepthSlot, so adding the pieces underestimates it by the padding and the last argument +/// would sit past the arena the host allocates. +static constexpr uint8_t kArenaBytes = kScriptArgBase + kMaxScriptArgs * kScriptArgBytes; /// A name the HOST defines and the script only reads (`width`, `height`, `depth`). Reserved: a /// script cannot declare one, so the name means the same thing in every script (the `t` rule, one diff --git a/src/core/moonlive/MoonLiveCompiler.cpp b/src/core/moonlive/MoonLiveCompiler.cpp index 64c76851..a9a9c3bd 100644 --- a/src/core/moonlive/MoonLiveCompiler.cpp +++ b/src/core/moonlive/MoonLiveCompiler.cpp @@ -166,7 +166,11 @@ struct Parser { // Each function the class defined, with the IR index its body starts at. An IR index, not a byte // offset: the parser runs before lowering, so the byte an entry lands on is not known yet. The // emitter converts one to the other, which is the same seam a linker crosses. - struct FnMark { const char* name; uint8_t nameLen; uint16_t irStart; RetType ret; }; + /// `params` is how many arguments the function declares. They live in the LOWEST frame + /// slots of its frame (0..params-1), which is what lets a caller stage arguments into them + /// with the same Spill the builtin path already uses: no backend calling convention changes, + /// and in particular Xtensa's windowed call8 sequence is untouched. + struct FnMark { const char* name; uint8_t nameLen; uint16_t irStart; RetType ret; uint8_t params; }; FnMark fns[kMaxEntryPoints] = {}; uint8_t fnCount = 0; /// What the function currently being parsed declared it returns, so a `return` can be @@ -682,7 +686,36 @@ struct Parser { if (std::strncmp(fns[i].name, lex.identBeg, lex.identLen) != 0) continue; lex.advance(); if (!expect(Tok::LParen, "expected '(' after the function name")) return; - if (!expect(Tok::RParen, "a script function takes no arguments yet")) return; + // ARGUMENTS, evaluated into REGISTERS first and stored to the arena block only + // once they all are. The store cannot follow each argument, because evaluating a + // later one may itself contain a call (`paint(0, twice(21))`) whose own arguments + // go through the same block: writing as we go had the inner call overwrite the + // outer's first argument, and paint drew 21 where 0 belonged. + // + // Delaying the stores to the last possible moment is what makes ONE block enough: + // between the final store and the call there is nothing left to run. + const uint8_t want = fns[i].params; + VReg staged[kMaxScriptArgs] = {}; + uint8_t got = 0; + while (lex.kind != Tok::RParen && lex.kind != Tok::End) { + if (got > 0 && !expect(Tok::Comma, "expected ',' between arguments")) return; + const VReg a = parseExpr(); + if (failed) return; + if (got < want && got < kMaxScriptArgs) staged[got] = a; + else freeTemp(a); + got++; + } + if (!expect(Tok::RParen, "expected ')' to close the arguments")) return; + const uint8_t staging = got < want ? got : want; + for (uint8_t a = 0; a < staging && a < kMaxScriptArgs; a++) { + emit({IrOp::StoreCtrl32, 0, staged[a], 0,0,0, scriptArgOffset(a), nullptr, {}}); + freeTemp(staged[a]); + } + if (got != want) { + fail(got < want ? "too few arguments for this function" + : "too many arguments for this function"); + return; + } // A call used as a VALUE takes what the callee returned. Refused when the callee // declares void, since there is nothing to take and the script would otherwise // read whatever the return register happened to hold. @@ -1679,15 +1712,43 @@ struct Parser { /// Stage 1 emits it INLINE at the point the class body reaches it, which is what makes `tick()` /// the whole program while it is the only entry point. Real per-function frames arrive with the /// call support in this same step; this is the parse shape they will attach to. - bool parseFunctionBody() { + /// The parameter list, parsed BEFORE the function emits anything: the count decides how many + /// copy-out instructions its prologue needs, and inserting into the IR afterwards would shift + /// every index the spill pass and the call lowering rely on. + bool parseParams(uint8_t* paramsOut) { if (!expect(Tok::LParen, "expected '(' after the function name")) return false; - if (!expect(Tok::RParen, "expected ')': parameters arrive with typed members")) return false; - if (!expect(Tok::LBrace, "expected '{' to open the function body")) return false; - // Each function starts with an empty local scope and ends with one, so `tick()` and - // `tick20ms()` in the same class each get the whole frame rather than sharing what the - // first one happened to leave. Stage 1 emits functions inline, which is exactly why this is - // needed: without it the second function's locals would stack on top of the first's. + // The locals must be cleared BEFORE the parameters are declared: they become locals 0..N-1 + // of this function's frame, and a leftover from the previous function would push them up + // and leave the caller staging into the wrong slots. localCount = 0; slotHighWater = 0; + uint8_t params = 0; + while (lex.kind != Tok::RParen && lex.kind != Tok::End) { + if (params > 0 && !expect(Tok::Comma, "expected ',' between parameters")) return false; + // A parameter is declared like a variable, and its type is read the same way, so + // `int`/`byte`/`bool` all mean here what they mean anywhere else. + if (!atTypeKeyword()) { fail("expected a parameter type"); return false; } + const CtrlType t = currentType(); + lex.advance(); + if (lex.kind != Tok::Ident) { fail("expected a parameter name"); return false; } + if (localCount >= kMaxLocals) { fail("too many locals"); return false; } + if (params >= kMaxCallArgs) { fail("too many parameters"); return false; } + locals[localCount++] = {lex.identBeg, lex.identLen, slotHighWater, t}; + slotHighWater++; + if (slotHighWater > slotsUsed) slotsUsed = slotHighWater; + params++; + lex.advance(); + } + if (!expect(Tok::RParen, "expected ')' to close the parameter list")) return false; + if (paramsOut) *paramsOut = params; + return true; + } + + /// The body. Its parameters are already locals 0..N-1, declared by parseParams. + bool parseFunctionBody() { + if (!expect(Tok::LBrace, "expected '{' to open the function body")) return false; + // Cleared above, BEFORE the parameters were declared, so they are in scope for the body: + // clearing here would discard them. Each function still starts with an empty scope, which + // is what stops one function's locals stacking on the next's. while (!failed && lex.kind != Tok::RBrace && lex.kind != Tok::End) if (!parseStatement()) return false; if (failed) return false; @@ -1755,20 +1816,38 @@ struct Parser { // the wrong function, silently. Refused here, where a control name already is, so the // script author is told rather than the engine guessing. if (lex.identLen > kMaxEntryName) { fail("function name too long"); return false; } - fns[fnCount] = {lex.identBeg, static_cast(lex.identLen), - static_cast(ir.count), ret}; + // The NAME is captured before the SIGNATURE is parsed, since parsing moves the lexer, + // and the signature is parsed before anything is emitted: the parameter count decides + // how many copy-out instructions the prologue needs, and inserting into the IR after + // the fact would shift every index the spill pass and the call lowering rely on. + const char* const fnName = lex.identBeg; + const uint8_t fnNameLen = static_cast(lex.identLen); + lex.advance(); // the function name + uint8_t params = 0; + if (!parseParams(¶ms)) return false; + fns[fnCount] = {fnName, fnNameLen, static_cast(ir.count), ret, params}; curRet = ret; // every `return` below is checked against it // The IR carries the start INDEX; the lowering turns it into a byte offset. ir.fnIrStart[fnCount] = static_cast(ir.count); ir.fnCount = static_cast(fnCount + 1); fnCount++; - lex.advance(); // the function name // Park the host arguments in this FUNCTION's frame. Read-only, so one store each, and // every later read is a Reload, which frees five registers for the body. Per function // rather than per program because each function owns its own frame now: a spill emitted // before the first prologue would write to a frame that does not exist yet. for (VReg v = 0; v < kFirstTemp; v++) emit({IrOp::Spill, 0, v, 0,0,0, hostArgSlot(v), nullptr, {}}); + // COPY THE ARGUMENTS OUT of the shared arena block into this function's own slots, + // before the body runs and so before it can make a call of its own. That copy is what + // lets ONE arena block serve every depth: see kScriptArgBase. It also has to happen + // here rather than lazily at each use, since a call in the middle of the body would + // overwrite the block the later uses would read. + for (uint8_t a = 0; a < params; a++) { + const VReg v = alloc(); + emit({IrOp::LoadCtrl32, v, 0,0,0,0, scriptArgOffset(a), nullptr, {}}); + emit({IrOp::Spill, 0, v, 0,0,0, a, nullptr, {}}); + freeTemp(v); + } if (!parseFunctionBody()) return false; any = true; } diff --git a/src/light/draw.h b/src/light/draw.h index 403903ed..66175201 100644 --- a/src/light/draw.h +++ b/src/light/draw.h @@ -1262,6 +1262,72 @@ inline void disc(const Canvas& cv, pos_t cx, pos_t cy, pos_t r, RGB c, lengthTyp } } +/// A circle OUTLINE of a given stroke width, centered on the radius: `thickness` of one pixel +/// (`kSubOne`) draws a one-pixel ring. Sub-pixel and antialiased like `disc`. +/// +/// A shape of its own rather than two discs subtracted, and the difference is visible: subtracting +/// leaves the INNER edge hard, because the cut-out disc's coverage is not blended, only removed. A +/// ring drawn from its own distance band gets both edges antialiased, which is what lets a thin +/// ring stay smooth while it grows. +inline void ring(const Canvas& cv, pos_t cx, pos_t cy, pos_t r, pos_t thickness, RGB c, + lengthType z = 0) { + if (r <= 0 || thickness <= 0) return; + const pos_t half = thickness / 2; + const lengthType x0 = toPixel(cx - r - half) - 1, x1 = toPixel(cx + r + half) + 1; + const lengthType y0 = toPixel(cy - r - half) - 1, y1 = toPixel(cy + r + half) + 1; + for (lengthType y = y0; y <= y1; y++) { + for (lengthType x = x0; x <= x1; x++) { + // sdCircle gives the distance to the circle's LINE (signed, negative inside). The ring + // is the band within `half` of that line, so its own distance is how far outside the + // band the pixel sits: |d| - half. + const int32_t d = sdCircle(toSub(x) + kSubOne / 2, toSub(y) + kSubOne / 2, cx, cy, r); + const int32_t off = (d < 0 ? -d : d) - half; + const uint8_t cov = coverage(off); + if (cov == 0) continue; + addPixel(cv, {x, y, z}, RGB{scale8(c.r, cov), scale8(c.g, cov), scale8(c.b, cov)}); + } + } +} + +/// A line with WIDTH and sub-pixel endpoints, antialiased along both edges and round-capped. +/// +/// Distinct from `line` rather than an overload of it, because they answer different questions. +/// `line` walks whole pixels by Bresenham and is the cheap one, right for a wire-frame or a +/// scribble. This one places a stroke of real width at a fractional position, which is what a clock +/// hand or a spoke needs: on a 16-pixel panel a Bresenham hand jumps a whole pixel at a time and +/// reads as broken, where this moves smoothly because brightness carries the fraction. +inline void strokeLine(const Canvas& cv, pos_t x0, pos_t y0, pos_t x1, pos_t y1, pos_t thickness, + RGB c, lengthType z = 0) { + if (thickness <= 0) return; + const pos_t half = thickness / 2; + const int64_t dx = static_cast(x1) - x0, dy = static_cast(y1) - y0; + const int64_t lenSq = dx * dx + dy * dy; + // A zero-length stroke is a dot, which is what a fully retracted hand should still draw. + if (lenSq == 0) { disc(cv, x0, y0, half, c, z); return; } + + const pos_t loX = (x0 < x1 ? x0 : x1) - half, hiX = (x0 > x1 ? x0 : x1) + half; + const pos_t loY = (y0 < y1 ? y0 : y1) - half, hiY = (y0 > y1 ? y0 : y1) + half; + for (lengthType y = toPixel(loY) - 1; y <= toPixel(hiY) + 1; y++) { + for (lengthType x = toPixel(loX) - 1; x <= toPixel(hiX) + 1; x++) { + const pos_t px = toSub(x) + kSubOne / 2, py = toSub(y) + kSubOne / 2; + // Project the pixel onto the segment, CLAMPED to its ends: without the clamp the + // stroke would run on along the infinite line, and the two caps would be square rather + // than round. `t` is the position along the segment, 0..kSubOne. + const int64_t vx = static_cast(px) - x0, vy = static_cast(py) - y0; + int64_t t = ((vx * dx + vy * dy) * kSubOne) / lenSq; + if (t < 0) t = 0; + if (t > kSubOne) t = kSubOne; + const pos_t nx = static_cast(x0 + ((dx * t) >> kSubShift)); + const pos_t ny = static_cast(y0 + ((dy * t) >> kSubShift)); + // Distance to that nearest point, then the same edge rule every shape here uses: + // sdCircle with the stroke's half-width IS "how far outside the stroke am I". + const uint8_t cov = coverage(sdCircle(px, py, nx, ny, half)); + if (cov == 0) continue; + addPixel(cv, {x, y, z}, RGB{scale8(c.r, cov), scale8(c.g, cov), scale8(c.b, cov)}); + } + } +} + /// The volumetric form: a filled sphere, shaded the same way. /// /// Separate rather than a defaulted depth on `disc`, because the cost differs by an order: a sphere diff --git a/src/light/drivers/Drivers.h b/src/light/drivers/Drivers.h index 5ace8294..1f71bd42 100644 --- a/src/light/drivers/Drivers.h +++ b/src/light/drivers/Drivers.h @@ -265,21 +265,36 @@ class Drivers : public MoonModule { /// the seam holds POINTERS, so a local would dangle the moment this returned. void refreshLivePalettes() { liveCount_ = 0; - platform::fsList(moonlive::kScriptDir, [](const char* name, bool isDir, uint32_t, void* ctx) { - auto* self = static_cast(ctx); - if (isDir || self->liveCount_ >= LivePalettes::kMax) return; - const size_t n = std::strlen(name); - if (n < 5 || std::strcmp(name + n - 4, moonlive::kPaletteExt) != 0) return; - // A bounded copy rather than snprintf("%s"): a name longer than the slot is TRUNCATED - // to fit, which is what a picker entry wants, and GCC cannot prove the %s form fits. - char* slot = self->liveNames_[self->liveCount_]; - const size_t cap = sizeof(self->liveNames_[0]) - 1; - const size_t copy = n < cap ? n : cap; - std::memcpy(slot, name, copy); - slot[copy] = '\0'; - self->livePtrs_[self->liveCount_] = self->liveNames_[self->liveCount_]; - self->liveCount_++; - }, this); + // BOTH directories, user first, exactly as resolveScript() loads them: a `.mlp` the UI + // downloaded sits in the FACTORY directory, and scanning only the user one made every + // downloaded palette invisible. The picker then said "reopen the picker to select it" and + // reopening changed nothing, because the file was never going to be listed. + // + // User first matters for the dedupe below: editing a factory palette writes a second file + // of the same name to kScriptDir, and the two must appear as ONE entry, the user's. + const auto scan = [](const char* dir, void* ctx) { + platform::fsList(dir, [](const char* name, bool isDir, uint32_t, void* c) { + auto* self = static_cast(c); + if (isDir || self->liveCount_ >= LivePalettes::kMax) return; + const size_t n = std::strlen(name); + if (n < 5 || std::strcmp(name + n - 4, moonlive::kPaletteExt) != 0) return; + // Already seen means the user directory carried it, and that copy SHADOWS this one + // (resolveScript prefers it), so the factory pass must not add a second row. + for (uint8_t i = 0; i < self->liveCount_; i++) + if (std::strcmp(self->livePtrs_[i], name) == 0) return; + // A bounded copy rather than snprintf("%s"): a name longer than the slot is TRUNCATED + // to fit, which is what a picker entry wants, and GCC cannot prove the %s form fits. + char* slot = self->liveNames_[self->liveCount_]; + const size_t cap = sizeof(self->liveNames_[0]) - 1; + const size_t copy = n < cap ? n : cap; + std::memcpy(slot, name, copy); + slot[copy] = '\0'; + self->livePtrs_[self->liveCount_] = self->liveNames_[self->liveCount_]; + self->liveCount_++; + }, ctx); + }; + scan(moonlive::kScriptDir, this); + scan(moonlive::kFactoryScriptDir, this); // Alphabetical, because the picker MERGES this list with the built-ins by name and that // merge walks both in order. An unsorted list here would interleave wrongly. for (uint8_t i = 1; i < liveCount_; i++) @@ -628,8 +643,15 @@ class Drivers : public MoonModule { // read its controls, then destroys it): such a probe would take the seam and empty it on // its way out, and every `.mlp` vanished from the running picker. prepare() runs only on a // module the scheduler actually mounted, which is exactly the owner the seam wants. + const uint8_t hadLive = liveCount_; refreshLivePalettes(); LivePalettes::set(livePtrs_, liveTags_, liveCount_); + // A CHANGED count needs the control rebuilt, not just the seam republished: `palette`'s + // maximum is baked in defineControls() as liveCount_ + kCount, so a palette downloaded + // while running was listed by the picker and then REFUSED with "value out of range", + // because the control still carried the old cap. A write reaches here through + // applyFileChanged() -> requestPrepareTree(), so this is where the new file first appears. + if (liveCount_ != hadLive) rebuildControls(); // Re-resolve the active Layer from the bound container so a Layer that // was cleared and rebuilt via the API is picked up here (self-healing). // setLayer() pins a Layer directly and leaves effects_ null β€” skip then. diff --git a/src/light/effects/AudioVolumeEffect.h b/src/light/effects/AudioVolumeEffect.h deleted file mode 100644 index a1738f6b..00000000 --- a/src/light/effects/AudioVolumeEffect.h +++ /dev/null @@ -1,61 +0,0 @@ -#pragma once - -#include "light/effects/EffectBase.h" - -namespace mm { - -// Audio-reactive VU effect: the whole grid pulses with the microphone's sound -// level. The simplest audio consumer β€” one scalar (AudioFrame::level) drives a -// single brightness, a color shifting from calm to hot as it rises. Reads the -// live frame from AudioService::latestFrame(); with no mic (or silence) the frame is -// zero and the grid stays dark, so the effect is safe on any target. -// Author: projectMM original (VU-meter) -/// Audio-reactive effect: drives brightness/color from the overall sound level. -class AudioVolumeEffect : public EffectBase { -public: - const char* tags() const override { return "πŸ’«πŸŽ΅"; } - Dim dimensions() const override { return Dim::D3; } - - uint8_t brightness = 255; // overall ceiling - - void defineControls() override { - controls_.addControl("brightness", brightness, 1, 255); - } - - void tick() MM_NONBLOCKING override { - uint8_t* buf = buffer(); - const lengthType w = width(); - const lengthType h = height(); - const lengthType d = depth(); - const uint8_t cpl = channelsPerLight(); - const size_t total = static_cast(w) * h * d * cpl; - - // level is ~0..255; scale to the brightness ceiling. Uses the SMOOTHED level so the whole - // surface glows/breathes with the music instead of jittering per audio block (the calm VU - // look, the same choice as AudioSpectrum's VU bar). - const uint16_t level = AudioService::latestFrame()->levelSmoothed; - const uint16_t v = static_cast( - (level > 255 ? 255 : level) * brightness / 255); - - // Level drives BOTH the palette index and the brightness: quiet maps to the palette's - // start, loud to its end, dimmed by v. Fill every light identically β€” a VU meter on the - // whole surface; modifiers/layouts give it shape. - const uint8_t lvl = static_cast(level > 255 ? 255 : level); - const RGB c = colorFromPalette(*Palettes::active(), lvl, static_cast(v)); - const uint8_t r = c.r, g = c.g, b = c.b; - - // Write logical RGB only: channel order and any RGBW white are the - // driver's Correction (W = min(r,g,b)), like every other effect. Effect - // buffers are RGB (cpl == 3) today; the loop stays correct for any cpl by - // writing R/G/B where they fit and zeroing any extra channels, so no stale - // bytes survive from a prior, differently-shaped frame. - for (size_t off = 0; off < total; off += cpl) { - if (cpl >= 1) buf[off + 0] = r; - if (cpl >= 2) buf[off + 1] = g; - if (cpl >= 3) buf[off + 2] = b; - for (uint8_t ch = 3; ch < cpl; ch++) buf[off + ch] = 0; - } - } -}; - -} // namespace mm diff --git a/src/light/effects/ColorTrailsEffect.h b/src/light/effects/ColorTrailsEffect.h index 703b1ff4..1e39af31 100644 --- a/src/light/effects/ColorTrailsEffect.h +++ b/src/light/effects/ColorTrailsEffect.h @@ -18,6 +18,11 @@ namespace mm { // effect that runs and one that does not. Reach for the solver when the medium itself is the // subject, and for this when the subject is color being carried. // +// The two tiers are Jeff's own arrangement, not our contrast with him: his FlowFields repo carries +// this separable flow and a full Stam solver (pressure, divergence, vorticity confinement) as +// sibling flows behind one dispatch table. So "no fluid mechanics" describes THIS flow, not his +// work. +// // Four pieces, each a power function: // // - `inoise16` sampled along one axis fills the two profiles, so the flow drifts and reverses on @@ -30,10 +35,21 @@ namespace mm { // The plane is 16-bit for the reason every transport effect here is: a value multiplied by slightly // less than one, many times a second, either dies early or never fades at 8 bits. // -// Credit: Stefan Petrick, whose concept this is, and Jeff (mindful_stone / 4wheeljive), whose -// ColorTrails in AuroraPortal is the composition it follows, by way of MoonLight: -// https://github.com/4wheeljive/AuroraPortal/blob/main/src/programs/colorTrails_detail.hpp +// Credit: Stefan Petrick, whose concept this is (Jeff credits him for the emitter/flow split too), +// and Jeff (mindful_stone / 4wheeljive), whose ColorTrails is the composition it follows, by way of +// MoonLight. The work has since moved out of AuroraPortal, where the file this was ported from no +// longer exists, into its own repo: +// https://github.com/4wheeljive/FlowFields/blob/main/src/flows/flow_noise.h +// (the version ported here is AuroraPortal at 91ce0c6861, src/programs/colorTrails_detail.hpp). // The separable-noise-advection idea is theirs; the kernels underneath are this project's. +// +// Two differences from his, deliberate but worth knowing if output is ever compared. His advection +// is TWO passes over a temporary: the second samples the already-x-sheared buffer, so the y-shear +// reads a displaced row. Ours fuses them, reading both offsets from the undisplaced source, which +// is sequential composition against simultaneous: visually close, a different operator. And he +// floors the per-line shift at 0.3 to "prevent pure cardinal motion", because a profile passing +// through zero collapses the flow to a plain horizontal or vertical slide; a low `flow` here can +// reach that state. // @card ColorTrailsEffect.png /// Effect: color emitters carried by a flow made of two noise profiles, one per axis. class ColorTrailsEffect : public EffectBase { @@ -54,6 +70,12 @@ class ColorTrailsEffect : public EffectBase { uint8_t size = 128; // orbit radius, and the Lissajous figure's reach uint8_t mode = static_cast(Mode::All); + /// Which wind carries the color. `Noise` is the separable two-profile flow this effect is + /// named for; `Radial` is a current running out from the center (or into it), computed per + /// pixel from geometry rather than sampled, so it costs no field and no state. + enum class Flow : uint8_t { Noise = 0, Radial, RadialIn }; + uint8_t flowType = static_cast(Flow::Noise); + void defineControls() override { controls_.addControl("speed", speed, 0, 255); controls_.addControl("flow", flow, 0, 255); @@ -63,6 +85,7 @@ class ColorTrailsEffect : public EffectBase { controls_.addControl("colorSpeed", colorSpeed, 0, 255); controls_.addControl("size", size, 0, 255); controls_.addSelect("mode", mode, kModes, 4); + controls_.addSelect("flowType", flowType, kFlows, 3); } void prepare() override { @@ -115,14 +138,42 @@ class ColorTrailsEffect : public EffectBase { // The two shears, applied as one advection: a light's source is offset horizontally by its // ROW's profile and vertically by its COLUMN's. Doing both in one backward sample is what // keeps this to a single pass, where the original takes two and a temporary buffer. - const int32_t* xp = xProf_.data(); - const int32_t* yp = yProf_.data(); - draw::advect16(dst.data(), src.data(), w, h, d, - [xp, yp](lengthType x, lengthType y, lengthType, - draw::pos_t& vx, draw::pos_t& vy) { - vx = static_cast(yp[y]); - vy = static_cast(xp[x]); - }, draw::Edge::Wrap); + const Flow f = static_cast(flowType); + if (f == Flow::Noise) { + const int32_t* xp = xProf_.data(); + const int32_t* yp = yProf_.data(); + draw::advect16(dst.data(), src.data(), w, h, d, + [xp, yp](lengthType x, lengthType y, lengthType, + draw::pos_t& vx, draw::pos_t& vy) { + vx = static_cast(yp[y]); + vy = static_cast(xp[x]); + }, draw::Edge::Wrap); + } else { + // RADIAL. Every cell moves along the line through the center, so the direction is the + // normalized offset from it and needs no field and no state: dividing dx and dy by the + // distance is the whole computation. The sign is what makes it a fountain or a drain. + // + // The edge is CLAMP rather than Wrap, unlike the noise flow: an outward current that + // wrapped would pour the rim straight back into the middle and the picture would never + // clear. Clamping lets it run off the edge, which is what an outward flow looks like. + const int32_t cx = w / 2, cy = h / 2; + const int32_t reach = (static_cast(flow) * draw::kSubOne) / 24; + const int32_t sign = (f == Flow::Radial) ? 1 : -1; + draw::advect16(dst.data(), src.data(), w, h, d, + [cx, cy, reach, sign](lengthType x, lengthType y, lengthType, + draw::pos_t& vx, draw::pos_t& vy) { + const int32_t dx = static_cast(x) - cx; + const int32_t dy = static_cast(y) - cy; + // isqrt of the squared distance, floored at 1 so the center cell + // divides by something: it is the one place the direction is + // undefined, and it stays put rather than dividing by zero. + const int32_t r = static_cast(isqrt( + static_cast(dx * dx + dy * dy))); + const int32_t rr = r < 1 ? 1 : r; + vx = static_cast((dx * reach * sign) / rr); + vy = static_cast((dy * reach * sign) / rr); + }, draw::Edge::Clamp); + } front_ = !front_; ScratchBuffer& moved = front_ ? plane_ : scratch_; @@ -133,6 +184,7 @@ class ColorTrailsEffect : public EffectBase { private: static constexpr const char* kModes[4] = {"All", "Orbital", "Lissajous", "Border"}; + static constexpr const char* kFlows[3] = {"Noise", "Radial out", "Radial in"}; uint32_t halfLifeMs() const { return 20u + static_cast(persistence) * static_cast(persistence) / 16u; @@ -148,16 +200,38 @@ class ColorTrailsEffect : public EffectBase { // The shear scales with the grid: a fixed pixel count is a strong flow on a 16-wide panel // and an invisible one on a 256-wide, which is the same reasoning `fShift` carries upstream. const int32_t reach = (static_cast(flow) * (w < h ? w : h)) / 220; + // BREATHING. Each axis has its own slow multiplier on the shear, so the flow swells and + // eases instead of shearing at one rate forever. Jeff's version runs six such channels + // (his FlowFields modulator bank); two is the smallest form that gets the effect, because + // what sells it is the axes disagreeing, not the channel count. The rates are deliberately + // unequal and not a ratio of each other, so the pair never returns to the same phase. + // + // The DEPTH is bounded so the flow can breathe without stalling: his `minShift` exists + // because a profile passing through zero collapses the picture to a plain horizontal or + // vertical slide, and a multiplier that reaches zero does the same thing. 40% swing around + // 80% keeps it between 0.4 and 1.2 of the set reach. + const uint32_t mPhase = (now * static_cast(flowSpeed)) / 96u; + const int32_t xBreath = 205 + (static_cast(sin16(static_cast(mPhase * 7u))) * 102) / 32768; + const int32_t yBreath = 205 + (static_cast(sin16(static_cast(mPhase * 5u + 21845u))) * 102) / 32768; + const int32_t xReach = (reach * xBreath) / 256; + const int32_t yReach = (reach * yBreath) / 256; + // The axes are detuned in BOTH space and time, which is Stefan's own tuning rather than a + // guess: his rig's sliders sit at scale 0.33 against 0.32 and speed -1.73 against -1.72, + // near-equal but never equal. Equal rates let the two profiles lock into one pattern and + // the picture slides along a diagonal; unequal ones drift through each other, so the flow + // keeps rearranging itself. The ratios below are his, in integers: 32/33 and 172/173. const uint32_t cells = static_cast(scale) * 24u; + const uint32_t cellsY = (cells * 32u) / 33u; + const uint32_t phaseY = (phase * 172u) / 173u; for (lengthType x = 0; x < w; x++) { const int32_t n = static_cast(inoise16(static_cast(x) * cells, phase, 0)) - 32768; - xProf_[static_cast(x)] = (n * reach * draw::kSubOne) / 32768 / 16; + xProf_[static_cast(x)] = (n * xReach * draw::kSubOne) / 32768 / 16; } for (lengthType y = 0; y < h; y++) { // A different offset into the field, so the two axes are decoupled: one field read for // both would rise and fall together and slide the whole picture along a diagonal. - const int32_t n = static_cast(inoise16(static_cast(y) * cells, phase, 32768)) - 32768; - yProf_[static_cast(y)] = (n * reach * draw::kSubOne) / 32768 / 16; + const int32_t n = static_cast(inoise16(static_cast(y) * cellsY, phaseY, 32768)) - 32768; + yProf_[static_cast(y)] = (n * yReach * draw::kSubOne) / 32768 / 16; } } diff --git a/src/light/effects/EffectBase.h b/src/light/effects/EffectBase.h index b11fd668..566c2310 100644 --- a/src/light/effects/EffectBase.h +++ b/src/light/effects/EffectBase.h @@ -131,9 +131,23 @@ class EffectBase : public MoonModule { void setPan(nrOfLightsType index, uint8_t value); void setTilt(nrOfLightsType index, uint8_t value); void setZoom(nrOfLightsType index, uint8_t value); + /// The beam's own two roles, on the fixtures that carry them. `rotate` spins the gobo or the + /// prism; `gobo` selects the pattern, and on most heads its byte is a RANGE per slot rather + /// than an index, so a fixture's manual decides what a value means. + /// + /// Same contract as the aim setters above: a no-op where the channel is absent, and never + /// scaled by brightness. They complete the motion set the preset model already carries + /// (FixtureChannels holds all five), which until now had no way for an effect to reach them. + void setRotate(nrOfLightsType index, uint8_t value); + void setGobo(nrOfLightsType index, uint8_t value); /// True when the lights carry pan or tilt, so an effect can skip motion maths on a strip. bool movable() const; + + /// True when the lights carry a gobo or rotate channel, so an effect can hide beam controls + /// that would do nothing on this rig. Separate from movable(): plenty of heads pan and tilt + /// without a gobo wheel, and a static wash can carry one without moving at all. + bool hasBeam() const; }; } // namespace mm diff --git a/src/light/effects/FixedPointEffect.h b/src/light/effects/FixedPointEffect.h new file mode 100644 index 00000000..82dde934 --- /dev/null +++ b/src/light/effects/FixedPointEffect.h @@ -0,0 +1,594 @@ +#pragma once +// Sub-pixel geometry: shapes placed between pixels rather than on them. +// +// The point of this effect is a demonstration of a technique, not a picture. On a 16x16 panel a +// clock hand drawn on whole pixels jumps a full pixel at a time and reads as broken; the same hand +// placed at a fractional position and antialiased moves smoothly, because a pixel's BRIGHTNESS +// carries the fraction its position cannot. Everything here is built from that one idea, so a small +// matrix gets motion a whole-pixel renderer cannot express at any framerate. +// +// The shapes come from draw.h's sub-pixel family (`disc`, `ring`, `strokeLine`, `line`), which work +// in the 24.8 `pos_t` the whole draw layer speaks. Nothing here computes coverage itself. +// +// Concept and the original fixed-point canvas demos: Sutaburosu, in FastLED, via MoonLight +// (E_FastLED.h, "Fixed-Point Canvas Demo"). + +#include "core/math16.h" // sin16, cos16, BeatPhase +#include "light/Palette.h" // hsvToRgb: the trail's rainbow +#include "light/effects/EffectBase.h" + +namespace mm { + +/// Effect: sub-pixel shapes, drawn between pixels so small panels move smoothly. +/// @card FixedPointEffect.gif +class FixedPointEffect : public EffectBase { +public: + // πŸ’« for the origin (this came from MoonLight), πŸ–ŒοΈ because every shape is computed from a + // position rather than accumulated. The original's πŸ•πŸ†• were MoonLight's own convention and say + // nothing in ours: a tag here answers what a module IS, its shape, where it came from, what it + // reacts to, or which power function it rides, and the UI has a tooltip for each. + const char* tags() const override { return "πŸ’«πŸ–ŒοΈ"; } + Dim dimensions() const override { return Dim::D2; } + + /// Which demonstration, or `all` to cycle them. Each shows the same property from a different + /// angle: the clock through ROTATION, the orbits through RADIUS, and the two curve demos + /// through a PATH, where a trail of joined points is only smooth if its points are. + enum : uint8_t { kAll = 0, kClock, kOrbits, kStarWeb, kSpirograph, kLissajous, + kCubeThin, kCubeThick, kWalkers, kBoids, kHypotrochoid, kTree, kDemoCount }; + static constexpr const char* kDemoNames[] = { + "all", "clock", "orbits", "star web", "spirograph", "lissajous", + "cube thin", "cube thick", "walkers", "boids", "hypotrochoid", "tree"}; + static constexpr uint8_t kCycled = kDemoCount - 1; // how many `all` rotates through + + uint8_t demo = kAll; + /// How fast the whole scene runs, in BPM like every other effect here. + uint8_t bpm = 20; + /// How much of the previous frame survives. The trails are what make the motion legible: at 255 + /// the shapes are crisp, and lower values leave the path they swept. + uint8_t fade = 70; + /// Seconds each demo holds before `all` moves to the next. + uint8_t dwell = 12; + /// How far the whole scene drifts from the panel's center, in pixels. The original orbits its + /// origin rather than pinning it, which keeps a static figure from burning one spot into the + /// eye; 0 pins it. + uint8_t drift = 2; + /// The CAMERA, and the reason the clock swings across the screen rather than sitting still. + /// The original pushes in toward the second hand's tip on a 20 second sine, so the face grows + /// and slides off-center at the peak and settles back. 0 holds the camera still. + uint8_t zoom = 150; + + void defineControls() override { + controls_.addSelect("demo", demo, kDemoNames, kDemoCount); + controls_.addControl("bpm", bpm, 1, 120); + controls_.addControl("fade", fade, 0, 255); + controls_.addControl("dwell", dwell, 2, 60); + controls_.addControl("drift", drift, 0, 8); + controls_.addControl("zoom", zoom, 0, 255); + // `dwell` only means something while the demos are cycling. + controls_.setHidden(controls_.count() - 2, demo != kAll); + } + + void prepare() override { + phase_ = BeatPhase{}; + trailCount_ = 0; + trailHead_ = 0; + shown_ = 0xFF; + } + + void tick() MM_NONBLOCKING override { + const draw::Canvas cv = canvas(); + const lengthType w = width(), h = height(); + if (w == 0 || h == 0) return; + + // Fade rather than fill: these shapes are thin, and a hard clear would throw away the trail + // that makes a sweep readable. It still OWNS its background, since fade 255 clears fully. + draw::fade(cv, fade); + + const uint32_t ms = elapsed(); + phase_.advanceTo(ms, bpm); + const angle16 a = static_cast(phase_.phase(65536)); + + // Which demo is on screen. `all` walks them on a wall clock rather than on the phase, so + // the dwell is a time a user can set in seconds and does not change with bpm. + uint8_t active = demo; + if (demo == kAll) { + const uint32_t slot = dwell ? dwell : 1; + active = static_cast((ms / (slot * 1000u)) % kCycled + 1); + } + // A changed demo starts from a clean trail: the curve demos share one point buffer, and + // carrying a spirograph's points into a lissajous draws a line between two unrelated + // figures across the panel. + if (active != shown_) { + trailCount_ = 0; + trailHead_ = 0; + shown_ = active; + variant_++; // a different rosette each time hypotrochoid returns + seedSimulations(draw::toSub(w) / 2, draw::toSub(h) / 2); + } + + // The panel's center, and the drifting origin the scene actually uses. Its own slow circle + // (a third of the main rate) so the drift reads as a wander rather than as part of the + // figure's own motion. + const draw::pos_t px = draw::toSub(w) / 2; + const draw::pos_t py = draw::toSub(h) / 2; + const draw::pos_t wander = draw::toSub(drift); + const angle16 slow = static_cast(a / 3); + const draw::pos_t cx = px + scaleAngle(cos16(slow), wander); + const draw::pos_t cy = py + scaleAngle(sin16(slow), wander); + // The radius leaves room for the drift, so a wandering figure stays on the panel. + const draw::pos_t r = (px < py ? px : py) - wander - draw::toSub(1); + if (r <= 0) return; + + // THE CAMERA. The original pushes in toward the second hand's tip on a 20 second sine, and + // this is what makes the scene sweep across the panel rather than sit in the middle: at the + // peak the view is magnified AND off-center, so the figure slides out and grows. A camera + // that only scaled would pulse in place, which is a different and much duller thing. + draw::pos_t vx = cx, vy = cy, vr = r; + if (zoom > 0) { + const angle16 zp = static_cast((static_cast(ms % kZoomMs) * 65536u) / kZoomMs); + const int32_t zs = sin16(zp); + if (zs > 0) { + // Only the positive half of the sine pushes in, so the scene rests at normal size + // for half the cycle instead of oscillating continuously. + const int32_t amount = (zs * zoom) / 255; // 0..32767 + // Track the second hand's tip, which is the point the original follows. + const angle16 secA = static_cast((static_cast(ms % kSecMs) * 65536u) / kSecMs); + const draw::pos_t tipX = cx + scaleAngle(sin16(secA), r); + const draw::pos_t tipY = cy - scaleAngle(cos16(secA), r); + // Screen = center + (world - camera) * zoom, with the camera lerped toward the tip. + const draw::pos_t camX = cx + static_cast((static_cast(tipX - cx) * amount) / 32767); + const draw::pos_t camY = cy + static_cast((static_cast(tipY - cy) * amount) / 32767); + const int32_t mag = 65536 + (amount * 3); // up to ~2.5x, as the original + vx = cx + static_cast((static_cast(cx - camX) * mag) >> 16); + vy = cy + static_cast((static_cast(cy - camY) * mag) >> 16); + vr = static_cast((static_cast(r) * mag) >> 16); + } + } + + switch (active) { + case kClock: drawClock(cv, vx, vy, vr, ms); break; + case kOrbits: drawOrbits(cv, vx, vy, vr, a); break; + case kStarWeb: drawStarWeb(cv, vx, vy, vr, a); break; + case kSpirograph: drawSpirograph(cv, vx, vy, vr, a); break; + case kLissajous: drawLissajous(cv, vx, vy, vr, a); break; + case kCubeThin: drawCube(cv, vx, vy, vr, a, true); break; + case kCubeThick: drawCube(cv, vx, vy, vr, a, false); break; + case kWalkers: drawWalkers(cv, vx, vy, vr); break; + case kBoids: drawBoids(cv, vx, vy, vr); break; + case kHypotrochoid: drawHypotrochoid(cv, vx, vy, vr, a); break; + default: drawTree(cv, vx, vy, vr, ms); break; + } + } + +private: + /// A clock face: a rim, twelve tick marks and three hands on real gearing. + /// + /// The hands run on FIXED PERIODS from the millisecond clock rather than from `bpm`, which is + /// how the original does it and the reason it reads as a clock: a second hand that sweeps once + /// per period is recognizable, where one geared to an arbitrary speed control is just three + /// rotating sticks. Accelerated 10x from a real clock so a second completes in 6 seconds, and + /// the 1:12:144 ratio between the three is preserved exactly. + void drawClock(const draw::Canvas& cv, draw::pos_t cx, draw::pos_t cy, draw::pos_t r, + uint32_t ms) const { + // angle16 wraps at 65536, so a period maps onto it by plain modulo: no trigonometry needed + // to advance a hand, which is what keeps this integer-only. + const angle16 secA = static_cast((static_cast(ms % kSecMs) * 65536u) / kSecMs); + const angle16 minA = static_cast((static_cast(ms % kMinMs) * 65536u) / kMinMs); + const angle16 hourA = static_cast((static_cast(ms % kHourMs) * 65536u) / kHourMs); + + draw::ring(cv, cx, cy, r, draw::kSubOne, RGB{40, 40, 40}); + + // Twelve marks, every third one longer and brighter: the hour positions a face needs to be + // read at a glance, and without them the ring is just a circle. + for (uint8_t i = 0; i < 12; i++) { + const angle16 ta = static_cast(static_cast(i) * 65536u / 12u); + const bool major = (i % 3) == 0; + const draw::pos_t inner = major ? (r * 72) / 100 : (r * 82) / 100; + const RGB c = major ? RGB{200, 200, 200} : RGB{80, 80, 80}; + draw::line(cv, {draw::toPixel(cx + scaleAngle(sin16(ta), inner)), + draw::toPixel(cy - scaleAngle(cos16(ta), inner)), 0}, + {draw::toPixel(cx + scaleAngle(sin16(ta), r)), + draw::toPixel(cy - scaleAngle(cos16(ta), r)), 0}, c); + } + + // Hour hand: thick and short. Minute: medium and nearly full. The lengths are the + // original's 0.55 / 0.80 / 1.0 of the radius, which is what makes the three readable at a + // glance rather than three sticks of similar size. + hand(cv, cx, cy, (r * 55) / 100, hourA, (draw::kSubOne * 5) / 2, RGB{200, 200, 200}); + hand(cv, cx, cy, (r * 80) / 100, minA, (draw::kSubOne * 3) / 2, RGB{255, 255, 255}); + // Second hand: a thin red line with a short counterbalance tail past the hub, which is what + // a real sweep hand has and what makes its rotation legible at this size. + const draw::pos_t tail = r / 4; + draw::line(cv, {draw::toPixel(cx - scaleAngle(sin16(secA), tail)), + draw::toPixel(cy + scaleAngle(cos16(secA), tail)), 0}, + {draw::toPixel(cx + scaleAngle(sin16(secA), r)), + draw::toPixel(cy - scaleAngle(cos16(secA), r)), 0}, RGB{255, 40, 40}); + draw::disc(cv, cx, cy, draw::kSubOne, RGB{220, 220, 220}); // the hub, over the pivots + } + + /// Rings orbiting a common center, each on its own radius and rate: the second view of the same + /// property, where what moves smoothly is a SIZE rather than an angle. + void drawOrbits(const draw::Canvas& cv, draw::pos_t cx, draw::pos_t cy, draw::pos_t r, + angle16 a) const { + static constexpr RGB kColors[kOrbitCount] = { + {255, 80, 40}, {40, 200, 255}, {180, 255, 60}, {255, 60, 200}}; + for (uint8_t i = 0; i < kOrbitCount; i++) { + // Each orbit runs at its own rate and starts a quarter turn further round, so the four + // never bunch into one moving blob. + const angle16 own = static_cast(a * (i + 1) + i * 16384); + const draw::pos_t dist = (r * (i + 1)) / (kOrbitCount + 1); + const draw::pos_t ox = cx + scaleAngle(cos16(own), dist); + const draw::pos_t oy = cy + scaleAngle(sin16(own), dist); + // The ring BREATHES: its radius is a second oscillator, which is the sub-pixel case a + // whole-pixel renderer cannot show at all, because a radius under one pixel is either + // absent or a full pixel with nothing between. + const draw::pos_t rad = draw::kSubOne + scaleAngle(sin16(static_cast(own * 2)), + draw::kSubOne); + draw::ring(cv, ox, oy, rad, draw::kSubOne, kColors[i]); + } + } + + /// A spirograph: a pen on a wheel rolling inside a larger circle. The classic hypotrochoid, and + /// the figure only closes when the two rates share a small ratio, which is why 3:2 draws a + /// stable rosette rather than a smear. + void drawSpirograph(const draw::Canvas& cv, draw::pos_t cx, draw::pos_t cy, draw::pos_t r, + angle16 a) { + const draw::pos_t arm = (r * 2) / 3; // how far the wheel's hub sits out + const draw::pos_t pen = r / 3; // the pen's reach from that hub + const draw::pos_t hx = cx + scaleAngle(cos16(a), arm); + const draw::pos_t hy = cy + scaleAngle(sin16(a), arm); + // 3:2 against the hub's own rotation: the ratio IS the figure, and a whole-number one keeps + // it closed instead of precessing away. + const angle16 roll = static_cast(a * 3 / 2); + pushTrail(hx + scaleAngle(cos16(roll), pen), hy - scaleAngle(sin16(roll), pen)); + drawTrail(cv, 220); + } + + /// A Lissajous figure: two perpendicular oscillators at 3:2, with the phase drifting so the + /// figure morphs rather than repeating. Two sines are all it is, which is the point: the shape + /// comes from the RATIO, not from anything drawn. + void drawLissajous(const draw::Canvas& cv, draw::pos_t cx, draw::pos_t cy, draw::pos_t r, + angle16 a) { + // The phase creep is what turns a fixed figure into a morphing one. Slow, because at any + // speed the eye can follow it stops reading as one continuous shape. + const angle16 creep = static_cast(a / 16); + pushTrail(cx + scaleAngle(sin16(static_cast(a * 3 + creep)), r), + cy + scaleAngle(sin16(static_cast(a * 2)), r)); + drawTrail(cv, 230); + } + + /// A pentagram inside two rings: five vertices, each joined to its second neighbor. The star + /// is what the 5-and-2 pairing draws, and the inner ring sits at the golden-ratio radius the + /// pentagon's own geometry produces. + void drawStarWeb(const draw::Canvas& cv, draw::pos_t cx, draw::pos_t cy, draw::pos_t r, + angle16 a) const { + const draw::pos_t innerR = (r * 382) / 1000; // the inner pentagon's radius + draw::ring(cv, cx, cy, r, draw::kSubOne * 2, RGB{0, 0, 255}); + draw::ring(cv, cx, cy, innerR, draw::kSubOne, RGB{0, 60, 120}); + + draw::pos_t px[kStarPoints], py[kStarPoints]; + for (uint8_t i = 0; i < kStarPoints; i++) { + const angle16 va = static_cast(a + static_cast(i) * 65536u / kStarPoints); + px[i] = cx + scaleAngle(cos16(va), r); + py[i] = cy + scaleAngle(sin16(va), r); + } + // The stroke PULSES on a third harmonic, which is what keeps a static figure alive. + const draw::pos_t thick = draw::kSubOne + scaleAngle(sin16(static_cast(a * 3)), + (draw::kSubOne * 3) / 4); + for (uint8_t i = 0; i < kStarPoints; i++) { + const uint8_t j = static_cast((i + 2) % kStarPoints); // the second neighbor + draw::strokeLine(cv, px[i], py[i], px[j], py[j], thick, RGB{220, 220, 180}); + draw::line(cv, {draw::toPixel(cx), draw::toPixel(cy), 0}, + {draw::toPixel(px[i]), draw::toPixel(py[i]), 0}, RGB{60, 60, 60}); + } + for (uint8_t i = 0; i < kStarPoints; i++) + draw::disc(cv, px[i], py[i], (draw::kSubOne * 3) / 2, RGB{255, 255, 0}); + draw::disc(cv, cx, cy, draw::kSubOne * 2, RGB{255, 165, 0}); + } + + /// A wireframe cube in perspective, spun on two axes. The depth cue is BRIGHTNESS (and, when + /// thick, stroke width): a near edge is bright and wide, a far one dim and thin, which is what + /// makes eight points and twelve lines read as a solid rather than as a flat tangle. + void drawCube(const draw::Canvas& cv, draw::pos_t cx, draw::pos_t cy, draw::pos_t r, + angle16 a, bool thin) const { + static constexpr int8_t kVerts[8][3] = { + {-1, -1, -1}, {1, -1, -1}, {1, 1, -1}, {-1, 1, -1}, + {-1, -1, 1}, {1, -1, 1}, {1, 1, 1}, {-1, 1, 1}}; + static constexpr uint8_t kEdges[12][2] = { + {0, 1}, {1, 2}, {2, 3}, {3, 0}, {4, 5}, {5, 6}, {6, 7}, {7, 4}, + {0, 4}, {1, 5}, {2, 6}, {3, 7}}; + // The thin cube is drawn larger, since a hairline needs the size to read. + const draw::pos_t side = thin ? (r * 11) / 13 : (r * 7) / 13; + const draw::pos_t eye = r * 2; // the eye distance, which sets the perspective + + // Two rates that do not divide each other, so the cube tumbles instead of rocking. + const int32_t cosY = cos16(a), sinY = sin16(a); + const int32_t cosX = cos16(static_cast(a * 38 / 100)), sinX = sin16(static_cast(a * 38 / 100)); + + draw::pos_t px[8], py[8]; + int32_t pz[8]; + for (uint8_t i = 0; i < 8; i++) { + const int64_t x = static_cast(kVerts[i][0]) * side; + const int64_t y = static_cast(kVerts[i][1]) * side; + const int64_t z = static_cast(kVerts[i][2]) * side; + const int64_t x2 = (x * cosY - z * sinY) / 32767; + const int64_t z2 = (x * sinY + z * cosY) / 32767; + const int64_t y3 = (y * cosX - z2 * sinX) / 32767; + const int64_t z3 = (y * sinX + z2 * cosX) / 32767; + // The perspective divide. Clamped so a vertex swinging toward the eye cannot divide by + // zero and fling the projection off the panel. + int64_t denom = eye - z3; + if (denom < draw::kSubOne) denom = draw::kSubOne; + px[i] = cx + static_cast((x2 * eye) / denom); + py[i] = cy + static_cast((y3 * eye) / denom); + pz[i] = static_cast(z3); + } + for (uint8_t e = 0; e < 12; e++) { + const uint8_t p = kEdges[e][0], q = kEdges[e][1]; + const int32_t avgZ = (pz[p] + pz[q]) / 2; + int32_t br = 178 + (avgZ * 77) / (side ? side : 1); + if (br > 255) br = 255; + if (br < 0) br = 0; + const RGB col{static_cast(br), static_cast(br), static_cast(br)}; + if (thin) { + draw::line(cv, {draw::toPixel(px[p]), draw::toPixel(py[p]), 0}, + {draw::toPixel(px[q]), draw::toPixel(py[q]), 0}, col); + } else { + draw::pos_t thick = (draw::kSubOne * 9) / 5 + (avgZ * draw::kSubOne) / (side ? side : 1); + if (thick < draw::kSubOne / 2) thick = draw::kSubOne / 2; + draw::strokeLine(cv, px[p], py[p], px[q], py[q], thick, col); + } + } + } + + /// Six walkers on a damped random walk, each pulled back by a weak spring so they wander + /// without escaping. The spring is what separates this from noise: without it they leave and + /// never return, with it they stay in a loose cloud around the middle. + void drawWalkers(const draw::Canvas& cv, draw::pos_t cx, draw::pos_t cy, draw::pos_t r) { + for (uint8_t i = 0; i < kWalkerCount; i++) { + // The kick is HASHED from a step counter, not drawn from a stream RNG: two devices on + // one rig must walk the same path, and a per-call RNG diverges the moment their frame + // counts differ (math16.h, position-addressable randomness). + const int32_t kx = static_cast(hashInt(step_, i, 1)) - 32768; + const int32_t ky = static_cast(hashInt(step_, i, 2)) - 32768; + const draw::pos_t ax = static_cast((kx * draw::kSubOne) / 131072) + + static_cast((static_cast(cx - wx_[i]) * 6) / 1000); + const draw::pos_t ay = static_cast((ky * draw::kSubOne) / 131072) + + static_cast((static_cast(cy - wy_[i]) * 6) / 1000); + wvx_[i] = static_cast((static_cast(wvx_[i]) * 15) / 16) + ax; + wvy_[i] = static_cast((static_cast(wvy_[i]) * 15) / 16) + ay; + const draw::pos_t cap = draw::kSubOne * 3; + if (wvx_[i] > cap) wvx_[i] = cap; + if (wvx_[i] < -cap) wvx_[i] = -cap; + if (wvy_[i] > cap) wvy_[i] = cap; + if (wvy_[i] < -cap) wvy_[i] = -cap; + wx_[i] += wvx_[i]; + wy_[i] += wvy_[i]; + draw::disc(cv, wx_[i], wy_[i], draw::kSubOne * 2, + hsvToRgb(static_cast(whue_[i]), 230, 255)); + whue_[i]++; + } + (void)r; + step_++; + } + + /// Boids: separation, alignment and cohesion, the textbook three rules, plus a soft wall force. + /// The flock's shape is emergent, which is the point: nothing here says "make a V". + void drawBoids(const draw::Canvas& cv, draw::pos_t cx, draw::pos_t cy, draw::pos_t r) { + const draw::pos_t margin = draw::kSubOne * 3; + for (uint8_t i = 0; i < kBoidCount; i++) { + draw::pos_t ax = 0, ay = 0; + // Soft walls: a push that grows as a boid nears the edge, rather than a bounce, so the + // flock turns smoothly instead of ricocheting. + const draw::pos_t left = bx_[i] - (cx - r), right = (cx + r) - bx_[i]; + const draw::pos_t top = by_[i] - (cy - r), bottom = (cy + r) - by_[i]; + if (left < margin) ax += (margin - left) / 8; + if (right < margin) ax -= (margin - right) / 8; + if (top < margin) ay += (margin - top) / 8; + if (bottom < margin) ay -= (margin - bottom) / 8; + + draw::pos_t sepX = 0, sepY = 0, aliX = 0, aliY = 0, cohX = 0, cohY = 0; + uint8_t neighbors = 0; + for (uint8_t j = 0; j < kBoidCount; j++) { + if (j == i) continue; + const draw::pos_t dx = bx_[j] - bx_[i], dy = by_[j] - by_[i]; + const draw::pos_t adx = dx < 0 ? -dx : dx, ady = dy < 0 ? -dy : dy; + if (adx < draw::kSubOne * 3 && ady < draw::kSubOne * 3) { sepX -= dx; sepY -= dy; } + if (adx < draw::kSubOne * 7 && ady < draw::kSubOne * 7) { + aliX += bvx_[j]; aliY += bvy_[j]; + cohX += bx_[j]; cohY += by_[j]; + neighbors++; + } + } + ax += sepX / 16; + ay += sepY / 16; + if (neighbors > 0) { + ax += ((aliX / neighbors) - bvx_[i]) / 8 + ((cohX / neighbors) - bx_[i]) / 64; + ay += ((aliY / neighbors) - bvy_[i]) / 8 + ((cohY / neighbors) - by_[i]) / 64; + } + bvx_[i] = static_cast((static_cast(bvx_[i] + ax) * 39) / 40); + bvy_[i] = static_cast((static_cast(bvy_[i] + ay) * 39) / 40); + const draw::pos_t cap = draw::kSubOne * 2; + if (bvx_[i] > cap) bvx_[i] = cap; + if (bvx_[i] < -cap) bvx_[i] = -cap; + if (bvy_[i] > cap) bvy_[i] = cap; + if (bvy_[i] < -cap) bvy_[i] = -cap; + bx_[i] += bvx_[i]; + by_[i] += bvy_[i]; + // Drawn as a stroke along its own heading, so the flock shows which way it is going. + draw::strokeLine(cv, bx_[i] - bvx_[i] * 2, by_[i] - bvy_[i] * 2, bx_[i], by_[i], + draw::kSubOne, hsvToRgb(static_cast(bhue_[i]), 200, 255)); + } + } + + /// The general hypotrochoid: the spirograph with the wheel and pen sizes VARYING, so the figure + /// is a different rosette each cycle rather than the one fixed 3:2 curve. + void drawHypotrochoid(const draw::Canvas& cv, draw::pos_t cx, draw::pos_t cy, draw::pos_t r, + angle16 a) { + // The original's table of (wheel, pen) pairs, each giving a distinct petal count. + static constexpr uint8_t kWheel[] = {5, 4, 6, 8, 9, 3}; + static constexpr uint8_t kPen[] = {8, 8, 7, 6, 6, 7}; + static constexpr uint8_t kVariants = 6; + const uint8_t v = static_cast((hashInt(variant_) % kVariants)); + const draw::pos_t arm = (r * (13 - kWheel[v])) / 13; + const draw::pos_t pen = (r * kPen[v]) / 13; + const draw::pos_t hx = cx + scaleAngle(cos16(a), arm); + const draw::pos_t hy = cy + scaleAngle(sin16(a), arm); + // The wheel's own rotation is geared to how far it has rolled: (R-r)/r turns per turn. + const angle16 roll = static_cast(static_cast(a) * (13 - kWheel[v]) / kWheel[v]); + // Pre-fill on the first frame, as the original does: without it the figure spends its first + // second drawing itself one segment at a time, and on a short dwell it never completes. + if (trailCount_ == 0) + for (uint8_t i = 0; i < kTrailMax; i++) { + const angle16 back = static_cast(a - (kTrailMax - i) * kCurveStep); + const angle16 br = static_cast(static_cast(back) * (13 - kWheel[v]) / kWheel[v]); + pushTrail(cx + scaleAngle(cos16(back), arm) + scaleAngle(cos16(br), pen), + cy + scaleAngle(sin16(back), arm) - scaleAngle(sin16(br), pen)); + } + pushTrail(hx + scaleAngle(cos16(roll), pen), hy - scaleAngle(sin16(roll), pen)); + drawTrail(cv, 200); + } + + /// A tree drawn by recursion: a trunk that forks into two shorter branches, each of which forks + /// again. Six levels, swaying on a wind cycle and growing on a slower one, so it is never the + /// same picture twice. + void drawTree(const draw::Canvas& cv, draw::pos_t cx, draw::pos_t cy, draw::pos_t r, + uint32_t ms) const { + // Wind on a 9 second cycle, growth on a 10 second one: two periods that do not divide, so + // the tree never repeats a pose exactly. + const angle16 windP = static_cast((static_cast(ms % 9000u) * 65536u) / 9000u); + const int32_t sway = (sin16(windP) * 3932) / 32767; + const angle16 growP = static_cast((static_cast(ms % 10000u) * 65536u) / 10000u); + // (1 - cos)/2 grows smoothly from nothing to full and back, with no corner at either end. + const int32_t grow = (32767 - cos16(growP)) / 2; + // The spread opens over the FIRST HALF of the growth, so the trunk rises before it forks. + int32_t spreadScale = grow * 2; + if (spreadScale > 32767) spreadScale = 32767; + const int32_t spread = (5100 * spreadScale) / 32767; // up to ~28 degrees in angle16 + + const draw::pos_t trunkY = cy + (r * 99) / 100; + // A FLOOR under the growth: the cycle bottoms out at zero, and a tree of zero length is a + // blank panel that reads as a broken effect rather than as a seed. A quarter-height trunk + // is still visibly a trunk, and the growth above it is what the cycle shows. + const int32_t grown = 8192 + (grow * 3) / 4; // a quarter, plus three quarters of the cycle + const draw::pos_t trunkLen = static_cast((static_cast(r) * 55 * grown) / (100 * 32767)); + branch(cv, cx, trunkY, 0, trunkLen, 6, sway, spread); + } + + /// One branch, and its two children. Recursive because a tree IS the recursion: the same shape + /// at a smaller scale, which is why six lines of code draw sixty-three branches. + void branch(const draw::Canvas& cv, draw::pos_t x0, draw::pos_t y0, int32_t angle, + draw::pos_t len, uint8_t depth, int32_t sway, int32_t spread) const { + if (depth == 0 || len < draw::kSubOne / 2) return; + // The sway accumulates with depth, so a tip moves further than the trunk, which is what + // wind actually does to a tree. + const int32_t a = angle + sway * depth; + const draw::pos_t x1 = x0 + scaleAngle(sin16(static_cast(a)), len); + const draw::pos_t y1 = y0 - scaleAngle(cos16(static_cast(a)), len); + // Brown at the trunk to green at the tips, by depth. + const uint8_t g = static_cast(60 + (6 - depth) * 30); + draw::line(cv, {draw::toPixel(x0), draw::toPixel(y0), 0}, + {draw::toPixel(x1), draw::toPixel(y1), 0}, + RGB{static_cast(120 - depth * 10), g, 40}); + const draw::pos_t childLen = (len * 7) / 10; + branch(cv, x1, y1, a - spread, childLen, static_cast(depth - 1), sway, spread); + branch(cv, x1, y1, a + spread, childLen, static_cast(depth - 1), sway, spread); + } + + /// Place the walkers and boids for a fresh run. Spread by HASH rather than by a stream RNG, + /// for the same reason the walkers' kicks are: two devices showing one rig must agree. + void seedSimulations(draw::pos_t cx, draw::pos_t cy) { + for (uint8_t i = 0; i < kWalkerCount; i++) { + wx_[i] = cx; wy_[i] = cy; + wvx_[i] = 0; wvy_[i] = 0; + whue_[i] = static_cast(i * 43); // hues about 60 degrees apart + } + for (uint8_t i = 0; i < kBoidCount; i++) { + bx_[i] = cx + static_cast((static_cast(hashInt(variant_, i, 3)) - 32768) / 8); + by_[i] = cy + static_cast((static_cast(hashInt(variant_, i, 4)) - 32768) / 8); + bvx_[i] = static_cast((static_cast(hashInt(variant_, i, 5)) - 32768) / 128); + bvy_[i] = static_cast((static_cast(hashInt(variant_, i, 6)) - 32768) / 128); + bhue_[i] = static_cast(i * 36); + } + } + + /// Remember one pen position. A ring buffer, because the trail is a fixed-length window over an + /// endless path: the oldest point falls off as the newest arrives. + void pushTrail(draw::pos_t x, draw::pos_t y) { + trailX_[trailHead_] = x; + trailY_[trailHead_] = y; + trailHead_ = static_cast((trailHead_ + 1) % kTrailMax); + if (trailCount_ < kTrailMax) trailCount_++; + } + + /// Join the remembered points, oldest dark to newest bright. The gradient is what gives the + /// curve a direction: a uniformly lit trail reads as a static wire figure. + void drawTrail(const draw::Canvas& cv, uint8_t saturation) const { + if (trailCount_ < 2) return; + for (uint8_t i = 0; i + 1 < trailCount_; i++) { + // Walk from the OLDEST point, which is the one the head is about to overwrite. + const uint8_t start = static_cast((trailHead_ + kTrailMax - trailCount_) % kTrailMax); + const uint8_t p = static_cast((start + i) % kTrailMax); + const uint8_t q = static_cast((p + 1) % kTrailMax); + const uint8_t br = static_cast((static_cast(i) * 255u) / (trailCount_ - 1)); + // Hue and brightness both ride the age, so the trail fades out as it goes back in time + // and the newest segment is both brightest and furthest round the wheel. + draw::strokeLine(cv, trailX_[p], trailY_[p], trailX_[q], trailY_[q], draw::kSubOne, + hsvToRgb(br, saturation, br)); + } + } + + /// One hand: a thick stroke from the hub outward at `a`. Its own function because the three + /// differ only in length, angle and weight, and three copies would be three places to fix. + void hand(const draw::Canvas& cv, draw::pos_t cx, draw::pos_t cy, draw::pos_t len, angle16 a, + draw::pos_t thickness, RGB c) const { + // Twelve o'clock is UP, and up is -y on a light grid: a hand at angle 0 must point at the + // top of the panel, not at the right edge, which is where the raw cos/sin pair puts it. + const draw::pos_t tx = cx + scaleAngle(sin16(a), len); + const draw::pos_t ty = cy - scaleAngle(cos16(a), len); + draw::strokeLine(cv, cx, cy, tx, ty, thickness, c); + } + + /// A signed 16-bit wave scaled to a sub-pixel distance. sin16 returns -32767..32767, so this is + /// the one place the wave's range meets the draw layer's units. + static draw::pos_t scaleAngle(int32_t wave, draw::pos_t distance) { + return static_cast((wave * static_cast(distance)) / 32767); + } + + /// The clock's periods, accelerated 10x from a real clock so a second hand sweeps in 6 + /// seconds: the original's kSecPeriod / kMinPeriod / kHrPeriod, in the same 1:12:144 ratio. + static constexpr uint32_t kZoomMs = 20000u; ///< the camera push-in cycle + static constexpr uint32_t kSecMs = 6000u; + static constexpr uint32_t kMinMs = 72000u; + static constexpr uint32_t kHourMs = 864000u; + + static constexpr uint8_t kOrbitCount = 4; + static constexpr uint16_t kCurveStep = 512; ///< how far a pre-filled trail steps back per point + static constexpr uint8_t kStarPoints = 5; ///< a pentagram: 5 vertices, joined 2 apart + static constexpr uint8_t kWalkerCount = 6; + static constexpr uint8_t kBoidCount = 7; + /// The trail window. 64 points is enough for a rosette to close visibly while costing 512 bytes + /// of members, which a small ESP32 can carry without a heap allocation. + static constexpr uint8_t kTrailMax = 64; + + BeatPhase phase_; + draw::pos_t trailX_[kTrailMax] = {}; + draw::pos_t trailY_[kTrailMax] = {}; + uint8_t trailHead_ = 0; + uint8_t trailCount_ = 0; + uint8_t shown_ = 0xFF; ///< which demo drew last, so a switch can clear the trail + + /// The simulation demos keep their own state between frames, which is what makes them + /// simulations rather than functions of time. Seeded on a demo switch, since a walker starting + /// wherever the last one stopped is a visible jump. + draw::pos_t wx_[kWalkerCount] = {}, wy_[kWalkerCount] = {}; + draw::pos_t wvx_[kWalkerCount] = {}, wvy_[kWalkerCount] = {}; + uint8_t whue_[kWalkerCount] = {}; + draw::pos_t bx_[kBoidCount] = {}, by_[kBoidCount] = {}; + draw::pos_t bvx_[kBoidCount] = {}, bvy_[kBoidCount] = {}; + uint8_t bhue_[kBoidCount] = {}; + uint32_t step_ = 0; ///< hashed for the walkers' kicks, so two devices walk alike + uint32_t variant_ = 0; ///< which hypotrochoid, rolled when the demo restarts +}; + +} // namespace mm diff --git a/src/light/effects/MovingHeadEffect.h b/src/light/effects/MovingHeadEffect.h index 79c35cf7..621c09c2 100644 --- a/src/light/effects/MovingHeadEffect.h +++ b/src/light/effects/MovingHeadEffect.h @@ -55,6 +55,18 @@ class MovingHeadEffect : public EffectBase { uint8_t panCenter = 128; uint8_t tiltCenter = 128; + /// The beam itself, on a head that has these wheels. Both are raw fixture bytes rather than a + /// count of slots: a gobo channel is a range per pattern on most heads and every model splits + /// it differently, so only the fixture's manual can say what a value selects. Left where they + /// are on a fixture without the channel, and invisible on a rig that has neither. + uint8_t gobo = 0; + uint8_t rotate = 0; + /// Change gobo on a bass hit rather than holding one pattern all night, the one thing a static + /// value cannot do. Idea from MoonLight's Troy1 Move, which rolls a new pattern on a kick and + /// then refuses to roll again for a few seconds: without that hold a busy track strobes through + /// patterns too fast to read as anything. + bool goboOnBeat = false; + /// Move and light with the music: the beam swings wider as the room gets louder, each head /// brightens on its own frequency band, and a beat kicks the whole rig. Silence holds it still, /// which is what makes the mode read as reactive rather than merely animated. @@ -69,12 +81,27 @@ class MovingHeadEffect : public EffectBase { controls_.addControl("panCenter", panCenter, 0, 255); controls_.addControl("tiltCenter", tiltCenter, 0, 255); controls_.addControl("audioReactive", audioReactive); + // Offered only where a head carries the wheels: on an LED strip, or a head without them, + // the writes are no-ops and the sliders would be three controls that do nothing. + controls_.addControl("gobo", gobo, 0, 255); + controls_.addControl("rotate", rotate, 0, 255); + controls_.addControl("goboOnBeat", goboOnBeat); + const bool noBeam = !hasBeam(); + const uint8_t last = controls_.count(); + controls_.setHidden(last - 3, noBeam); // gobo + controls_.setHidden(last - 2, noBeam); // rotate + controls_.setHidden(last - 1, noBeam); // goboOnBeat } void prepare() override { pan_ = BeatPhase{}; tilt_ = BeatPhase{}; beatDecay_ = 0; + // The rolled gobo starts from the slider, so a rig comes back on the pattern the user + // chose rather than whatever a beat left behind before the last restart. + goboNow_ = gobo; + goboHold_ = 0; + beatCount_ = 0; } void tick() MM_NONBLOCKING override { @@ -103,10 +130,31 @@ class MovingHeadEffect : public EffectBase { // A beat widens the sweep and flares the color, then decays over ~20 frames. Without the // decay a kick is a single-frame flicker that no eye can follow. - if (live && audio->level > audio->levelSmoothed + kBeatMargin) beatDecay_ = 255; + const bool beat = live && audio->level > audio->levelSmoothed + kBeatMargin; + if (beat) beatDecay_ = 255; else if (beatDecay_ > kBeatDecayStep) beatDecay_ = static_cast(beatDecay_ - kBeatDecayStep); else beatDecay_ = 0; + // A beat rolls a new gobo, but only after a HOLD: a pattern needs a few seconds on screen + // to read as a pattern, and a four-to-the-floor kick would otherwise change it four times a + // second into a flicker. `gobo` is the base the roll walks from, so the slider still says + // which family of patterns the rig is in. + if (goboOnBeat) { + if (beat && goboHold_ == 0) { + // hashInt of a BEAT COUNTER, not a stream RNG: two devices running the same rig + // must land on the same pattern, and a per-call RNG diverges forever the moment one + // of them renders an extra frame (math16.h, position-addressable randomness). + beatCount_++; + goboNow_ = static_cast(gobo + (hashInt(beatCount_) & 0xE0)); // 8 coarse slots + goboHold_ = kGoboHoldFrames; + } else if (goboHold_ > 0) { + goboHold_--; + } + } else { + goboNow_ = gobo; // the slider IS the value when the beat roll is off + goboHold_ = 0; + } + // Loud music opens the beam to its full range, quiet keeps it tight. In silence the rig // HOLDS its aim rather than drifting. const uint16_t loud = live ? audio->levelSmoothed : 0; @@ -119,6 +167,11 @@ class MovingHeadEffect : public EffectBase { const Formation f = shape(hx, hy, hz, w, h, d); + // The beam wheels, written every frame like any other role so a value the user changes + // takes effect at once. Both are no-ops on a fixture without the channel. + setGobo(i, goboNow_); + setRotate(i, rotate); + // A frozen rig keeps its last aim: writing from a stopped phase would snap it back. if (!frozen) { const int32_t p = sin16(static_cast(panPhase + f.phase)); @@ -159,6 +212,9 @@ class MovingHeadEffect : public EffectBase { static constexpr uint16_t kBeatMargin = 8; // raw over smoothed = a transient static constexpr uint8_t kBeatDecayStep = 12; // ~20 frames from a kick back to rest static constexpr uint8_t kDimFloor = 40; // a quiet band still shows its head + /// How long a rolled gobo stays put, in frames. About two seconds at 60 fps: long enough to + /// read the pattern, short enough that the rig still answers the music. + static constexpr uint8_t kGoboHoldFrames = 120; /// One head's place in the formation: a phase offset into the sweep, and a direction. struct Formation { uint16_t phase; int32_t dir; }; @@ -235,6 +291,11 @@ class MovingHeadEffect : public EffectBase { BeatPhase pan_; BeatPhase tilt_; uint8_t beatDecay_ = 0; + /// The gobo actually written, which is the slider until a beat rolls it. Held separate so the + /// slider keeps saying what the user chose rather than being overwritten by the roll. + uint8_t goboNow_ = 0; + uint8_t goboHold_ = 0; // frames left before another beat may roll again + uint32_t beatCount_ = 0; // hashed for the roll: shared by every device on the same audio }; } // namespace mm diff --git a/src/light/layers/Layer.h b/src/light/layers/Layer.h index 11cb31e7..2243befc 100644 --- a/src/light/layers/Layer.h +++ b/src/light/layers/Layer.h @@ -751,7 +751,23 @@ inline void EffectBase::setTilt(nrOfLightsType index, uint8_t value) { inline void EffectBase::setZoom(nrOfLightsType index, uint8_t value) { effectSetChannel(layer(), index, layer()->fixtureChannels().zoom, value); } +inline void EffectBase::setRotate(nrOfLightsType index, uint8_t value) { + effectSetChannel(layer(), index, layer()->fixtureChannels().rotate, value); +} +inline void EffectBase::setGobo(nrOfLightsType index, uint8_t value) { + effectSetChannel(layer(), index, layer()->fixtureChannels().gobo, value); +} inline bool EffectBase::movable() const { return layer()->fixtureChannels().movable(); } +inline bool EffectBase::hasBeam() const { + // Null-checked, unlike the accessors above, because this one is called from defineControls(): + // /api/types and /api/modules build a PARENTLESS probe instance to read an effect's control set + // (ModuleFactory::registerType), and a bare layer() there dereferences null. An unparented + // effect has no fixture, so it has no beam. + const Layer* l = layer(); + if (!l) return false; + const FixtureChannels& fc = l->fixtureChannels(); + return fc.gobo != FixtureChannels::kAbsent || fc.rotate != FixtureChannels::kAbsent; +} inline nrOfLightsType EffectBase::nrOfLights() const { return layer()->buffer().count(); } inline uint32_t EffectBase::elapsed() const { return layer()->elapsed(); } inline draw::Canvas EffectBase::canvas() { diff --git a/src/light/layouts/Rings241Layout.h b/src/light/layouts/Rings241Layout.h index e8909548..79febe8a 100644 --- a/src/light/layouts/Rings241Layout.h +++ b/src/light/layouts/Rings241Layout.h @@ -45,10 +45,19 @@ class Rings241Layout : public LayoutBase { // Wiring order: false = light 0 at the center, rings outward (MoonLight's // order); true = light 0 on the outer ring, rings inward. bool outside_in = false; // "outside in" + // Where light 0 of each ring sits, in degrees from the bottom. Named for + // RingLayout's control of the same meaning, NOT `rotation`: that word is + // taken in this family for the arc a partial ring spans, and one word with + // two meanings across two ring layouts is worse than a longer name. A disc + // is soldered with its first LED wherever the builder started, so without + // this the image is fixed against the hardware. 0 keeps MoonLight's + // placement, which is why it is the default. + uint16_t angleFirst = 0; void defineControls() override { controls_.addControl("scale", scale, 1, 10); controls_.addControl("outside in", outside_in); + controls_.addControl("angleFirst", angleFirst, 0, 359); } nrOfLightsType lightCount() const override { @@ -79,10 +88,14 @@ class Rings241Layout : public LayoutBase { float x = static_cast(scale * leftMargin); float y = static_cast(scale * leftMargin); if (n != 1) { - // angleFirst = 0, so RingLayout's angleRad = Ο€ + 2π·i / n. + // RingLayout's angleRad = Ο€ + 2π·i / n + 2π·angleFirst / 360. // Formed in double (MoonLight's PI/TWO_PI are double macros), - // then narrowed to float for the float sinf/cosf below. - const float angleRad = static_cast(kPi + (kTwoPi * static_cast(i)) / static_cast(n)); + // then narrowed to float for the float sinf/cosf below. The + // angleFirst term rides in the same double expression so an + // angleFirst of 0 is bit-identical to MoonLight's placement. + const float angleRad = static_cast( + kPi + (kTwoPi * static_cast(i)) / static_cast(n) + + (kTwoPi * static_cast(angleFirst)) / 360.0); x -= scale * std::sin(angleRad) * radius; y += scale * std::cos(angleRad) * radius; } diff --git a/src/light/moonlive/MoonLiveBuiltins_light.h b/src/light/moonlive/MoonLiveBuiltins_light.h index 0ed4468e..91bc6c9c 100644 --- a/src/light/moonlive/MoonLiveBuiltins_light.h +++ b/src/light/moonlive/MoonLiveBuiltins_light.h @@ -385,7 +385,9 @@ struct CoordSink { CoordFn fn = nullptr; void* ctx = nullptr; }; using PalFn = void (*)(void* ctx, uint8_t index, uint8_t r, uint8_t g, uint8_t b); struct PalSink { PalFn fn = nullptr; void* ctx = nullptr; }; -enum class MotionAxis : uint8_t { Pan = 0, Tilt = 1 }; +/// The five fixture roles, in the order FixtureChannels declares them. One sink and one host +/// function serve all of them, which is why the enum grows rather than each role adding its own. +enum class MotionAxis : uint8_t { Pan = 0, Tilt = 1, Zoom = 2, Rotate = 3, Gobo = 4 }; using MotionFn = void (*)(void* ctx, MotionAxis axis, uint32_t index, uint8_t value); struct MotionSink { MotionFn fn = nullptr; void* ctx = nullptr; }; @@ -997,7 +999,7 @@ extern "C" inline uint32_t mm_light_onBeat(const uintptr_t*, uint32_t, const uin return a->level > a->levelSmoothed + kBeatMargin ? 1 : 0; } -/// setPan(index, value) / setTilt(index, value) β†’ aim one moving head. +/// setPan / setTilt / setZoom / setRotate / setGobo (index, value) β†’ aim and shape one head. /// /// A NO-OP when the light carries no such channel, which is the property that lets one script run /// on a moving head and on an LED strip: the strip has no pan channel, nothing is written, and the @@ -1008,23 +1010,32 @@ extern "C" inline uint32_t mm_light_onBeat(const uintptr_t*, uint32_t, const uin /// from the layer's fixture channel map, and the engine has no notion of one. Motion is written /// once per HEAD per frame where color is written per pixel, so the per-call cost is not on the /// same path as setRGB's. -extern "C" inline uint32_t mm_light_set_pan(const uintptr_t* args, uint32_t, const uint8_t*) { +/// The one body all five role builtins share: they differ only in which axis they name, and five +/// copies of this would be five places for the byteArg rule below to rot. +/// +/// byteArg, not a raw widen: a script computing an aim below zero (pan - 50 past the end) +/// reinterprets as a huge unsigned here and clamps to 255, slamming the head to the OPPOSITE +/// extreme. byteArg is the one home for the signed reading every other builtin uses. +inline uint32_t motionWrite(MotionAxis axis, const uintptr_t* args) { const MotionSink& m = motionSink(); if (!m.fn) return 0; - // byteArg, not a raw widen: a script computing an aim below zero (pan - 50 past the - // end) reinterprets as a huge unsigned here and clamped to 255, slamming the head to the - // OPPOSITE extreme. byteArg is the one home for the signed reading every other builtin uses. - m.fn(m.ctx, MotionAxis::Pan, uint32_t(args[0]), byteArg(args[1])); + m.fn(m.ctx, axis, uint32_t(args[0]), byteArg(args[1])); return 0; } +extern "C" inline uint32_t mm_light_set_pan(const uintptr_t* args, uint32_t, const uint8_t*) { + return motionWrite(MotionAxis::Pan, args); +} extern "C" inline uint32_t mm_light_set_tilt(const uintptr_t* args, uint32_t, const uint8_t*) { - const MotionSink& m = motionSink(); - if (!m.fn) return 0; - // byteArg, not a raw widen: a script computing an aim below zero (pan - 50 past the - // end) reinterprets as a huge unsigned here and clamped to 255, slamming the head to the - // OPPOSITE extreme. byteArg is the one home for the signed reading every other builtin uses. - m.fn(m.ctx, MotionAxis::Tilt, uint32_t(args[0]), byteArg(args[1])); - return 0; + return motionWrite(MotionAxis::Tilt, args); +} +extern "C" inline uint32_t mm_light_set_zoom(const uintptr_t* args, uint32_t, const uint8_t*) { + return motionWrite(MotionAxis::Zoom, args); +} +extern "C" inline uint32_t mm_light_set_rotate(const uintptr_t* args, uint32_t, const uint8_t*) { + return motionWrite(MotionAxis::Rotate, args); +} +extern "C" inline uint32_t mm_light_set_gobo(const uintptr_t* args, uint32_t, const uint8_t*) { + return motionWrite(MotionAxis::Gobo, args); } /// pool(n) β†’ size this script's particle pool to n particles, and report what it actually got. @@ -1360,7 +1371,7 @@ inline const BuiltinTable& lightBuiltins() { t.add({"flowCurl", 2, false, BuiltinKind::Call, &mm_light_flowCurl, {}}); t.add({"trailDecay", 1, false, BuiltinKind::Call, &mm_light_trailDecay, {}}); t.add({"emitTrail", 6, false, BuiltinKind::Call, &mm_light_emitTrail, {}}); - // setPan(index, value) / setTilt(index, value) β†’ aim a moving head. Calls, not Inline stores: + // setPan / setTilt / setZoom / setRotate / setGobo β†’ aim a head. Calls, not Inline stores: // the channel offset comes from the layer's fixture map, which the engine cannot see. // The audio vocabulary. All return 0 without audio, so a script written for a rig with a // microphone still runs on one without: it simply renders nothing rather than failing. @@ -1377,6 +1388,12 @@ inline const BuiltinTable& lightBuiltins() { t.add({"audioBeat", 0, /*returns*/ true, BuiltinKind::Call, &mm_light_onBeat, {}}); t.add({"setPan", 2, /*returns*/ false, BuiltinKind::Call, &mm_light_set_pan, {}}); t.add({"setTilt", 2, /*returns*/ false, BuiltinKind::Call, &mm_light_set_tilt, {}}); + // The rest of the fixture roles, same shape and same no-op-where-absent contract. A head that + // carries a zoom, a gobo wheel or a prism is aimed AND shaped from a script, which is what a + // moving-head look needs beyond pan and tilt. + t.add({"setZoom", 2, /*returns*/ false, BuiltinKind::Call, &mm_light_set_zoom, {}}); + t.add({"setRotate", 2, /*returns*/ false, BuiltinKind::Call, &mm_light_set_rotate, {}}); + t.add({"setGobo", 2, /*returns*/ false, BuiltinKind::Call, &mm_light_set_gobo, {}}); // pool(n) β†’ size this script's particle pool, from defineControls(). Returns the // count actually available, 0 when the allocation failed. See mm_light_pool. t.add({"pool", 1, /*returns*/ true, BuiltinKind::Call, &mm_light_pool, {}}); diff --git a/src/light/moonlive/MoonLiveEffect.h b/src/light/moonlive/MoonLiveEffect.h index 197bc7dc..c96ae5ad 100644 --- a/src/light/moonlive/MoonLiveEffect.h +++ b/src/light/moonlive/MoonLiveEffect.h @@ -121,15 +121,20 @@ class MoonLiveEffect : public EffectBase { moonlive::setFadeSink([](void* ctx, uint8_t amt) { if (Layer* l = static_cast(ctx)->layer()) l->fadeToBlackBy(amt); }, this); - // setPan/setTilt reach the fixture's motion channels, whose offsets live in the layer's + // The role setters reach the fixture's motion channels, whose offsets live in the layer's // channel map. Routed through EffectBase's own setters, so a script aims a head by exactly // the path a compiled effect does, including the no-op on a light that has no such channel. moonlive::setMotionSink([](void* ctx, moonlive::MotionAxis axis, uint32_t index, uint8_t value) { auto* self = static_cast(ctx); const auto i = static_cast(index); - if (axis == moonlive::MotionAxis::Pan) self->setPan(i, value); - else self->setTilt(i, value); + switch (axis) { + case moonlive::MotionAxis::Pan: self->setPan(i, value); break; + case moonlive::MotionAxis::Tilt: self->setTilt(i, value); break; + case moonlive::MotionAxis::Zoom: self->setZoom(i, value); break; + case moonlive::MotionAxis::Rotate: self->setRotate(i, value); break; + case moonlive::MotionAxis::Gobo: self->setGobo(i, value); break; + } }, this); // The particle builtins reach this effect's own pool, with the frame scale the binding // computed: framerate independence is the system's property, not the script author's. diff --git a/src/light/moonlive/MoonLiveScript.h b/src/light/moonlive/MoonLiveScript.h index b354c211..5777435c 100644 --- a/src/light/moonlive/MoonLiveScript.h +++ b/src/light/moonlive/MoonLiveScript.h @@ -29,7 +29,17 @@ class MoonLiveScript { /// editor the position it marks the failing line from: the errors hardest to read were exactly /// the ones that lost their explanation AND their highlight. Public because a unit test pins it /// against the compiler's own messages, which is what stops the two drifting apart again. - static constexpr size_t kMaxStatus = 72; + /// Sized from the WORST line the code can produce, which the status-fits test recomputes from + /// the compiler's own diagnostics: the longest message (62), the longer of the two shadow marks + /// with its ": " (34), and the machine-read " @" suffix (8). At 72 the suffix was what + /// fell off, and the editor silently stopped marking the failing line. + static constexpr size_t kMaxStatus = 112; + /// What the status says when the user's copy is hiding a shipped one (`scriptShadowsFactory`). + /// One constant because the status-fits test budgets its length against kMaxStatus. + static constexpr const char* kShadowMark = "edited copy"; + /// Said instead of kShadowMark when the shipped copy has moved on since the fork: the one + /// sentence that turns "why is my edit being used" into "the library has a newer version". + static constexpr const char* kStaleMark = "edited copy, shipped one updated"; /// Let a binding that owns a particle pool size it from the script's defineControls(). Null for /// a binding with no particles, which is every binding but the effect today. @@ -99,6 +109,12 @@ class MoonLiveScript { // the one budget it is closest to using up. The card's memory figure is the ALLOCATION, // word-rounded, which says nothing about the program itself. engine_.describe(statusBuf_, sizeof(statusBuf_)); + // Name a SHADOW when there is one, on success as much as on failure: the copy that + // compiled is the user's, and a push to the shipped one will change nothing on screen. + if (shadowMark()) { + const size_t n = std::strlen(statusBuf_); + std::snprintf(statusBuf_ + n, sizeof(statusBuf_) - n, ", %s", shadowMark()); + } owner.setStatus(statusBuf_, MoonModule::Severity::Status); compileFailed_ = false; } else { @@ -107,9 +123,20 @@ class MoonLiveScript { // control for the number would be a field every non-scripted module carries for nothing. // The suffix is machine-read, so it stays a fixed shape rather than a sentence. if (engine_.hasErrorPos()) { - std::snprintf(statusBuf_, sizeof(statusBuf_), "%s @%u", - err ? err : "compile failed", - static_cast(engine_.errorPos())); + // The shadow marker goes in FRONT: the `@` suffix is machine-read and must + // stay last, and the offset only makes sense against the copy that was compiled. + // Suffix FIRST, message into what is left: a message too long for the buffer + // loses its tail, never the offset the editor parses. + char at[12]; + std::snprintf(at, sizeof(at), " @%u", static_cast(engine_.errorPos())); + const size_t room = sizeof(statusBuf_) - std::strlen(at) - 1; + const char* mark = shadowMark(); + int n = std::snprintf(statusBuf_, room + 1, "%s%s%s", + mark ? mark : "", mark ? ": " : "", + err ? err : "compile failed"); + if (n < 0) n = 0; + if (static_cast(n) > room) n = static_cast(room); + std::snprintf(statusBuf_ + n, sizeof(statusBuf_) - static_cast(n), "%s", at); owner.setStatus(statusBuf_, MoonModule::Severity::Error); } else { owner.setStatus(err, MoonModule::Severity::Error); @@ -271,6 +298,14 @@ class MoonLiveScript { const char* tags_ = nullptr; // Backing store for the status line: MoonModule::setStatus keeps a POINTER, so the text has to // outlive the call. The same module-owned pattern NetworkModule uses. + /// Which shadow note this script's status should carry, or null when the file being compiled is + /// the only copy of it. Asked on every compile (a cold path), and asked ONCE per status line so + /// the success and failure branches cannot drift into saying different things. + const char* shadowMark() const { + if (!moonlive::scriptShadowsFactory(name_)) return nullptr; + return moonlive::scriptFactoryMovedOn(name_) ? kStaleMark : kShadowMark; + } + char statusBuf_[kMaxStatus] = {}; // The script's FILE NAME, inside the shared script directory. Empty on a fresh card: it reports // "no script" until one is named, rather than every new module compiling the same default. diff --git a/src/light/moonlive/MoonLiveScriptFile.h b/src/light/moonlive/MoonLiveScriptFile.h index f7c3516c..646436f3 100644 --- a/src/light/moonlive/MoonLiveScriptFile.h +++ b/src/light/moonlive/MoonLiveScriptFile.h @@ -203,6 +203,124 @@ inline bool resolveScript(const char* name, char* out, size_t outLen) { return true; } +/// LINEAGE: the hash of the shipped copy a user's edit was forked FROM, kept beside the fork. +/// +/// The fork itself cannot carry it. A script is user-facing text shown in the device's own editor, +/// so a provenance line in the file would be visible, editable and lost on the first paste. A +/// sidecar is the standard answer (a `.orig` next to a patched config), and hidden here for the +/// same reason `/.moonlive` is: the File Manager does not show dot files unless asked. +/// +/// It answers the one question the shadow marker cannot: has the SHIPPED copy moved since the fork +/// was made? Without it, an edit and a stale leftover look identical forever, which is what let 29 +/// pre-`void tick()` copies sit on a bench P4 failing every compile with offsets into files nobody +/// had written that day. +inline void scriptLineagePath(const char* name, char* out, size_t outLen) { + std::snprintf(out, outLen, "%s/.%s.from", kScriptDir, name); +} + +/// Record that the user's copy of `name` was forked from text hashing to `hash`. +inline bool noteScriptLineage(const char* name, uint32_t hash) { + if (!name || !name[0]) return false; + char path[128]; + scriptLineagePath(name, path, sizeof(path)); + char text[16]; + const int n = std::snprintf(text, sizeof(text), "%u", static_cast(hash)); + return n > 0 && platform::fsWriteAtomic(path, text, static_cast(n)); +} + +/// The hash a fork was made from, or false when no lineage was recorded (an older fork, or a script +/// the user wrote themselves). Absent lineage means "cannot say", never "unchanged". +inline bool scriptLineage(const char* name, uint32_t& out) { + if (!name || !name[0]) return false; + char path[128]; + scriptLineagePath(name, path, sizeof(path)); + char text[16] = {}; + const int got = platform::fsRead(path, text, sizeof(text)); + if (got <= 0) return false; + uint32_t v = 0; + for (int i = 0; i < got && text[i] >= '0' && text[i] <= '9'; i++) + v = v * 10u + static_cast(text[i] - '0'); + out = v; + return true; +} + +/// True when the user's copy of `name` is HIDING a shipped one: both directories hold it, so the +/// resolver above compiles the user's and every push to the factory copy is invisible. The binding +/// says so in its status, because from outside the two cases look identical, and a stale user copy +/// has twice been chased as a compiler bug: once as a control that never appeared, once as an +/// old-syntax copy failing with offsets that matched nothing in the file just written. +/// Record lineage for a just-written file, if it is a fork: a path in the user script directory +/// naming a script the firmware also ships. Anything else (a config file, a user's own script, a +/// write to the factory directory) is not a fork and is left alone. +/// +/// Takes the WRITTEN path rather than a name, so the one caller is the write hook and no caller has +/// to work out whether a write was a fork. +inline void noteForkedFrom(const char* path) { + if (!path) return; + char prefix[64]; + const int plen = std::snprintf(prefix, sizeof(prefix), "%s/", kScriptDir); + if (plen <= 0 || std::strncmp(path, prefix, static_cast(plen)) != 0) return; + const char* name = path + plen; + if (!name[0] || std::strchr(name, '/') || name[0] == '.') return; // nested, or our own sidecar + + // A REVERT arrives here too: applyFileChanged fires on a delete as well as a write, and the + // fork is already gone by then. Drop the lineage with it, or a later fork of the same name + // would be compared against a hash from a fork that no longer exists. + char user[96]; + std::snprintf(user, sizeof(user), "%s/%s", kScriptDir, name); + if (platform::fsSize(user) < 0) { + char side[128]; + scriptLineagePath(name, side, sizeof(side)); + platform::fsRemove(side); + return; + } + + // Only when the fork is CREATED. Re-stamping on every save would mark the fork up to date with + // whatever the library holds at that moment, which silently erases the very thing the record + // exists to show: that the shipped copy moved while the user was not looking. Lineage is the + // point the fork BRANCHED from, and a branch point does not move. + uint32_t already = 0; + if (scriptLineage(name, already)) return; + + char factory[96]; + std::snprintf(factory, sizeof(factory), "%s/%s", kFactoryScriptDir, name); + const long size = platform::fsSize(factory); + if (size <= 0 || size > kScriptFileMax) return; // nothing shipped: not a fork + char* text = static_cast(platform::alloc(static_cast(size) + 1)); + if (!text) return; + const int got = platform::fsRead(factory, text, static_cast(size) + 1); + if (got > 0) noteScriptLineage(name, scriptHash(text, static_cast(got))); + platform::free(text); +} + +/// True when the SHIPPED copy has changed since the user forked it: both files exist, a lineage +/// was recorded, and the factory copy no longer hashes to what the fork was made from. +/// +/// False when there is no lineage. An older fork, or a script the user wrote, cannot be compared, +/// and claiming an update on a guess would send someone to discard work for nothing. +inline bool scriptFactoryMovedOn(const char* name) { + uint32_t from = 0; + if (!scriptLineage(name, from)) return false; + char path[96]; + std::snprintf(path, sizeof(path), "%s/%s", kFactoryScriptDir, name); + const long size = platform::fsSize(path); + if (size <= 0 || size > kScriptFileMax) return false; + char* text = static_cast(platform::alloc(static_cast(size) + 1)); + if (!text) return false; + const int got = platform::fsRead(path, text, static_cast(size) + 1); + const bool moved = got > 0 && scriptHash(text, static_cast(got)) != from; + platform::free(text); + return moved; +} + +inline bool scriptShadowsFactory(const char* name) { + char path[96]; + std::snprintf(path, sizeof(path), "%s/%s", kScriptDir, name); + if (platform::fsSize(path) < 0) return false; + std::snprintf(path, sizeof(path), "%s/%s", kFactoryScriptDir, name); + return platform::fsSize(path) >= 0; +} + /// The hash of `name`'s CURRENT text, without compiling it. /// /// Answers "has the file changed since I compiled it" for the cost of ONE read, which is what a diff --git a/src/light/moonlive/script_catalog.h b/src/light/moonlive/script_catalog.h index b7dda019..c6f75c8a 100644 --- a/src/light/moonlive/script_catalog.h +++ b/src/light/moonlive/script_catalog.h @@ -14,7 +14,6 @@ namespace mm::moonlive { /// Every factory effect, by file name. They live in `moonlive/effects/` /// upstream and in the factory script directory on the device. constexpr const char* kEffectCatalog[] = { - "aim.mle", "aurora.mle", "ballpit.mle", "balls.mle", @@ -30,6 +29,11 @@ constexpr const char* kEffectCatalog[] = { "gradient.mle", "lines.mle", "metal.mle", + "mh-aim.mle", + "mh-ambient.mle", + "mh-sweep.mle", + "mh-troy.mle", + "mh-wowi.mle", "nebula.mle", "noise.mle", "octopus.mle", @@ -40,14 +44,12 @@ constexpr const char* kEffectCatalog[] = { "ripples.mle", "sparkle.mle", "spectrum.mle", - "sweep.mle", "trails.mle", }; -constexpr size_t kEffectCatalogCount = 28; +constexpr size_t kEffectCatalogCount = 31; /// What each effect above declares about itself, in the same order. /// A dimension of 0 means the script says nothing, so the DEVICE decides the default. constexpr unsigned char kEffectCatalogDim[] = { - 1, 3, 2, 2, @@ -63,6 +65,11 @@ constexpr unsigned char kEffectCatalogDim[] = { 3, 2, 2, + 1, + 1, + 1, + 1, + 1, 3, 2, 2, @@ -73,12 +80,10 @@ constexpr unsigned char kEffectCatalogDim[] = { 2, 3, 2, - 1, 3, }; /// The emoji each declares, "" when it declares none. constexpr const char* kEffectCatalogTags[] = { - "πŸ’«πŸŽ―", "πŸ’«", "πŸ’«βœ¨", "πŸ’«", @@ -94,6 +99,11 @@ constexpr const char* kEffectCatalogTags[] = { "πŸ’«", "πŸ’«", "πŸ’«πŸ–ŒοΈ", + "πŸ’«πŸŽ―", + "πŸ—ΌπŸŽΆπŸŽ―", + "πŸ’«πŸŽ―", + "πŸ—ΌπŸŽΆπŸŽ―", + "πŸ—ΌπŸŽ―", "πŸ’«πŸ–ŒοΈ", "πŸ’«", "πŸ’«πŸ–ŒοΈ", @@ -104,7 +114,6 @@ constexpr const char* kEffectCatalogTags[] = { "πŸ’«", "πŸ’«", "πŸ’«πŸŽΆ", - "πŸ’«πŸŽ―", "πŸ’«πŸ–ŒοΈ", }; constexpr const char* kEffectFolder = "effects"; ///< its directory upstream @@ -115,31 +124,40 @@ constexpr const char* kLayoutCatalog[] = { "diagonal.mll", "grid.mll", "lattice.mll", + "lightcrafter16.mll", "reversed-row.mll", "ring.mll", "rose.mll", + "se16.mll", + "sixteen-rings.mll", "two-rows.mll", }; -constexpr size_t kLayoutCatalogCount = 7; +constexpr size_t kLayoutCatalogCount = 10; /// What each layout above declares about itself, in the same order. /// A dimension of 0 means the script says nothing, so the DEVICE decides the default. constexpr unsigned char kLayoutCatalogDim[] = { 2, 2, 3, + 2, 1, 2, 2, 2, + 2, + 2, }; /// The emoji each declares, "" when it declares none. constexpr const char* kLayoutCatalogTags[] = { "πŸ’«", "πŸ’«", "πŸ’«", + "πŸš₯", "πŸ’«", "πŸ’«", "πŸ’«", + "πŸš₯", + "πŸš₯", "πŸ’«", }; constexpr const char* kLayoutFolder = "layouts"; ///< its directory upstream @@ -219,6 +237,6 @@ constexpr const char* kPaletteCatalogTags[] = { }; constexpr const char* kPaletteFolder = "palettes"; ///< its directory upstream -constexpr size_t kCatalogCount = 46; ///< every factory script, all roles +constexpr size_t kCatalogCount = 52; ///< every factory script, all roles } // namespace mm::moonlive diff --git a/src/main.cpp b/src/main.cpp index e9791b7c..018c14fd 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -22,6 +22,7 @@ #include "light/effects/FluidEffect.h" #include "light/effects/NebulaEffect.h" #include "light/effects/NoiseEffect.h" +#include "light/effects/FixedPointEffect.h" #include "light/effects/MovingHeadEffect.h" #include "light/effects/PacmanEffect.h" #include "light/effects/PlasmaEffect.h" @@ -36,7 +37,6 @@ #include "light/effects/RipplesEffect.h" #include "light/effects/LavaLampEffect.h" #include "light/effects/NetworkReceiveEffect.h" -#include "light/effects/AudioVolumeEffect.h" #include "light/effects/RadialSpectrumEffect.h" #include "light/effects/VuMetersEffect.h" #include "light/effects/BeatRipplesEffect.h" @@ -211,7 +211,6 @@ static void registerModuleTypes() { // Effects β€” registered alphabetically by display name (the picker + docs also sort // alphabetically; keeping this list sorted makes the three orders agree at a glance). mm::ModuleFactory::registerType("AudioSpectrumEffect", "light/effects.md#audiospectrum"); - mm::ModuleFactory::registerType("AudioVolumeEffect", "light/effects.md#audiovolume"); mm::ModuleFactory::registerType("RadialSpectrumEffect", "light/effects.md#radialspectrum"); mm::ModuleFactory::registerType("VuMetersEffect", "light/effects.md#vumeters"); mm::ModuleFactory::registerType("BeatRipplesEffect", "light/effects.md#beatripples"); @@ -260,6 +259,7 @@ static void registerModuleTypes() { mm::ModuleFactory::registerType("FireworksEffect", "light/effects.md#fireworks"); mm::ModuleFactory::registerType("FishTankEffect", "light/effects.md#fishtank"); mm::ModuleFactory::registerType("PacmanEffect", "light/effects.md#pacman"); + mm::ModuleFactory::registerType("FixedPointEffect", "light/effects.md#fixedpoint"); mm::ModuleFactory::registerType("MovingHeadEffect", "light/effects.md#movinghead"); mm::ModuleFactory::registerType("FlyingToastersEffect", "light/effects.md#flyingtoasters"); mm::ModuleFactory::registerType("SpaceInvadersEffect", "light/effects.md#spaceinvaders"); diff --git a/src/ui/app.js b/src/ui/app.js index c10e0c45..8953124f 100644 --- a/src/ui/app.js +++ b/src/ui/app.js @@ -3163,34 +3163,27 @@ function createControl(moduleName, moduleType, ctrl) { alert("could not download " + file + ": " + (e && e.message ? e.message : e)); return; } - // The device re-lists its .mlp files on the next state fetch, so the - // palette now HAS an index. Find it by name and select it, which is - // what the user asked for by picking it. + // The write itself republishes the option list: POST /api/file ends in + // applyFileChanged() -> requestPrepareTree() -> Drivers::prepare(), which + // re-lists the `.mlp` files. So one fetch after the download sees the new + // palette and it selects in a single click, like every other script role. mlCatalog = null; // it is local now: drop the cached list - const want = file.replace(/\.mlp$/, ""); - // The device only re-lists its .mlp files when its controls rebuild, which - // can land a beat after the state fetch. So look, and if the new palette - // is not there yet, fetch once more before giving up: without the retry a - // download that worked ended in nothing happening and no message. + // Match on the FILENAME, extension included: the device publishes each + // scripted palette under its file name (`spectrum.mlp`), and only the + // picker's displayName drops the extension. Comparing the stripped form + // never matched, so a download that worked ended in an error. const findCtrl = () => { const mod = allModules().find(m => m.name === moduleName); return mod && Array.isArray(mod.controls) && mod.controls.find(x => x.name === ctrl.name); }; - const findIdx = () => ((findCtrl() || {}).options || []) - .findIndex(o => o.name === want); await refetchState(); - let idx = findIdx(); + const idx = ((findCtrl() || {}).options || []) + .findIndex(o => o.name === file); if (idx < 0) { - await new Promise(r => setTimeout(r, 600)); - await refetchState(); - idx = findIdx(); - } - if (idx < 0) { - // Downloaded, but the device has not published it. Say so: the file IS - // on the device, so re-opening the picker will offer it. - alert(want + " was downloaded but is not in the palette list yet - " - + "reopen the picker to select it."); + // Only reachable if the device accepted the write and then did not + // list the file, which is a device-side fault rather than a wait. + alert("could not select " + file + ": the device saved it but does not list it"); return; } const fresh = document.querySelector( @@ -7118,6 +7111,8 @@ function fmMountEditor(host, relPath, opts = {}) { // the check while the first request is still in flight. Saves are serialized rather than // dropped, because the second trigger may carry newer keystrokes than the first. let saving = null; + /// The file's text as it was LOADED, for the no-op fork check in save(). + let loadedText = null; const save = () => { if (body.readOnly || !dirty || !path) return Promise.resolve(); saving = (saving || Promise.resolve()).then(async () => { @@ -7125,6 +7120,17 @@ function fmMountEditor(host, relPath, opts = {}) { const saved = body.value; // what THIS request writes status.textContent = "saving…"; const dest = savePath ? savePath(path) : path; + // A FORK THAT CHANGES NOTHING IS NOT A FORK. When the destination differs from the file + // that was read, saving creates a user copy that shadows the shipped one forever: every + // later library update becomes invisible behind it. If the text is byte-identical to + // what was read, there is nothing to shadow it WITH, so write nothing and let the + // shipped copy keep winning. Opening a script and pressing Save is otherwise enough to + // pin it at today's version, which is the trap this whole mechanism exists to avoid. + if (dest !== path && loadedText !== null && saved === loadedText) { + status.textContent = "unchanged"; + setDirty(false); + return; + } const r = await fmSaveFrom(body, dest); status.textContent = r.message; // A failed write (no space, a vanished path) must not be silent. The modal shows it on @@ -7185,6 +7191,9 @@ function fmMountEditor(host, relPath, opts = {}) { } const r = await fmLoadInto(body, path, size, ac.signal); if (r.aborted || ac !== loadAbort) return; // a newer load started: that one owns the pane + // What arrived, so save() can tell a real edit from an untouched file. Only used when the + // save destination differs from the read path (a factory script being forked). + loadedText = body.value; body.readOnly = r.readOnly; saveBtn.disabled = r.readOnly; paintHighlight(); // the file just arrived: paint what it says diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 9ee9487e..944ce841 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -88,6 +88,7 @@ add_executable(mm_tests unit/light/unit_WledAudioSyncPacket.cpp unit/light/unit_BlendMap.cpp unit/light/unit_BeatRipples.cpp + unit/light/unit_ColorTrailsEffect.cpp unit/light/unit_fluid.cpp unit/light/unit_draw.cpp unit/light/unit_GameOfLifeEffect.cpp @@ -116,7 +117,9 @@ add_executable(mm_tests unit/light/unit_DistortionWavesEffect.cpp unit/light/unit_Correction.cpp unit/light/unit_MovingHeadEffect.cpp + unit/light/unit_FixedPointEffect.cpp unit/light/unit_Drivers_container.cpp + unit/light/unit_Drivers_livePalettes.cpp unit/light/unit_Drivers_rendersplit.cpp unit/light/unit_LightPresetsModule.cpp unit/light/unit_Drivers_firstOutputRgb.cpp diff --git a/test/js/ui-picker-scripts.test.mjs b/test/js/ui-picker-scripts.test.mjs index df0c52d3..52ab58ea 100644 --- a/test/js/ui-picker-scripts.test.mjs +++ b/test/js/ui-picker-scripts.test.mjs @@ -22,7 +22,10 @@ function fnSource(name) { const at = src.indexOf(`function ${name}(`); assert.notEqual(at, -1, `${name} not found in app.js`); const from = src.startsWith("async ", at - 6) ? at - 6 : at; - const open = src.indexOf("{", at); + // The BODY's brace, not the first one after the name: a defaulted object parameter + // (`opts = {}`) puts a brace inside the parameter list, and matching from there returned the + // signature alone. Skip past the closing parenthesis first. + const open = src.indexOf("{", src.indexOf(")", src.indexOf("(", at)) ); let depth = 0; for (let i = open; i < src.length; i++) { if (src[i] === "{") depth++; @@ -169,3 +172,32 @@ test("a replaced card is found by POSITION, so a name collision still reaches th assert.match(body.slice(replaceAt), /children\[index\]/, "afterwards the slot is read at that index, not by a name that may not be its own"); }); + +// A FORK THAT CHANGES NOTHING IS NOT A FORK. +// +// Opening a shipped script and pressing Save (or clicking away, which also saves) used to write a +// user copy byte-identical to the shipped one. That copy then shadows the library forever: every +// later update is invisible behind a "change" the user never made. The editor therefore compares +// what is on screen against what it loaded, and writes nothing when they match. +// +// Pinned on the SOURCE rather than through a DOM harness for the reason at the top of this file: +// the guard lives inside fmMountEditor's closure, and what matters is that all three of its parts +// are present, in the right order, against the right variable. +test("saving an unmodified factory script does not create a shadowing copy", () => { + const editor = fnSource("fmMountEditor"); + + // The text as loaded is remembered, so an untouched file can be recognized. + assert.match(editor, /loadedText = body\.value/, + "fmMountEditor must remember the text it loaded"); + + // The guard: only when the write goes somewhere other than the read (a fork), and only when + // nothing changed. Both conditions, or it would suppress a real save. + const guard = /dest !== path && loadedText !== null && saved === loadedText/; + assert.match(editor, guard, "the no-op fork guard must test destination AND content"); + + // It must sit BEFORE the write, or the file is created and the check is decoration. + const guardAt = editor.search(guard); + const writeAt = editor.indexOf("fmSaveFrom(body, dest)"); + assert.ok(guardAt > -1 && writeAt > -1 && guardAt < writeAt, + "the guard must run before the write it prevents"); +}); diff --git a/test/scenario_runner.cpp b/test/scenario_runner.cpp index 746da23a..673c2438 100644 --- a/test/scenario_runner.cpp +++ b/test/scenario_runner.cpp @@ -42,7 +42,6 @@ #include "light/drivers/PreviewDriver.h" #include "core/SystemModule.h" #include "core/AudioService.h" -#include "light/effects/AudioVolumeEffect.h" #include "light/effects/RadialSpectrumEffect.h" #include "light/effects/VuMetersEffect.h" #include "light/effects/BeatRipplesEffect.h" @@ -248,7 +247,6 @@ static void registerScenarioTypes() { mm::ModuleFactory::registerType("PreviewDriver"); mm::ModuleFactory::registerType("SystemModule"); mm::ModuleFactory::registerType("AudioService"); - mm::ModuleFactory::registerType("AudioVolumeEffect"); mm::ModuleFactory::registerType("RadialSpectrumEffect"); mm::ModuleFactory::registerType("VuMetersEffect"); mm::ModuleFactory::registerType("BeatRipplesEffect"); diff --git a/test/scenarios/core/scenario_MoonModule_control_change.json b/test/scenarios/core/scenario_MoonModule_control_change.json index 5de41c53..70c525b1 100644 --- a/test/scenarios/core/scenario_MoonModule_control_change.json +++ b/test/scenarios/core/scenario_MoonModule_control_change.json @@ -117,14 +117,14 @@ "observed": { "desktop-macos": { "tick_us": { - "p50": 144, + "p50": 143, "p95": 248, "min": 117, "max": 302, "n": 32, - "samples": [203, 129, 133, 243, 248, 246, 127, 204, 143, 150, 150, 175, 205, 179, 191, 127, 202, 119, 121, 118, 120, 199, 193, 117, 144, 302, 129, 118, 246, 120, 133, 122] + "samples": [243, 248, 246, 127, 204, 143, 150, 150, 175, 205, 179, 191, 127, 202, 119, 121, 118, 120, 199, 193, 117, 144, 302, 129, 118, 246, 120, 133, 122, 121, 122, 126] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32-eth-wifi": { "tick_us": { @@ -299,14 +299,14 @@ "observed": { "desktop-macos": { "tick_us": { - "p50": 134, + "p50": 133, "p95": 247, "min": 117, "max": 260, "n": 32, - "samples": [205, 130, 134, 238, 247, 238, 126, 196, 146, 147, 159, 171, 203, 182, 135, 128, 132, 119, 120, 118, 118, 131, 134, 117, 133, 135, 146, 121, 260, 123, 118, 120] + "samples": [238, 247, 238, 126, 196, 146, 147, 159, 171, 203, 182, 135, 128, 132, 119, 120, 118, 118, 131, 134, 117, 133, 135, 146, 121, 260, 123, 118, 120, 124, 123, 137] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32-eth-wifi": { "tick_us": { @@ -486,9 +486,9 @@ "min": 116, "max": 240, "n": 32, - "samples": [204, 130, 133, 240, 239, 238, 126, 186, 147, 148, 158, 173, 206, 180, 126, 128, 118, 121, 121, 118, 116, 116, 122, 117, 122, 129, 122, 121, 152, 122, 120, 120] + "samples": [240, 239, 238, 126, 186, 147, 148, 158, 173, 206, 180, 126, 128, 118, 121, 121, 118, 116, 116, 122, 117, 122, 129, 122, 121, 152, 122, 120, 120, 126, 123, 128] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32-eth-wifi": { "tick_us": { @@ -671,14 +671,14 @@ "observed": { "desktop-macos": { "tick_us": { - "p50": 127, + "p50": 124, "p95": 247, "min": 117, "max": 261, "n": 32, - "samples": [205, 129, 131, 261, 247, 241, 127, 186, 148, 148, 157, 174, 192, 182, 127, 128, 120, 119, 120, 118, 118, 120, 123, 117, 122, 141, 124, 121, 151, 122, 119, 121] + "samples": [261, 247, 241, 127, 186, 148, 148, 157, 174, 192, 182, 127, 128, 120, 119, 120, 118, 118, 120, 123, 117, 122, 141, 124, 121, 151, 122, 119, 121, 123, 121, 129] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32-eth-wifi": { "tick_us": { diff --git a/test/scenarios/light/scenario_Audio_mutation.json b/test/scenarios/light/scenario_Audio_mutation.json index 9c67b2ac..d7d6ddb7 100644 --- a/test/scenarios/light/scenario_Audio_mutation.json +++ b/test/scenarios/light/scenario_Audio_mutation.json @@ -9,7 +9,6 @@ "GridLayout", "Layer", "RainbowEffect", - "AudioVolumeEffect", "AudioSpectrumEffect", "Drivers", "PreviewDriver" @@ -110,9 +109,9 @@ "min": 16, "max": 48, "n": 32, - "samples": [21, 35, 21, 21, 21, 32, 24, 38, 46, 48, 27, 25, 16, 20, 16, 20, 20, 17, 17, 16, 16, 17, 17, 17, 19, 26, 16, 17, 25, 19, 20, 20] + "samples": [21, 21, 32, 24, 38, 46, 48, 27, 25, 16, 20, 16, 20, 20, 17, 17, 16, 16, 17, 17, 17, 19, 26, 16, 17, 25, 19, 20, 20, 17, 20, 22] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "desktop-windows": { "tick_us": { @@ -207,9 +206,9 @@ "min": 17, "max": 137, "n": 32, - "samples": [25, 35, 34, 70, 30, 33, 26, 53, 66, 59, 35, 38, 18, 22, 17, 17, 19, 28, 27, 22, 17, 19, 20, 37, 22, 28, 24, 137, 27, 17, 20, 19] + "samples": [70, 30, 33, 26, 53, 66, 59, 35, 38, 18, 22, 17, 17, 19, 28, 27, 22, 17, 19, 20, 37, 22, 28, 24, 137, 27, 17, 20, 19, 39, 20, 31] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "desktop-windows": { "tick_us": { @@ -321,9 +320,9 @@ "min": 17, "max": 66, "n": 32, - "samples": [18, 32, 40, 66, 28, 33, 28, 57, 60, 63, 45, 44, 37, 20, 17, 18, 20, 19, 25, 18, 18, 19, 19, 21, 26, 28, 30, 40, 32, 26, 18, 20] + "samples": [66, 28, 33, 28, 57, 60, 63, 45, 44, 37, 20, 17, 18, 20, 19, 25, 18, 18, 19, 19, 21, 26, 28, 30, 40, 32, 26, 18, 20, 36, 21, 25] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "desktop-windows": { "tick_us": { @@ -394,10 +393,10 @@ }, { "name": "add-audio-consumer", - "description": "Add an AudioVolumeEffect consumer under the Layer. It reads the mic via the static accessor; with the mic present it gets the live (silent, on host) frame.", + "description": "Add an AudioSpectrumEffect consumer under the Layer. It reads the mic via the static accessor; with the mic present it gets the live (silent, on host) frame.", "op": "add_module", "id": "Vol", - "type": "AudioVolumeEffect", + "type": "AudioSpectrumEffect", "parent_id": "Layer" }, { @@ -418,9 +417,9 @@ "min": 19, "max": 75, "n": 32, - "samples": [20, 38, 27, 66, 26, 36, 30, 62, 75, 68, 45, 45, 20, 23, 20, 21, 20, 21, 31, 20, 20, 21, 19, 22, 24, 28, 31, 44, 29, 29, 21, 24] + "samples": [66, 26, 36, 30, 62, 75, 68, 45, 45, 20, 23, 20, 21, 20, 21, 31, 20, 20, 21, 19, 22, 24, 28, 31, 44, 29, 29, 21, 24, 30, 24, 30] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "desktop-windows": { "tick_us": { @@ -508,14 +507,14 @@ "observed": { "desktop-macos": { "tick_us": { - "p50": 23, + "p50": 22, "p95": 69, "min": 19, "max": 80, "n": 32, - "samples": [21, 32, 33, 69, 25, 37, 28, 65, 67, 62, 41, 80, 19, 21, 21, 21, 20, 22, 27, 20, 21, 19, 19, 21, 30, 28, 22, 29, 36, 19, 21, 23] + "samples": [69, 25, 37, 28, 65, 67, 62, 41, 80, 19, 21, 21, 21, 20, 22, 27, 20, 21, 19, 19, 21, 30, 28, 22, 29, 36, 19, 21, 23, 25, 21, 21] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "desktop-windows": { "tick_us": { @@ -608,9 +607,9 @@ "min": 16, "max": 87, "n": 32, - "samples": [26, 29, 38, 87, 23, 32, 25, 52, 79, 57, 29, 33, 18, 26, 20, 19, 19, 17, 17, 17, 16, 17, 17, 21, 17, 25, 17, 20, 24, 19, 17, 20] + "samples": [87, 23, 32, 25, 52, 79, 57, 29, 33, 18, 26, 20, 19, 19, 17, 17, 17, 16, 17, 17, 21, 17, 25, 17, 20, 24, 19, 17, 20, 22, 21, 19] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "desktop-windows": { "tick_us": { diff --git a/test/scenarios/light/scenario_Aurora_fps.json b/test/scenarios/light/scenario_Aurora_fps.json index b848e2a8..9bafe0ed 100644 --- a/test/scenarios/light/scenario_Aurora_fps.json +++ b/test/scenarios/light/scenario_Aurora_fps.json @@ -84,14 +84,14 @@ "observed": { "desktop-macos": { "tick_us": { - "p50": 855, + "p50": 856, "p95": 1391, "min": 474, "max": 1527, - "n": 23, - "samples": [478, 474, 650, 786, 803, 855, 835, 843, 890, 827, 841, 871, 845, 856, 1391, 863, 858, 885, 1527, 1317, 853, 859, 861] + "n": 26, + "samples": [478, 474, 650, 786, 803, 855, 835, 843, 890, 827, 841, 871, 845, 856, 1391, 863, 858, 885, 1527, 1317, 853, 859, 861, 1047, 962, 1024] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" } } }, @@ -118,10 +118,10 @@ "p95": 449, "min": 207, "max": 495, - "n": 23, - "samples": [207, 207, 208, 307, 311, 320, 316, 318, 317, 317, 321, 334, 312, 322, 355, 335, 322, 495, 395, 449, 317, 318, 317] + "n": 26, + "samples": [207, 207, 208, 307, 311, 320, 316, 318, 317, 317, 321, 334, 312, 322, 355, 335, 322, 495, 395, 449, 317, 318, 317, 431, 362, 359] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" } } }, @@ -148,10 +148,10 @@ "p95": 245, "min": 127, "max": 254, - "n": 23, - "samples": [127, 127, 128, 185, 183, 189, 187, 192, 186, 185, 188, 196, 187, 187, 254, 187, 188, 222, 232, 245, 186, 188, 185] + "n": 26, + "samples": [127, 127, 128, 185, 183, 189, 187, 192, 186, 185, 188, 196, 187, 187, 254, 187, 188, 222, 232, 245, 186, 188, 185, 201, 205, 212] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" } } }, @@ -178,10 +178,10 @@ "p95": 702, "min": 303, "max": 720, - "n": 23, - "samples": [304, 303, 306, 530, 532, 554, 540, 544, 551, 551, 554, 581, 543, 554, 560, 550, 553, 567, 702, 720, 550, 545, 552] + "n": 26, + "samples": [304, 303, 306, 530, 532, 554, 540, 544, 551, 551, 554, 581, 543, 554, 560, 550, 553, 567, 702, 720, 550, 545, 552, 583, 570, 599] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" } } }, @@ -204,14 +204,14 @@ "observed": { "desktop-macos": { "tick_us": { - "p50": 950, + "p50": 952, "p95": 1158, "min": 474, "max": 1236, - "n": 23, - "samples": [474, 474, 480, 921, 919, 974, 933, 936, 938, 945, 964, 997, 937, 956, 1236, 950, 953, 952, 1158, 1152, 946, 1029, 970] + "n": 26, + "samples": [474, 474, 480, 921, 919, 974, 933, 936, 938, 945, 964, 997, 937, 956, 1236, 950, 953, 952, 1158, 1152, 946, 1029, 970, 1026, 955, 1046] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" } } }, @@ -234,14 +234,14 @@ "observed": { "desktop-macos": { "tick_us": { - "p50": 1472, + "p50": 1473, "p95": 1871, "min": 785, "max": 2116, - "n": 22, - "samples": [937, 785, 1419, 1423, 1465, 1430, 1562, 1455, 1458, 1483, 2116, 1446, 1497, 1493, 1472, 1467, 1490, 1853, 1666, 1473, 1474, 1871] + "n": 25, + "samples": [937, 785, 1419, 1423, 1465, 1430, 1562, 1455, 1458, 1483, 2116, 1446, 1497, 1493, 1472, 1467, 1490, 1853, 1666, 1473, 1474, 1871, 1512, 1472, 1672] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" } } }, @@ -264,14 +264,14 @@ "observed": { "desktop-macos": { "tick_us": { - "p50": 1514, + "p50": 1518, "p95": 1828, "min": 507, "max": 1920, - "n": 23, - "samples": [507, 814, 821, 1496, 1511, 1506, 1491, 1494, 1498, 1506, 1574, 1920, 1494, 1564, 1543, 1622, 1526, 1556, 1761, 1695, 1534, 1514, 1828] + "n": 26, + "samples": [507, 814, 821, 1496, 1511, 1506, 1491, 1494, 1498, 1506, 1574, 1920, 1494, 1564, 1543, 1622, 1526, 1556, 1761, 1695, 1534, 1514, 1828, 1601, 1518, 1642] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" } } }, @@ -294,14 +294,14 @@ "observed": { "desktop-macos": { "tick_us": { - "p50": 1117, + "p50": 1118, "p95": 1211, "min": 333, "max": 1303, - "n": 23, - "samples": [333, 643, 658, 1103, 1079, 1108, 1092, 1096, 1104, 1118, 1165, 1211, 1103, 1135, 1128, 1137, 1120, 1131, 1303, 1210, 1117, 1118, 1105] + "n": 26, + "samples": [333, 643, 658, 1103, 1079, 1108, 1092, 1096, 1104, 1118, 1165, 1211, 1103, 1135, 1128, 1137, 1120, 1131, 1303, 1210, 1117, 1118, 1105, 1167, 1161, 1167] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" } } } diff --git a/test/scenarios/light/scenario_Driver_mutation.json b/test/scenarios/light/scenario_Driver_mutation.json index 61617d88..e6bc91b8 100644 --- a/test/scenarios/light/scenario_Driver_mutation.json +++ b/test/scenarios/light/scenario_Driver_mutation.json @@ -77,13 +77,13 @@ "desktop-macos": { "tick_us": { "p50": 20, - "p95": 99, + "p95": 88, "min": 16, "max": 147, "n": 32, - "samples": [56, 18, 99, 32, 36, 147, 25, 37, 25, 51, 73, 88, 61, 43, 17, 21, 17, 20, 20, 17, 19, 20, 19, 18, 21, 16, 19, 19, 17, 19, 18, 20] + "samples": [32, 36, 147, 25, 37, 25, 51, 73, 88, 61, 43, 17, 21, 17, 20, 20, 17, 19, 20, 19, 18, 21, 16, 19, 19, 17, 19, 18, 20, 18, 17, 17] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "desktop-windows": { "tick_us": { @@ -174,13 +174,13 @@ "desktop-macos": { "tick_us": { "p50": 20, - "p95": 68, + "p95": 65, "min": 16, "max": 73, "n": 32, - "samples": [68, 19, 25, 37, 51, 73, 26, 32, 25, 47, 65, 59, 59, 45, 17, 22, 17, 20, 20, 17, 27, 20, 20, 20, 23, 16, 20, 20, 18, 20, 20, 20] + "samples": [37, 51, 73, 26, 32, 25, 47, 65, 59, 59, 45, 17, 22, 17, 20, 20, 17, 27, 20, 20, 20, 23, 16, 20, 20, 18, 20, 20, 20, 23, 17, 17] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "desktop-windows": { "tick_us": { @@ -270,14 +270,14 @@ "observed": { "desktop-macos": { "tick_us": { - "p50": 21, - "p95": 64, + "p50": 20, + "p95": 63, "min": 16, - "max": 67, + "max": 64, "n": 32, - "samples": [67, 25, 24, 36, 37, 61, 25, 32, 25, 48, 64, 63, 52, 46, 21, 18, 20, 20, 20, 20, 24, 20, 20, 21, 17, 16, 20, 19, 17, 20, 20, 20] + "samples": [36, 37, 61, 25, 32, 25, 48, 64, 63, 52, 46, 21, 18, 20, 20, 20, 20, 24, 20, 20, 21, 17, 16, 20, 19, 17, 20, 20, 20, 21, 18, 17] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "desktop-windows": { "tick_us": { @@ -366,13 +366,13 @@ "desktop-macos": { "tick_us": { "p50": 20, - "p95": 83, + "p95": 76, "min": 17, "max": 173, "n": 32, - "samples": [83, 20, 25, 33, 25, 49, 31, 38, 27, 55, 173, 76, 54, 47, 20, 24, 20, 20, 20, 17, 19, 20, 20, 17, 19, 20, 20, 19, 21, 19, 20, 20] + "samples": [33, 25, 49, 31, 38, 27, 55, 173, 76, 54, 47, 20, 24, 20, 20, 20, 17, 19, 20, 20, 17, 19, 20, 20, 19, 21, 19, 20, 20, 20, 20, 17] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "desktop-windows": { "tick_us": { @@ -465,9 +465,9 @@ "min": 17, "max": 316, "n": 32, - "samples": [50, 20, 20, 32, 29, 62, 28, 35, 26, 59, 316, 66, 36, 52, 21, 21, 20, 20, 20, 17, 23, 20, 20, 19, 20, 20, 20, 19, 17, 19, 19, 19] + "samples": [32, 29, 62, 28, 35, 26, 59, 316, 66, 36, 52, 21, 21, 20, 20, 20, 17, 23, 20, 20, 19, 20, 20, 20, 19, 17, 19, 19, 19, 21, 20, 17] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "desktop-windows": { "tick_us": { diff --git a/test/scenarios/light/scenario_Effects_composition.json b/test/scenarios/light/scenario_Effects_composition.json index d9ecc176..72717d7c 100644 --- a/test/scenarios/light/scenario_Effects_composition.json +++ b/test/scenarios/light/scenario_Effects_composition.json @@ -106,14 +106,14 @@ "observed": { "desktop-macos": { "tick_us": { - "p50": 169, + "p50": 148, "p95": 768, "min": 142, "max": 1044, "n": 32, - "samples": [646, 253, 263, 426, 343, 1044, 366, 485, 370, 731, 711, 768, 496, 497, 248, 248, 146, 142, 146, 152, 145, 146, 148, 144, 145, 147, 148, 164, 169, 144, 147, 144] + "samples": [426, 343, 1044, 366, 485, 370, 731, 711, 768, 496, 497, 248, 248, 146, 142, 146, 152, 145, 146, 148, 144, 145, 147, 148, 164, 169, 144, 147, 144, 147, 146, 143] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "desktop-windows": { "tick_us": { diff --git a/test/scenarios/light/scenario_Fields_polar_lut.json b/test/scenarios/light/scenario_Fields_polar_lut.json index 610c6cab..f3c1a329 100644 --- a/test/scenarios/light/scenario_Fields_polar_lut.json +++ b/test/scenarios/light/scenario_Fields_polar_lut.json @@ -85,14 +85,14 @@ "observed": { "desktop-macos": { "tick_us": { - "p50": 290, - "p95": 384, + "p50": 292, + "p95": 387, "min": 189, - "max": 387, - "n": 24, - "samples": [289, 189, 281, 384, 274, 387, 283, 278, 281, 289, 325, 292, 302, 291, 286, 293, 285, 287, 294, 337, 332, 293, 290, 300] + "max": 421, + "n": 27, + "samples": [289, 189, 281, 384, 274, 387, 283, 278, 281, 289, 325, 292, 302, 291, 286, 293, 285, 287, 294, 337, 332, 293, 290, 300, 301, 421, 298] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" } } }, @@ -115,14 +115,14 @@ "observed": { "desktop-macos": { "tick_us": { - "p50": 285, + "p50": 287, "p95": 320, "min": 183, "max": 340, - "n": 24, - "samples": [183, 189, 194, 279, 273, 275, 284, 281, 281, 313, 297, 290, 297, 283, 288, 291, 285, 290, 293, 340, 320, 284, 287, 285] + "n": 27, + "samples": [183, 189, 194, 279, 273, 275, 284, 281, 281, 313, 297, 290, 297, 283, 288, 291, 285, 290, 293, 340, 320, 284, 287, 285, 289, 295, 295] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" } } }, @@ -149,10 +149,10 @@ "p95": 317, "min": 168, "max": 337, - "n": 24, - "samples": [168, 180, 177, 279, 274, 274, 282, 281, 282, 288, 289, 289, 303, 284, 286, 289, 284, 309, 284, 337, 317, 285, 283, 284] + "n": 27, + "samples": [168, 180, 177, 279, 274, 274, 282, 281, 282, 288, 289, 289, 303, 284, 286, 289, 284, 309, 284, 337, 317, 285, 283, 284, 289, 296, 287] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" } } }, @@ -175,14 +175,14 @@ "observed": { "desktop-macos": { "tick_us": { - "p50": 284, + "p50": 285, "p95": 339, "min": 168, "max": 347, - "n": 24, - "samples": [168, 175, 179, 278, 274, 273, 284, 277, 282, 285, 286, 286, 301, 281, 287, 290, 288, 347, 283, 339, 306, 284, 293, 285] + "n": 27, + "samples": [168, 175, 179, 278, 274, 273, 284, 277, 282, 285, 286, 286, 301, 281, 287, 290, 288, 347, 283, 339, 306, 284, 293, 285, 295, 284, 289] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" } } }, @@ -209,10 +209,10 @@ "p95": 155, "min": 83, "max": 166, - "n": 24, - "samples": [83, 86, 88, 138, 137, 137, 142, 140, 138, 144, 141, 144, 147, 141, 144, 143, 143, 155, 141, 166, 153, 141, 140, 140] + "n": 27, + "samples": [83, 86, 88, 138, 137, 137, 142, 140, 138, 144, 141, 144, 147, 141, 144, 143, 143, 155, 141, 166, 153, 141, 140, 140, 146, 144, 147] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" } } }, @@ -235,14 +235,14 @@ "observed": { "desktop-macos": { "tick_us": { - "p50": 422, + "p50": 425, "p95": 503, "min": 250, "max": 512, - "n": 24, - "samples": [250, 257, 264, 422, 413, 410, 501, 413, 417, 422, 421, 428, 444, 420, 451, 442, 503, 433, 512, 502, 461, 424, 421, 425] + "n": 27, + "samples": [250, 257, 264, 422, 413, 410, 501, 413, 417, 422, 421, 428, 444, 420, 451, 442, 503, 433, 512, 502, 461, 424, 421, 425, 443, 431, 448] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" } } }, @@ -271,14 +271,14 @@ "observed": { "desktop-macos": { "tick_us": { - "p50": 1234, - "p95": 1402, + "p50": 1239, + "p95": 1686, "min": 960, "max": 1892, - "n": 24, - "samples": [960, 970, 981, 1200, 1187, 1206, 1234, 1239, 1206, 1218, 1228, 1239, 1298, 1269, 1240, 1311, 1232, 1236, 1892, 1402, 1341, 1261, 1229, 1250] + "n": 27, + "samples": [960, 970, 981, 1200, 1187, 1206, 1234, 1239, 1206, 1218, 1228, 1239, 1298, 1269, 1240, 1311, 1232, 1236, 1892, 1402, 1341, 1261, 1229, 1250, 1339, 1271, 1686] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" } } }, @@ -301,14 +301,14 @@ "observed": { "desktop-macos": { "tick_us": { - "p50": 480, - "p95": 590, + "p50": 482, + "p95": 604, "min": 460, - "max": 604, - "n": 24, - "samples": [560, 561, 561, 479, 460, 590, 474, 479, 476, 472, 473, 480, 506, 482, 604, 488, 475, 481, 491, 538, 530, 477, 475, 477] + "max": 1469, + "n": 27, + "samples": [560, 561, 561, 479, 460, 590, 474, 479, 476, 472, 473, 480, 506, 482, 604, 488, 475, 481, 491, 538, 530, 477, 475, 477, 1469, 496, 528] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" } } } diff --git a/test/scenarios/light/scenario_Fluid_solver.json b/test/scenarios/light/scenario_Fluid_solver.json index 16ea02bd..21baef97 100644 --- a/test/scenarios/light/scenario_Fluid_solver.json +++ b/test/scenarios/light/scenario_Fluid_solver.json @@ -79,13 +79,13 @@ "desktop-macos": { "tick_us": { "p50": 30, - "p95": 73, + "p95": 56, "min": 29, "max": 73, - "n": 18, - "samples": [30, 30, 30, 31, 30, 31, 29, 31, 73, 30, 29, 29, 30, 33, 32, 29, 29, 29] + "n": 21, + "samples": [30, 30, 30, 31, 30, 31, 29, 31, 73, 30, 29, 29, 30, 33, 32, 29, 29, 29, 56, 30, 33] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" } } }, @@ -103,11 +103,11 @@ "p50": 19, "p95": 37, "min": 19, - "max": 37, - "n": 18, - "samples": [20, 20, 20, 19, 19, 19, 20, 19, 37, 19, 19, 19, 20, 21, 21, 19, 19, 19] + "max": 44, + "n": 21, + "samples": [20, 20, 20, 19, 19, 19, 20, 19, 37, 19, 19, 19, 20, 21, 21, 19, 19, 19, 44, 19, 21] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" } } }, @@ -125,11 +125,11 @@ "p50": 68, "p95": 101, "min": 66, - "max": 101, - "n": 18, - "samples": [69, 69, 68, 70, 68, 68, 66, 68, 101, 68, 67, 67, 70, 76, 75, 67, 67, 67] + "max": 115, + "n": 21, + "samples": [69, 69, 68, 70, 68, 68, 66, 68, 101, 68, 67, 67, 70, 76, 75, 67, 67, 67, 115, 70, 76] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" } } }, @@ -147,11 +147,11 @@ "p50": 29, "p95": 37, "min": 29, - "max": 37, - "n": 18, - "samples": [30, 31, 30, 30, 29, 29, 29, 29, 37, 29, 29, 29, 30, 33, 33, 29, 29, 29] + "max": 71, + "n": 21, + "samples": [30, 31, 30, 30, 29, 29, 29, 29, 37, 29, 29, 29, 30, 33, 33, 29, 29, 29, 71, 29, 33] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" } } }, @@ -166,14 +166,14 @@ "observed": { "desktop-macos": { "tick_us": { - "p50": 64, + "p50": 65, "p95": 74, "min": 62, - "max": 74, - "n": 18, - "samples": [64, 65, 65, 66, 66, 64, 64, 63, 74, 66, 63, 62, 66, 71, 70, 63, 62, 62] + "max": 95, + "n": 21, + "samples": [64, 65, 65, 66, 66, 64, 64, 63, 74, 66, 63, 62, 66, 71, 70, 63, 62, 62, 95, 67, 72] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" } } }, @@ -187,14 +187,14 @@ "observed": { "desktop-macos": { "tick_us": { - "p50": 132, - "p95": 145, + "p50": 133, + "p95": 176, "min": 127, - "max": 145, - "n": 18, - "samples": [133, 134, 138, 136, 134, 131, 130, 132, 133, 134, 129, 128, 131, 145, 145, 131, 127, 129] + "max": 208, + "n": 21, + "samples": [133, 134, 138, 136, 134, 131, 130, 132, 133, 134, 129, 128, 131, 145, 145, 131, 127, 129, 176, 208, 154] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" } }, "description": "And the height, making it 64x64: four times the cells of the 32x32 the pair started from. Reallocating on each axis separately is the shape a UI resize actually takes." @@ -210,14 +210,14 @@ "observed": { "desktop-macos": { "tick_us": { - "p50": 132, - "p95": 145, + "p50": 134, + "p95": 161, "min": 129, - "max": 145, - "n": 18, - "samples": [133, 140, 137, 136, 135, 131, 132, 131, 131, 134, 130, 138, 129, 145, 145, 131, 129, 132] + "max": 264, + "n": 21, + "samples": [133, 140, 137, 136, 135, 131, 132, 131, 131, 134, 130, 138, 129, 145, 145, 131, 129, 132, 264, 150, 161] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" } } }, @@ -232,14 +232,14 @@ "observed": { "desktop-macos": { "tick_us": { - "p50": 131, - "p95": 147, + "p50": 134, + "p95": 158, "min": 127, - "max": 147, - "n": 18, - "samples": [134, 141, 138, 135, 147, 134, 130, 131, 129, 135, 129, 129, 129, 146, 145, 129, 128, 127] + "max": 296, + "n": 21, + "samples": [134, 141, 138, 135, 147, 134, 130, 131, 129, 135, 129, 129, 129, 146, 145, 129, 128, 127, 296, 138, 158] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" } } }, @@ -255,13 +255,13 @@ "desktop-macos": { "tick_us": { "p50": 36, - "p95": 40, + "p95": 42, "min": 35, - "max": 40, - "n": 17, - "samples": [39, 38, 36, 40, 36, 35, 36, 35, 37, 35, 35, 35, 40, 40, 35, 35, 35] + "max": 106, + "n": 20, + "samples": [39, 38, 36, 40, 36, 35, 36, 35, 37, 35, 35, 35, 40, 40, 35, 35, 35, 106, 37, 42] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" } } }, @@ -276,13 +276,13 @@ "desktop-macos": { "tick_us": { "p50": 11, - "p95": 12, + "p95": 13, "min": 10, - "max": 12, - "n": 17, - "samples": [12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 11, 11, 10] + "max": 80, + "n": 20, + "samples": [12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 11, 11, 10, 80, 11, 13] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" } } }, @@ -296,14 +296,14 @@ "observed": { "desktop-macos": { "tick_us": { - "p50": 220, - "p95": 249, + "p50": 222, + "p95": 259, "min": 215, - "max": 249, - "n": 17, - "samples": [249, 232, 229, 220, 220, 220, 222, 219, 227, 217, 226, 219, 249, 247, 217, 218, 215] + "max": 326, + "n": 20, + "samples": [249, 232, 229, 220, 220, 220, 222, 219, 227, 217, 226, 219, 249, 247, 217, 218, 215, 326, 222, 259] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" } } }, @@ -321,11 +321,11 @@ "p50": 11, "p95": 12, "min": 10, - "max": 12, - "n": 17, - "samples": [12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 12, 12, 11, 11, 11] + "max": 13, + "n": 20, + "samples": [12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 12, 12, 11, 11, 11, 12, 12, 13] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" } } }, @@ -341,13 +341,13 @@ "desktop-macos": { "tick_us": { "p50": 9, - "p95": 29, + "p95": 10, "min": 8, "max": 29, - "n": 18, - "samples": [29, 9, 9, 9, 8, 8, 8, 8, 8, 9, 8, 9, 8, 9, 10, 8, 9, 9] + "n": 21, + "samples": [29, 9, 9, 9, 8, 8, 8, 8, 8, 9, 8, 9, 8, 9, 10, 8, 9, 9, 10, 9, 10] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" } } }, @@ -365,10 +365,10 @@ "p95": 8, "min": 6, "max": 8, - "n": 18, - "samples": [7, 7, 7, 7, 6, 7, 6, 7, 8, 8, 7, 7, 6, 8, 7, 6, 7, 7] + "n": 21, + "samples": [7, 7, 7, 7, 6, 7, 6, 7, 8, 8, 7, 7, 6, 8, 7, 6, 7, 7, 8, 7, 8] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" } } } diff --git a/test/scenarios/light/scenario_GridBlacks_blackpixel.json b/test/scenarios/light/scenario_GridBlacks_blackpixel.json index 6d0258b9..84b13721 100644 --- a/test/scenarios/light/scenario_GridBlacks_blackpixel.json +++ b/test/scenarios/light/scenario_GridBlacks_blackpixel.json @@ -90,14 +90,14 @@ "observed": { "desktop-macos": { "tick_us": { - "p50": 2, + "p50": 1, "p95": 12, "min": 1, "max": 27, "n": 32, - "samples": [8, 6, 7, 27, 12, 6, 3, 11, 4, 5, 7, 7, 5, 5, 2, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + "samples": [27, 12, 6, 3, 11, 4, 5, 7, 7, 5, 5, 2, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32s3-n16r8": { "tick_us": { @@ -198,9 +198,9 @@ "min": 2, "max": 25, "n": 32, - "samples": [10, 8, 10, 15, 16, 8, 5, 25, 5, 5, 10, 10, 7, 7, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2] + "samples": [15, 16, 8, 5, 25, 5, 5, 10, 10, 7, 7, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32s3-n16r8": { "tick_us": { diff --git a/test/scenarios/light/scenario_GridLayout_resize.json b/test/scenarios/light/scenario_GridLayout_resize.json index f3d197ac..1eee602c 100644 --- a/test/scenarios/light/scenario_GridLayout_resize.json +++ b/test/scenarios/light/scenario_GridLayout_resize.json @@ -122,9 +122,9 @@ "min": 117, "max": 316, "n": 32, - "samples": [157, 244, 128, 127, 241, 280, 306, 311, 167, 316, 183, 292, 249, 240, 128, 126, 120, 118, 120, 128, 117, 119, 122, 117, 121, 120, 124, 125, 126, 119, 189, 124] + "samples": [127, 241, 280, 306, 311, 167, 316, 183, 292, 249, 240, 128, 126, 120, 118, 120, 128, 117, 119, 122, 117, 121, 120, 124, 125, 126, 119, 189, 124, 141, 131, 143] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32-eth-wifi": { "tick_us": { @@ -300,13 +300,13 @@ "desktop-macos": { "tick_us": { "p50": 66, - "p95": 145, + "p95": 151, "min": 59, "max": 161, "n": 32, - "samples": [74, 135, 66, 63, 132, 145, 118, 161, 84, 144, 90, 126, 125, 118, 68, 68, 65, 66, 64, 61, 59, 64, 65, 59, 65, 65, 66, 62, 63, 64, 60, 64] + "samples": [63, 132, 145, 118, 161, 84, 144, 90, 126, 125, 118, 68, 68, 65, 66, 64, 61, 59, 64, 65, 59, 65, 65, 66, 62, 63, 64, 60, 64, 67, 151, 69] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32-eth-wifi": { "tick_us": { @@ -482,13 +482,13 @@ "desktop-macos": { "tick_us": { "p50": 126, - "p95": 298, + "p95": 283, "min": 116, - "max": 309, + "max": 298, "n": 32, - "samples": [149, 309, 129, 125, 247, 283, 243, 298, 166, 249, 182, 209, 247, 240, 126, 127, 120, 123, 121, 123, 116, 120, 122, 119, 121, 120, 122, 126, 127, 120, 120, 142] + "samples": [125, 247, 283, 243, 298, 166, 249, 182, 209, 247, 240, 126, 127, 120, 123, 121, 123, 116, 120, 122, 119, 121, 120, 122, 126, 127, 120, 120, 142, 190, 142, 142] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32-eth-wifi": { "tick_us": { diff --git a/test/scenarios/light/scenario_Layer_base_pipeline.json b/test/scenarios/light/scenario_Layer_base_pipeline.json index dd486fe4..1532dbfe 100644 --- a/test/scenarios/light/scenario_Layer_base_pipeline.json +++ b/test/scenarios/light/scenario_Layer_base_pipeline.json @@ -84,13 +84,13 @@ "desktop-macos": { "tick_us": { "p50": 71, - "p95": 179, + "p95": 197, "min": 64, - "max": 197, + "max": 241, "n": 32, - "samples": [143, 73, 68, 131, 86, 123, 94, 122, 107, 179, 178, 197, 123, 125, 71, 65, 72, 70, 69, 66, 64, 66, 66, 64, 71, 70, 70, 68, 69, 70, 67, 139] + "samples": [131, 86, 123, 94, 122, 107, 179, 178, 197, 123, 125, 71, 65, 72, 70, 69, 66, 64, 66, 66, 64, 71, 70, 70, 68, 69, 70, 67, 139, 241, 77, 77] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "desktop-windows": { "tick_us": { diff --git a/test/scenarios/light/scenario_Layer_memory_1to1.json b/test/scenarios/light/scenario_Layer_memory_1to1.json index 2c8f4130..d5220420 100644 --- a/test/scenarios/light/scenario_Layer_memory_1to1.json +++ b/test/scenarios/light/scenario_Layer_memory_1to1.json @@ -85,9 +85,9 @@ "min": 5, "max": 41, "n": 32, - "samples": [18, 11, 11, 10, 40, 14, 7, 10, 7, 9, 41, 27, 10, 11, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6] + "samples": [10, 40, 14, 7, 10, 7, 9, 41, 27, 10, 11, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 24, 5, 7] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "desktop-windows": { "tick_us": { diff --git a/test/scenarios/light/scenario_Layouts_mutation.json b/test/scenarios/light/scenario_Layouts_mutation.json index ca7be306..b1a8e8fc 100644 --- a/test/scenarios/light/scenario_Layouts_mutation.json +++ b/test/scenarios/light/scenario_Layouts_mutation.json @@ -79,13 +79,13 @@ "desktop-macos": { "tick_us": { "p50": 17, - "p95": 50, + "p95": 61, "min": 16, - "max": 61, + "max": 83, "n": 32, - "samples": [38, 17, 17, 33, 23, 35, 25, 32, 29, 48, 50, 61, 32, 32, 16, 16, 17, 17, 16, 17, 17, 16, 16, 17, 16, 16, 17, 18, 18, 16, 17, 16] + "samples": [33, 23, 35, 25, 32, 29, 48, 50, 61, 32, 32, 16, 16, 17, 17, 16, 17, 17, 16, 16, 17, 16, 16, 17, 18, 18, 16, 17, 16, 83, 17, 20] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "desktop-windows": { "tick_us": { @@ -209,11 +209,11 @@ "p50": 49, "p95": 126, "min": 43, - "max": 126, + "max": 174, "n": 32, - "samples": [105, 51, 71, 90, 61, 103, 70, 87, 75, 123, 126, 126, 86, 86, 48, 47, 48, 44, 46, 49, 45, 43, 48, 44, 48, 49, 48, 46, 49, 46, 50, 48] + "samples": [90, 61, 103, 70, 87, 75, 123, 126, 126, 86, 86, 48, 47, 48, 44, 46, 49, 45, 43, 48, 44, 48, 49, 48, 46, 49, 46, 50, 48, 174, 50, 72] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "desktop-windows": { "tick_us": { @@ -329,14 +329,14 @@ "observed": { "desktop-macos": { "tick_us": { - "p50": 96, + "p50": 97, "p95": 248, "min": 88, "max": 248, "n": 32, - "samples": [200, 96, 100, 167, 119, 174, 130, 171, 138, 245, 248, 248, 170, 169, 92, 93, 156, 93, 93, 97, 88, 92, 94, 88, 121, 93, 93, 96, 95, 93, 95, 96] + "samples": [167, 119, 174, 130, 171, 138, 245, 248, 248, 170, 169, 92, 93, 156, 93, 93, 97, 88, 92, 94, 88, 121, 93, 93, 96, 95, 93, 95, 96, 211, 97, 114] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "desktop-windows": { "tick_us": { @@ -453,12 +453,12 @@ "tick_us": { "p50": 20, "p95": 47, - "min": 16, + "min": 17, "max": 48, "n": 32, - "samples": [38, 21, 16, 31, 27, 36, 24, 32, 25, 47, 47, 48, 33, 31, 20, 20, 17, 20, 20, 21, 17, 20, 20, 17, 20, 20, 18, 18, 18, 20, 20, 20] + "samples": [31, 27, 36, 24, 32, 25, 47, 47, 48, 33, 31, 20, 20, 17, 20, 20, 21, 17, 20, 20, 17, 20, 20, 18, 18, 18, 20, 20, 20, 29, 22, 26] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "desktop-windows": { "tick_us": { diff --git a/test/scenarios/light/scenario_MoonLiveEffect_controls.json b/test/scenarios/light/scenario_MoonLiveEffect_controls.json index 5e93653f..99af4282 100644 --- a/test/scenarios/light/scenario_MoonLiveEffect_controls.json +++ b/test/scenarios/light/scenario_MoonLiveEffect_controls.json @@ -323,10 +323,10 @@ "p95": 10, "min": 1, "max": 10, - "n": 5, - "samples": [1, 3, 1, 10, 1] + "n": 6, + "samples": [1, 3, 1, 10, 1, 1] }, - "last_updated": "2026-08-31" + "last_updated": "2026-09-07" }, "esp32s3-n16r8": { "tick_us": { @@ -406,10 +406,10 @@ "p95": 3, "min": 1, "max": 3, - "n": 3, - "samples": [1, 3, 1] + "n": 4, + "samples": [1, 3, 1, 1] }, - "last_updated": "2026-08-31" + "last_updated": "2026-09-07" }, "esp32s3-n16r8": { "tick_us": { @@ -569,13 +569,13 @@ "desktop-macos": { "tick_us": { "p50": 1, - "p95": 10, + "p95": 6, "min": 1, "max": 10, - "n": 19, - "samples": [2, 1, 3, 1, 10, 1, 1, 6, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1] + "n": 20, + "samples": [2, 1, 3, 1, 10, 1, 1, 6, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1] }, - "last_updated": "2026-09-03" + "last_updated": "2026-09-07" }, "esp32s3-n16r8": { "tick_us": { @@ -727,13 +727,13 @@ "desktop-macos": { "tick_us": { "p50": 1, - "p95": 7, + "p95": 5, "min": 1, "max": 7, - "n": 19, - "samples": [1, 2, 3, 5, 1, 1, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + "n": 20, + "samples": [1, 2, 3, 5, 1, 1, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] }, - "last_updated": "2026-09-03" + "last_updated": "2026-09-07" }, "esp32": { "tick_us": { diff --git a/test/scenarios/light/scenario_MoonLiveEffect_livescript.json b/test/scenarios/light/scenario_MoonLiveEffect_livescript.json index 9d527e71..f868f30a 100644 --- a/test/scenarios/light/scenario_MoonLiveEffect_livescript.json +++ b/test/scenarios/light/scenario_MoonLiveEffect_livescript.json @@ -89,13 +89,13 @@ "desktop-macos": { "tick_us": { "p50": 6, - "p95": 22, + "p95": 18, "min": 5, "max": 28, "n": 32, - "samples": [12, 22, 11, 15, 8, 12, 9, 14, 28, 18, 10, 10, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 6, 6, 5, 5, 6, 5, 6, 5] + "samples": [15, 8, 12, 9, 14, 28, 18, 10, 10, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 6, 6, 5, 5, 6, 5, 6, 5, 14, 15, 7] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32s3-n16r8": { "tick_us": { @@ -207,13 +207,13 @@ "desktop-macos": { "tick_us": { "p50": 5, - "p95": 24, + "p95": 18, "min": 5, - "max": 34, + "max": 24, "n": 32, - "samples": [14, 34, 13, 18, 9, 12, 9, 16, 24, 17, 11, 10, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 10, 5, 5, 5, 6, 5, 5, 5] + "samples": [18, 9, 12, 9, 16, 24, 17, 11, 10, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 10, 5, 5, 5, 6, 5, 5, 5, 9, 7, 6] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32s3-n16r8": { "tick_us": { @@ -321,9 +321,9 @@ "min": 5, "max": 28, "n": 32, - "samples": [19, 18, 15, 19, 9, 10, 9, 17, 28, 17, 11, 10, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 6, 15, 5, 5, 5, 6, 5, 5, 5] + "samples": [19, 9, 10, 9, 17, 28, 17, 11, 10, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 6, 15, 5, 5, 5, 6, 5, 5, 5, 12, 5, 6] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32s3-n16r8": { "tick_us": { @@ -427,13 +427,13 @@ "desktop-macos": { "tick_us": { "p50": 5, - "p95": 21, + "p95": 19, "min": 4, "max": 29, "n": 32, - "samples": [21, 15, 15, 14, 9, 10, 15, 15, 29, 19, 16, 11, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 4, 5, 5, 5, 5, 5, 5] + "samples": [14, 9, 10, 15, 15, 29, 19, 16, 11, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 4, 5, 5, 5, 5, 5, 5, 6, 5, 7] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32s3-n16r8": { "tick_us": { @@ -534,9 +534,9 @@ "min": 5, "max": 26, "n": 32, - "samples": [11, 20, 12, 14, 8, 11, 12, 14, 26, 20, 11, 13, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 7, 5, 5, 5, 5, 5, 5, 5] + "samples": [14, 8, 11, 12, 14, 26, 20, 11, 13, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 7, 5, 5, 5, 5, 5, 5, 5, 10, 5, 7] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32s3-n16r8": { "tick_us": { @@ -633,13 +633,13 @@ "desktop-macos": { "tick_us": { "p50": 5, - "p95": 24, + "p95": 22, "min": 5, "max": 26, "n": 32, - "samples": [15, 24, 11, 22, 7, 10, 12, 16, 26, 18, 11, 11, 5, 5, 5, 5, 5, 5, 5, 5, 5, 7, 5, 5, 8, 5, 5, 5, 6, 5, 5, 5] + "samples": [22, 7, 10, 12, 16, 26, 18, 11, 11, 5, 5, 5, 5, 5, 5, 5, 5, 5, 7, 5, 5, 8, 5, 5, 5, 6, 5, 5, 5, 14, 5, 7] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32s3-n16r8": { "tick_us": { @@ -736,13 +736,13 @@ "desktop-macos": { "tick_us": { "p50": 5, - "p95": 8, + "p95": 10, "min": 5, - "max": 8, - "n": 11, - "samples": [5, 5, 5, 8, 5, 5, 7, 5, 5, 5, 5] + "max": 10, + "n": 14, + "samples": [5, 5, 5, 8, 5, 5, 7, 5, 5, 5, 5, 10, 6, 7] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" } } }, @@ -758,13 +758,13 @@ "desktop-macos": { "tick_us": { "p50": 5, - "p95": 6, + "p95": 12, "min": 5, - "max": 6, - "n": 11, - "samples": [5, 5, 5, 6, 5, 5, 6, 6, 5, 5, 5] + "max": 12, + "n": 14, + "samples": [5, 5, 5, 6, 5, 5, 6, 6, 5, 5, 5, 6, 12, 6] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" } } }, @@ -779,14 +779,14 @@ "observed": { "desktop-macos": { "tick_us": { - "p50": 5, - "p95": 6, + "p50": 6, + "p95": 7, "min": 5, - "max": 6, - "n": 11, - "samples": [5, 5, 5, 6, 5, 6, 6, 6, 5, 6, 5] + "max": 7, + "n": 14, + "samples": [5, 5, 5, 6, 5, 6, 6, 6, 5, 6, 5, 7, 6, 6] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" } } }, @@ -804,9 +804,9 @@ "min": 5, "max": 22, "n": 32, - "samples": [12, 20, 17, 22, 7, 11, 14, 18, 21, 18, 11, 13, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 6, 5, 5, 5, 5] + "samples": [22, 7, 11, 14, 18, 21, 18, 11, 13, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 6, 5, 5, 5, 5, 9, 6, 6] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32s3-n16r8": { "tick_us": { @@ -903,13 +903,13 @@ "desktop-macos": { "tick_us": { "p50": 5, - "p95": 29, + "p95": 24, "min": 5, - "max": 32, + "max": 29, "n": 32, - "samples": [12, 32, 13, 24, 8, 10, 15, 15, 29, 18, 10, 13, 5, 5, 6, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5] + "samples": [24, 8, 10, 15, 15, 29, 18, 10, 13, 5, 5, 6, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 9, 6] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32s3-n16r8": { "tick_us": { @@ -1006,13 +1006,13 @@ "desktop-macos": { "tick_us": { "p50": 5, - "p95": 31, + "p95": 22, "min": 5, - "max": 37, + "max": 31, "n": 32, - "samples": [16, 37, 10, 31, 7, 9, 15, 14, 21, 22, 12, 10, 5, 6, 5, 5, 6, 5, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5] + "samples": [31, 7, 9, 15, 14, 21, 22, 12, 10, 5, 6, 5, 5, 6, 5, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 7, 7, 6] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32": { "tick_us": { diff --git a/test/scenarios/light/scenario_MoonLive_pipeline.json b/test/scenarios/light/scenario_MoonLive_pipeline.json index b3c5d08a..46eb9000 100644 --- a/test/scenarios/light/scenario_MoonLive_pipeline.json +++ b/test/scenarios/light/scenario_MoonLive_pipeline.json @@ -375,13 +375,13 @@ "desktop-macos": { "tick_us": { "p50": 5, - "p95": 47, + "p95": 30, "min": 5, - "max": 54, + "max": 47, "n": 32, - "samples": [54, 25, 10, 25, 19, 20, 13, 30, 7, 12, 47, 17, 14, 11, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 6, 5, 5, 5, 5] + "samples": [25, 19, 20, 13, 30, 7, 12, 47, 17, 14, 11, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 6, 5, 5, 5, 5, 6, 7, 6] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32s3-n16r8": { "tick_us": { @@ -536,9 +536,9 @@ "min": 5, "max": 32, "n": 32, - "samples": [18, 19, 11, 19, 20, 15, 12, 32, 7, 9, 14, 21, 10, 9, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 6, 6, 5, 5, 5] + "samples": [19, 20, 15, 12, 32, 7, 9, 14, 21, 10, 9, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 6, 6, 5, 5, 5, 6, 6, 7] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32s3-n16r8": { "tick_us": { @@ -687,9 +687,9 @@ "min": 5, "max": 21, "n": 32, - "samples": [13, 11, 12, 12, 21, 19, 20, 17, 8, 8, 17, 18, 10, 10, 5, 6, 5, 6, 5, 5, 6, 5, 5, 5, 6, 5, 6, 5, 5, 5, 6, 8] + "samples": [12, 21, 19, 20, 17, 8, 8, 17, 18, 10, 10, 5, 6, 5, 6, 5, 5, 6, 5, 5, 5, 6, 5, 6, 5, 5, 5, 6, 8, 11, 6, 7] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32s3-n16r8": { "tick_us": { @@ -989,9 +989,9 @@ "min": 5, "max": 25, "n": 32, - "samples": [8, 20, 13, 18, 20, 21, 24, 25, 8, 10, 10, 18, 10, 10, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5] + "samples": [18, 20, 21, 24, 25, 8, 10, 10, 18, 10, 10, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 6, 7] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32s3-n16r8": { "tick_us": { @@ -1129,11 +1129,11 @@ "p50": 5, "p95": 24, "min": 5, - "max": 397, + "max": 24, "n": 32, - "samples": [22, 397, 12, 17, 18, 22, 24, 11, 8, 9, 13, 24, 10, 11, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 5, 5, 5] + "samples": [17, 18, 22, 24, 11, 8, 9, 13, 24, 10, 11, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 5, 5, 5, 6, 5, 7] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32s3-n16r8": { "tick_us": { diff --git a/test/scenarios/light/scenario_MultiplyModifier_memory_lut.json b/test/scenarios/light/scenario_MultiplyModifier_memory_lut.json index fafbd037..6e06bbb4 100644 --- a/test/scenarios/light/scenario_MultiplyModifier_memory_lut.json +++ b/test/scenarios/light/scenario_MultiplyModifier_memory_lut.json @@ -90,13 +90,13 @@ "desktop-macos": { "tick_us": { "p50": 3, - "p95": 21, + "p95": 19, "min": 2, - "max": 241, + "max": 21, "n": 32, - "samples": [241, 7, 8, 18, 17, 13, 4, 19, 4, 5, 21, 14, 6, 6, 3, 3, 3, 2, 3, 3, 3, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3] + "samples": [18, 17, 13, 4, 19, 4, 5, 21, 14, 6, 6, 3, 3, 3, 2, 3, 3, 3, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 4] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "desktop-windows": { "tick_us": { diff --git a/test/scenarios/light/scenario_MultiplyModifier_pipeline.json b/test/scenarios/light/scenario_MultiplyModifier_pipeline.json index d3d25541..9c02b9ba 100644 --- a/test/scenarios/light/scenario_MultiplyModifier_pipeline.json +++ b/test/scenarios/light/scenario_MultiplyModifier_pipeline.json @@ -94,9 +94,9 @@ "min": 117, "max": 302, "n": 32, - "samples": [126, 125, 150, 127, 128, 238, 283, 277, 174, 302, 182, 214, 235, 240, 127, 126, 118, 119, 117, 121, 117, 119, 119, 118, 122, 119, 121, 127, 129, 119, 121, 119] + "samples": [127, 128, 238, 283, 277, 174, 302, 182, 214, 235, 240, 127, 126, 118, 119, 117, 121, 117, 119, 119, 118, 122, 119, 121, 127, 129, 119, 121, 119, 172, 126, 146] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "desktop-windows": { "tick_us": { diff --git a/test/scenarios/light/scenario_Trails_ladder.json b/test/scenarios/light/scenario_Trails_ladder.json index a1c85024..bf060dd0 100644 --- a/test/scenarios/light/scenario_Trails_ladder.json +++ b/test/scenarios/light/scenario_Trails_ladder.json @@ -87,13 +87,13 @@ "desktop-macos": { "tick_us": { "p50": 11, - "p95": 13, + "p95": 14, "min": 10, - "max": 13, - "n": 18, - "samples": [11, 10, 10, 10, 11, 11, 11, 11, 11, 13, 12, 11, 11, 13, 13, 11, 12, 11] + "max": 15, + "n": 21, + "samples": [11, 10, 10, 10, 11, 11, 11, 11, 11, 13, 12, 11, 11, 13, 13, 11, 12, 11, 15, 11, 14] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" } } }, @@ -123,14 +123,14 @@ "observed": { "desktop-macos": { "tick_us": { - "p50": 45, + "p50": 46, "p95": 57, "min": 40, - "max": 57, - "n": 18, - "samples": [57, 40, 42, 41, 45, 45, 45, 45, 45, 47, 46, 46, 49, 50, 53, 45, 44, 46] + "max": 60, + "n": 21, + "samples": [57, 40, 42, 41, 45, 45, 45, 45, 45, 47, 46, 46, 49, 50, 53, 45, 44, 46, 49, 60, 56] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" } } }, @@ -160,14 +160,14 @@ "observed": { "desktop-macos": { "tick_us": { - "p50": 180, - "p95": 208, + "p50": 182, + "p95": 222, "min": 160, - "max": 208, - "n": 18, - "samples": [208, 160, 166, 165, 182, 178, 180, 184, 180, 183, 186, 179, 187, 200, 202, 178, 178, 178] + "max": 233, + "n": 21, + "samples": [208, 160, 166, 165, 182, 178, 180, 184, 180, 183, 186, 179, 187, 200, 202, 178, 178, 178, 233, 191, 222] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" } } }, @@ -204,14 +204,14 @@ "observed": { "desktop-macos": { "tick_us": { - "p50": 349, + "p50": 352, "p95": 396, "min": 313, - "max": 396, - "n": 18, - "samples": [323, 313, 331, 324, 358, 348, 353, 357, 352, 357, 361, 351, 349, 396, 395, 347, 349, 348] + "max": 437, + "n": 21, + "samples": [323, 313, 331, 324, 358, 348, 353, 357, 352, 357, 361, 351, 349, 396, 395, 347, 349, 348, 394, 372, 437] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" } } }, @@ -234,14 +234,14 @@ "observed": { "desktop-macos": { "tick_us": { - "p50": 355, - "p95": 608, + "p50": 360, + "p95": 442, "min": 312, "max": 608, - "n": 18, - "samples": [321, 312, 334, 332, 442, 353, 358, 354, 351, 608, 364, 362, 373, 423, 414, 354, 360, 355] + "n": 21, + "samples": [321, 312, 334, 332, 442, 353, 358, 354, 351, 608, 364, 362, 373, 423, 414, 354, 360, 355, 373, 384, 433] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" } } }, @@ -264,14 +264,14 @@ "observed": { "desktop-macos": { "tick_us": { - "p50": 351, - "p95": 451, + "p50": 354, + "p95": 434, "min": 312, "max": 451, - "n": 18, - "samples": [319, 312, 336, 350, 359, 351, 354, 354, 365, 370, 365, 351, 348, 451, 413, 350, 350, 349] + "n": 21, + "samples": [319, 312, 336, 350, 359, 351, 354, 354, 365, 370, 365, 351, 348, 451, 413, 350, 350, 349, 373, 412, 434] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" } } }, @@ -308,14 +308,14 @@ "observed": { "desktop-macos": { "tick_us": { - "p50": 180, - "p95": 250, + "p50": 182, + "p95": 221, "min": 164, "max": 250, - "n": 18, - "samples": [164, 169, 169, 166, 183, 178, 180, 182, 189, 186, 185, 180, 183, 250, 210, 177, 177, 181] + "n": 21, + "samples": [164, 169, 169, 166, 183, 178, 180, 182, 189, 186, 185, 180, 183, 250, 210, 177, 177, 181, 203, 210, 221] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" } } } diff --git a/test/scenarios/light/scenario_modifier_chain.json b/test/scenarios/light/scenario_modifier_chain.json index c0275ae3..9c911f8f 100644 --- a/test/scenarios/light/scenario_modifier_chain.json +++ b/test/scenarios/light/scenario_modifier_chain.json @@ -11,7 +11,7 @@ "Layouts", "GridLayout", "Drivers", - "NetworkSendDriver" + "PreviewDriver" ], "description": "Stack TWO modifiers on one Layer (Region then Multiply) and verify the chain composes live end-to-end β€” the capability the old single-modifier engine couldn't do. Prepares its own canvas: Layout(Grid 32x32) + Layer + NoiseEffect + Region(0..50) + Multiply(2x), measures the composite, then adds a third (Checkerboard mask) and measures again, then removes the middle modifier and measures β€” exercising add/remove on a multi-modifier chain. A broken fold (null buffer, wrong light count, crash on a disabled/removed stage) shows up as a failed measure. The fold composition + order semantics are pinned by unit_Layer_modifier_chain; this is the live end-to-end gate.", "fixture": [ @@ -88,9 +88,10 @@ { "name": "fix-artnet", "op": "add_module", - "id": "ArtNet", - "type": "NetworkSendDriver", - "parent_id": "Drivers" + "id": "Preview", + "type": "PreviewDriver", + "parent_id": "Drivers", + "description": "An in-process sink, not a network one: this scenario is about how a modifier CHAIN folds, and routing it through NetworkSendDriver pulled socket behavior into a test that is not about the network (CodeRabbit #29). PreviewDriver consumes the composite in memory." } ], "steps": [ @@ -106,9 +107,9 @@ "min": 8, "max": 43, "n": 32, - "samples": [31, 8, 9, 16, 14, 17, 12, 18, 15, 24, 32, 43, 17, 16, 8, 8, 8, 8, 8, 10, 9, 8, 9, 8, 12, 10, 10, 24, 10, 8, 10, 10] + "samples": [14, 17, 12, 18, 15, 24, 32, 43, 17, 16, 8, 8, 8, 8, 8, 10, 9, 8, 9, 8, 12, 10, 10, 24, 10, 8, 10, 10, 13, 11, 9, 10] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "desktop-windows": { "tick_us": { @@ -162,13 +163,13 @@ "desktop-macos": { "tick_us": { "p50": 9, - "p95": 36, + "p95": 26, "min": 6, "max": 56, "n": 32, - "samples": [36, 7, 7, 14, 10, 21, 11, 15, 13, 22, 23, 26, 14, 14, 7, 7, 6, 7, 7, 9, 7, 6, 9, 7, 7, 9, 9, 56, 8, 9, 9, 9] + "samples": [10, 21, 11, 15, 13, 22, 23, 26, 14, 14, 7, 7, 6, 7, 7, 9, 7, 6, 9, 7, 7, 9, 9, 56, 8, 9, 9, 9, 10, 10, 8, 8] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "desktop-windows": { "tick_us": { @@ -219,14 +220,14 @@ "observed": { "desktop-macos": { "tick_us": { - "p50": 26, - "p95": 72, + "p50": 25, + "p95": 69, "min": 21, - "max": 74, + "max": 72, "n": 32, - "samples": [74, 27, 23, 48, 30, 65, 33, 48, 41, 63, 72, 69, 43, 46, 26, 22, 24, 22, 22, 28, 21, 21, 24, 21, 27, 24, 25, 26, 24, 24, 24, 25] + "samples": [30, 65, 33, 48, 41, 63, 72, 69, 43, 46, 26, 22, 24, 22, 22, 28, 21, 21, 24, 21, 27, 24, 25, 26, 24, 24, 24, 25, 28, 25, 23, 24] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "desktop-windows": { "tick_us": { @@ -252,14 +253,14 @@ "observed": { "desktop-macos": { "tick_us": { - "p50": 47, - "p95": 123, + "p50": 44, + "p95": 112, "min": 37, "max": 138, "n": 32, - "samples": [123, 47, 47, 72, 52, 88, 55, 77, 73, 112, 110, 138, 77, 83, 47, 47, 43, 43, 44, 41, 42, 40, 44, 37, 39, 44, 43, 48, 43, 45, 44, 44] + "samples": [52, 88, 55, 77, 73, 112, 110, 138, 77, 83, 47, 47, 43, 43, 44, 41, 42, 40, 44, 37, 39, 44, 43, 48, 43, 45, 44, 44, 50, 44, 40, 45] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "desktop-windows": { "tick_us": { diff --git a/test/scenarios/light/scenario_modifier_swap.json b/test/scenarios/light/scenario_modifier_swap.json index 7da7562a..00e23ab8 100644 --- a/test/scenarios/light/scenario_modifier_swap.json +++ b/test/scenarios/light/scenario_modifier_swap.json @@ -156,9 +156,9 @@ "min": 8, "max": 246, "n": 32, - "samples": [26, 9, 8, 17, 11, 33, 12, 17, 49, 25, 246, 71, 16, 35, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 12, 9, 9, 10, 8] + "samples": [17, 11, 33, 12, 17, 49, 25, 246, 71, 16, 35, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 12, 9, 9, 10, 8, 8, 9, 10] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32-eth": { "tick_us": { @@ -300,9 +300,9 @@ "min": 20, "max": 160, "n": 32, - "samples": [64, 24, 22, 42, 31, 46, 33, 43, 61, 65, 160, 87, 45, 74, 25, 25, 21, 21, 20, 21, 21, 20, 22, 21, 22, 20, 21, 31, 24, 24, 24, 20] + "samples": [42, 31, 46, 33, 43, 61, 65, 160, 87, 45, 74, 25, 25, 21, 21, 20, 21, 21, 20, 22, 21, 22, 20, 21, 31, 24, 24, 24, 20, 24, 23, 24] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32-eth": { "tick_us": { @@ -444,9 +444,9 @@ "min": 8, "max": 106, "n": 32, - "samples": [30, 11, 10, 16, 11, 36, 12, 16, 29, 25, 47, 49, 18, 39, 10, 10, 10, 9, 10, 8, 9, 11, 10, 8, 9, 9, 8, 106, 9, 10, 10, 10] + "samples": [16, 11, 36, 12, 16, 29, 25, 47, 49, 18, 39, 10, 10, 10, 9, 10, 8, 9, 11, 10, 8, 9, 9, 8, 106, 9, 10, 10, 10, 11, 12, 10] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32-eth": { "tick_us": { diff --git a/test/scenarios/light/scenario_perf_full.json b/test/scenarios/light/scenario_perf_full.json index 8c8d6481..af8b761c 100644 --- a/test/scenarios/light/scenario_perf_full.json +++ b/test/scenarios/light/scenario_perf_full.json @@ -90,9 +90,9 @@ "min": 1, "max": 9, "n": 32, - "samples": [7, 2, 2, 4, 3, 5, 3, 5, 4, 8, 9, 9, 5, 5, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + "samples": [4, 3, 5, 3, 5, 4, 8, 9, 9, 5, 5, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32s3-n16r8": { "tick_us": { @@ -210,9 +210,9 @@ "min": 1, "max": 14, "n": 32, - "samples": [7, 2, 2, 4, 4, 5, 4, 5, 5, 7, 7, 14, 5, 5, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + "samples": [4, 4, 5, 4, 5, 5, 7, 7, 14, 5, 5, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32s3-n16r8": { "tick_us": { @@ -330,9 +330,9 @@ "min": 1, "max": 12, "n": 32, - "samples": [7, 2, 2, 4, 3, 5, 3, 5, 4, 7, 8, 12, 5, 5, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + "samples": [4, 3, 5, 3, 5, 4, 7, 8, 12, 5, 5, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32s3-n16r8": { "tick_us": { @@ -573,9 +573,9 @@ "min": 1, "max": 31, "n": 32, - "samples": [7, 2, 2, 4, 3, 7, 3, 5, 4, 7, 8, 31, 5, 5, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + "samples": [4, 3, 7, 3, 5, 4, 7, 8, 31, 5, 5, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32s3-n16r8": { "tick_us": { @@ -686,14 +686,14 @@ "observed": { "desktop-macos": { "tick_us": { - "p50": 2, + "p50": 1, "p95": 9, "min": 1, "max": 26, "n": 32, - "samples": [7, 2, 2, 4, 3, 6, 3, 5, 4, 7, 26, 9, 5, 5, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1] + "samples": [4, 3, 6, 3, 5, 4, 7, 26, 9, 5, 5, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32s3-n16r8": { "tick_us": { @@ -820,9 +820,9 @@ "min": 1, "max": 13, "n": 32, - "samples": [7, 2, 2, 4, 3, 13, 3, 5, 4, 7, 7, 8, 5, 5, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + "samples": [4, 3, 13, 3, 5, 4, 7, 7, 8, 5, 5, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32s3-n16r8": { "tick_us": { @@ -953,9 +953,9 @@ "min": 1, "max": 11, "n": 32, - "samples": [7, 2, 2, 4, 3, 7, 3, 5, 4, 7, 11, 8, 5, 5, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + "samples": [4, 3, 7, 3, 5, 4, 7, 11, 8, 5, 5, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32s3-n16r8": { "tick_us": { @@ -1060,9 +1060,9 @@ "min": 1, "max": 21, "n": 32, - "samples": [7, 2, 2, 4, 3, 6, 3, 5, 4, 7, 12, 21, 5, 6, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + "samples": [4, 3, 6, 3, 5, 4, 7, 12, 21, 5, 6, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32p4rev1-eth": { "tick_us": { @@ -1173,9 +1173,9 @@ "min": 1, "max": 11, "n": 32, - "samples": [7, 2, 2, 4, 3, 5, 3, 5, 4, 7, 9, 11, 9, 5, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + "samples": [4, 3, 5, 3, 5, 4, 7, 9, 11, 9, 5, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32s3-n16r8": { "tick_us": { @@ -1292,14 +1292,14 @@ "observed": { "desktop-macos": { "tick_us": { - "p50": 6, + "p50": 5, "p95": 35, "min": 4, "max": 38, "n": 32, - "samples": [27, 10, 9, 16, 13, 20, 15, 19, 19, 29, 27, 38, 35, 19, 9, 9, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 5, 4, 4, 4] + "samples": [16, 13, 20, 15, 19, 19, 29, 27, 38, 35, 19, 9, 9, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 5, 4, 4, 4, 5, 5, 5] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32s3-n16r8": { "tick_us": { @@ -1416,14 +1416,14 @@ "observed": { "desktop-macos": { "tick_us": { - "p50": 23, + "p50": 20, "p95": 174, "min": 17, "max": 255, "n": 32, - "samples": [102, 41, 41, 73, 58, 137, 62, 82, 74, 123, 255, 174, 113, 82, 41, 40, 17, 17, 17, 18, 18, 17, 18, 18, 18, 18, 18, 23, 21, 18, 18, 18] + "samples": [73, 58, 137, 62, 82, 74, 123, 255, 174, 113, 82, 41, 40, 17, 17, 17, 18, 18, 17, 18, 18, 18, 18, 18, 23, 21, 18, 18, 18, 20, 20, 21] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32s3-n16r8": { "tick_us": { @@ -1540,14 +1540,14 @@ "observed": { "desktop-macos": { "tick_us": { - "p50": 113, + "p50": 80, "p95": 1023, "min": 70, "max": 2016, "n": 32, - "samples": [408, 178, 175, 303, 237, 529, 276, 354, 308, 542, 2016, 1023, 414, 368, 174, 173, 71, 70, 70, 74, 74, 71, 70, 73, 75, 72, 74, 113, 86, 71, 71, 70] + "samples": [303, 237, 529, 276, 354, 308, 542, 2016, 1023, 414, 368, 174, 173, 71, 70, 70, 74, 74, 71, 70, 73, 75, 72, 74, 113, 86, 71, 71, 70, 76, 80, 88] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32s3-n16r8": { "tick_us": { @@ -1673,13 +1673,13 @@ "desktop-macos": { "tick_us": { "p50": 4, - "p95": 15, + "p95": 14, "min": 4, - "max": 16, + "max": 15, "n": 32, - "samples": [16, 4, 4, 7, 6, 15, 7, 9, 8, 14, 13, 14, 9, 9, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 4, 4, 4, 4] + "samples": [7, 6, 15, 7, 9, 8, 14, 13, 14, 9, 9, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 4, 4, 4, 4, 4, 4, 5] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32s3-n16r8": { "tick_us": { @@ -1801,9 +1801,9 @@ "min": 15, "max": 92, "n": 32, - "samples": [44, 18, 17, 30, 23, 39, 27, 35, 30, 59, 72, 57, 35, 37, 17, 17, 15, 15, 15, 16, 16, 16, 16, 16, 17, 15, 16, 92, 19, 16, 16, 16] + "samples": [30, 23, 39, 27, 35, 30, 59, 72, 57, 35, 37, 17, 17, 15, 15, 15, 16, 16, 16, 16, 16, 17, 15, 16, 92, 19, 16, 16, 16, 16, 19, 19] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32s3-n16r8": { "tick_us": { @@ -1925,9 +1925,9 @@ "min": 61, "max": 574, "n": 32, - "samples": [203, 71, 71, 122, 92, 191, 107, 140, 120, 298, 360, 297, 144, 165, 69, 69, 62, 62, 61, 66, 65, 64, 63, 64, 64, 63, 67, 574, 74, 64, 62, 63] + "samples": [122, 92, 191, 107, 140, 120, 298, 360, 297, 144, 165, 69, 69, 62, 62, 61, 66, 65, 64, 63, 64, 64, 63, 67, 574, 74, 64, 62, 63, 82, 72, 74] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32s3-n16r8": { "tick_us": { @@ -2049,9 +2049,9 @@ "min": 247, "max": 12932, "n": 32, - "samples": [717, 285, 279, 489, 371, 879, 429, 558, 499, 1114, 12932, 1097, 562, 589, 278, 279, 252, 249, 247, 256, 265, 251, 255, 259, 267, 257, 264, 402, 298, 250, 259, 252] + "samples": [489, 371, 879, 429, 558, 499, 1114, 12932, 1097, 562, 589, 278, 279, 252, 249, 247, 256, 265, 251, 255, 259, 267, 257, 264, 402, 298, 250, 259, 252, 285, 294, 301] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32s3-n16r8": { "tick_us": { @@ -2208,9 +2208,9 @@ "min": 1, "max": 13, "n": 32, - "samples": [3, 1, 1, 2, 1, 8, 2, 2, 2, 5, 13, 4, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1] + "samples": [2, 1, 8, 2, 2, 2, 5, 13, 4, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32": { "tick_us": { @@ -2332,9 +2332,9 @@ "min": 4, "max": 20, "n": 32, - "samples": [11, 5, 4, 8, 6, 20, 7, 9, 7, 19, 18, 13, 9, 9, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 5, 4, 4, 4] + "samples": [8, 6, 20, 7, 9, 7, 19, 18, 13, 9, 9, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 5, 4, 4, 4, 4, 4, 5] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32": { "tick_us": { @@ -2451,14 +2451,14 @@ }, "desktop-macos": { "tick_us": { - "p50": 18, + "p50": 17, "p95": 74, "min": 15, "max": 113, "n": 32, - "samples": [41, 19, 18, 31, 24, 65, 27, 35, 30, 74, 113, 52, 35, 35, 18, 17, 16, 15, 15, 16, 16, 15, 16, 16, 16, 16, 16, 27, 18, 15, 15, 15] + "samples": [31, 24, 65, 27, 35, 30, 74, 113, 52, 35, 35, 18, 17, 16, 15, 15, 16, 16, 15, 16, 16, 16, 16, 16, 27, 18, 15, 15, 15, 17, 18, 18] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32": { "tick_us": { @@ -2580,9 +2580,9 @@ "min": 62, "max": 574, "n": 32, - "samples": [164, 74, 75, 178, 92, 245, 109, 139, 120, 370, 574, 268, 151, 141, 70, 70, 63, 63, 62, 66, 66, 63, 64, 65, 65, 63, 67, 103, 74, 63, 63, 63] + "samples": [178, 92, 245, 109, 139, 120, 370, 574, 268, 151, 141, 70, 70, 63, 63, 62, 66, 66, 63, 64, 65, 65, 63, 67, 103, 74, 63, 63, 63, 68, 71, 79] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32": { "tick_us": { diff --git a/test/scenarios/light/scenario_perf_light.json b/test/scenarios/light/scenario_perf_light.json index 30cd3289..fce72376 100644 --- a/test/scenarios/light/scenario_perf_light.json +++ b/test/scenarios/light/scenario_perf_light.json @@ -101,14 +101,14 @@ "observed": { "desktop-macos": { "tick_us": { - "p50": 2, + "p50": 1, "p95": 9, "min": 1, "max": 10, "n": 32, - "samples": [5, 2, 2, 4, 3, 9, 3, 5, 4, 7, 7, 10, 5, 5, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1] + "samples": [4, 3, 9, 3, 5, 4, 7, 7, 10, 5, 5, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32s3-n16r8": { "tick_us": { @@ -454,9 +454,9 @@ "min": 1, "max": 4, "n": 32, - "samples": [3, 1, 1, 2, 1, 3, 2, 2, 2, 4, 4, 4, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1] + "samples": [2, 1, 3, 2, 2, 2, 4, 4, 4, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32s3-n16r8": { "tick_us": { @@ -578,9 +578,9 @@ "min": 4, "max": 49, "n": 32, - "samples": [10, 4, 4, 7, 6, 10, 7, 9, 7, 14, 49, 14, 9, 10, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 4, 4, 4, 4] + "samples": [7, 6, 10, 7, 9, 7, 14, 49, 14, 9, 10, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 4, 4, 4, 4, 4, 4, 5] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32s3-n16r8": { "tick_us": { @@ -702,9 +702,9 @@ "min": 15, "max": 78, "n": 32, - "samples": [41, 18, 17, 30, 23, 61, 27, 35, 30, 52, 78, 54, 36, 35, 17, 17, 15, 15, 15, 16, 16, 15, 15, 17, 20, 16, 16, 24, 18, 15, 16, 15] + "samples": [30, 23, 61, 27, 35, 30, 52, 78, 54, 36, 35, 17, 17, 15, 15, 15, 16, 16, 15, 15, 17, 20, 16, 16, 24, 18, 15, 16, 15, 16, 18, 19] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32s3-n16r8": { "tick_us": { diff --git a/test/scenarios/light/scenario_peripheral_grid_sweep.json b/test/scenarios/light/scenario_peripheral_grid_sweep.json index efac865c..fd6d8093 100644 --- a/test/scenarios/light/scenario_peripheral_grid_sweep.json +++ b/test/scenarios/light/scenario_peripheral_grid_sweep.json @@ -178,9 +178,9 @@ "min": 4, "max": 14, "n": 32, - "samples": [10, 4, 4, 7, 6, 11, 7, 9, 8, 13, 14, 14, 9, 9, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 4, 4, 6, 5, 4, 4, 4] + "samples": [7, 6, 11, 7, 9, 8, 13, 14, 14, 9, 9, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 4, 4, 6, 5, 4, 4, 4, 4, 4, 5] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "desktop-windows": { "tick_us": { @@ -300,14 +300,14 @@ }, "desktop-macos": { "tick_us": { - "p50": 18, + "p50": 17, "p95": 84, "min": 15, "max": 88, "n": 32, - "samples": [41, 18, 18, 31, 23, 59, 27, 36, 31, 56, 88, 55, 36, 35, 17, 17, 15, 15, 15, 18, 17, 16, 16, 16, 84, 17, 16, 37, 19, 16, 16, 16] + "samples": [31, 23, 59, 27, 36, 31, 56, 88, 55, 36, 35, 17, 17, 15, 15, 15, 18, 17, 16, 16, 16, 84, 17, 16, 37, 19, 16, 16, 16, 16, 17, 20] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "desktop-windows": { "tick_us": { @@ -427,14 +427,14 @@ }, "desktop-macos": { "tick_us": { - "p50": 71, + "p50": 72, "p95": 241, "min": 62, "max": 296, "n": 32, - "samples": [165, 71, 71, 122, 92, 230, 108, 141, 123, 211, 241, 219, 147, 144, 69, 69, 63, 63, 62, 151, 65, 63, 63, 66, 296, 66, 64, 103, 74, 65, 63, 63] + "samples": [122, 92, 230, 108, 141, 123, 211, 241, 219, 147, 144, 69, 69, 63, 63, 62, 151, 65, 63, 63, 66, 296, 66, 64, 103, 74, 65, 63, 63, 69, 72, 78] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "desktop-windows": { "tick_us": { @@ -554,14 +554,14 @@ }, "desktop-macos": { "tick_us": { - "p50": 287, + "p50": 285, "p95": 938, "min": 247, "max": 1089, "n": 32, - "samples": [667, 283, 287, 482, 369, 938, 460, 580, 485, 881, 908, 1089, 581, 575, 277, 278, 251, 247, 250, 590, 264, 252, 255, 260, 872, 259, 272, 813, 298, 254, 251, 251] + "samples": [482, 369, 938, 460, 580, 485, 881, 908, 1089, 581, 575, 277, 278, 251, 247, 250, 590, 264, 252, 255, 260, 872, 259, 272, 813, 298, 254, 251, 251, 278, 285, 299] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "desktop-windows": { "tick_us": { @@ -707,9 +707,9 @@ "min": 4, "max": 24, "n": 32, - "samples": [12, 4, 4, 8, 6, 10, 7, 9, 11, 24, 14, 14, 11, 9, 4, 4, 4, 4, 4, 4, 4, 4, 5, 4, 7, 4, 4, 16, 5, 4, 4, 4] + "samples": [8, 6, 10, 7, 9, 11, 24, 14, 14, 11, 9, 4, 4, 4, 4, 4, 4, 4, 4, 5, 4, 7, 4, 4, 16, 5, 4, 4, 4, 5, 4, 4] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "desktop-windows": { "tick_us": { @@ -834,9 +834,9 @@ "min": 15, "max": 121, "n": 32, - "samples": [48, 18, 18, 30, 23, 47, 27, 36, 33, 121, 55, 56, 36, 35, 17, 17, 15, 16, 16, 17, 16, 15, 15, 16, 22, 16, 16, 61, 18, 15, 16, 15] + "samples": [30, 23, 47, 27, 36, 33, 121, 55, 56, 36, 35, 17, 17, 15, 16, 16, 17, 16, 15, 15, 16, 22, 16, 16, 61, 18, 15, 16, 15, 18, 18, 18] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "desktop-windows": { "tick_us": { @@ -956,14 +956,14 @@ }, "desktop-macos": { "tick_us": { - "p50": 71, + "p50": 70, "p95": 228, "min": 61, "max": 315, "n": 32, - "samples": [186, 71, 73, 121, 92, 173, 111, 185, 127, 315, 228, 206, 142, 142, 70, 69, 63, 61, 65, 68, 68, 62, 64, 64, 83, 64, 63, 125, 74, 62, 63, 64] + "samples": [121, 92, 173, 111, 185, 127, 315, 228, 206, 142, 142, 70, 69, 63, 61, 65, 68, 68, 62, 64, 64, 83, 64, 63, 125, 74, 62, 63, 64, 69, 72, 75] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "desktop-windows": { "tick_us": { @@ -1083,14 +1083,14 @@ }, "desktop-macos": { "tick_us": { - "p50": 308, + "p50": 296, "p95": 881, "min": 249, "max": 895, "n": 32, - "samples": [739, 286, 285, 481, 369, 640, 430, 749, 509, 863, 881, 895, 560, 564, 279, 279, 253, 249, 310, 316, 263, 254, 254, 259, 308, 260, 253, 643, 309, 254, 255, 252] + "samples": [481, 369, 640, 430, 749, 509, 863, 881, 895, 560, 564, 279, 279, 253, 249, 310, 316, 263, 254, 254, 259, 308, 260, 253, 643, 309, 254, 255, 252, 272, 285, 296] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "desktop-windows": { "tick_us": { @@ -1236,9 +1236,9 @@ "min": 4, "max": 15, "n": 32, - "samples": [10, 4, 4, 8, 6, 9, 7, 9, 8, 13, 15, 14, 9, 9, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4] + "samples": [8, 6, 9, 7, 9, 8, 13, 15, 14, 9, 9, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 5] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "desktop-windows": { "tick_us": { @@ -1363,9 +1363,9 @@ "min": 15, "max": 55, "n": 32, - "samples": [41, 18, 18, 30, 23, 35, 27, 35, 31, 53, 53, 55, 36, 35, 17, 17, 16, 15, 15, 16, 16, 16, 15, 16, 16, 16, 17, 27, 18, 16, 15, 15] + "samples": [30, 23, 35, 27, 35, 31, 53, 53, 55, 36, 35, 17, 17, 16, 15, 15, 16, 16, 16, 15, 16, 16, 16, 17, 27, 18, 16, 15, 15, 16, 18, 18] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "desktop-windows": { "tick_us": { @@ -1485,14 +1485,14 @@ }, "desktop-macos": { "tick_us": { - "p50": 71, - "p95": 294, + "p50": 70, + "p95": 232, "min": 62, "max": 588, "n": 32, - "samples": [294, 72, 71, 120, 92, 152, 107, 141, 123, 209, 232, 222, 140, 140, 69, 70, 62, 62, 62, 67, 66, 64, 63, 64, 86, 64, 67, 96, 588, 63, 64, 64] + "samples": [120, 92, 152, 107, 141, 123, 209, 232, 222, 140, 140, 69, 70, 62, 62, 62, 67, 66, 64, 63, 64, 86, 64, 67, 96, 588, 63, 64, 64, 68, 71, 74] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "desktop-windows": { "tick_us": { @@ -1612,14 +1612,14 @@ }, "desktop-macos": { "tick_us": { - "p50": 286, - "p95": 918, + "p50": 278, + "p95": 852, "min": 247, "max": 938, "n": 32, - "samples": [918, 289, 286, 436, 368, 781, 428, 570, 439, 852, 834, 938, 564, 561, 278, 274, 252, 247, 251, 277, 262, 251, 254, 252, 311, 255, 260, 384, 359, 252, 252, 251] + "samples": [436, 368, 781, 428, 570, 439, 852, 834, 938, 564, 561, 278, 274, 252, 247, 251, 277, 262, 251, 254, 252, 311, 255, 260, 384, 359, 252, 252, 251, 270, 292, 297] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "desktop-windows": { "tick_us": { @@ -1765,9 +1765,9 @@ "min": 4, "max": 14, "n": 32, - "samples": [13, 4, 4, 7, 6, 11, 7, 9, 7, 13, 13, 14, 9, 10, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 5, 4, 4, 4] + "samples": [7, 6, 11, 7, 9, 7, 13, 13, 14, 9, 10, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 5, 4, 4, 4, 4, 4, 4] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "desktop-windows": { "tick_us": { @@ -1887,14 +1887,14 @@ }, "desktop-macos": { "tick_us": { - "p50": 18, + "p50": 17, "p95": 52, "min": 15, "max": 52, "n": 32, - "samples": [52, 18, 18, 27, 23, 47, 27, 35, 28, 52, 51, 52, 35, 36, 18, 17, 16, 15, 15, 17, 16, 16, 15, 16, 17, 15, 15, 25, 21, 15, 15, 15] + "samples": [27, 23, 47, 27, 35, 28, 52, 51, 52, 35, 36, 18, 17, 16, 15, 15, 17, 16, 16, 15, 16, 17, 15, 15, 25, 21, 15, 15, 15, 16, 17, 18] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "desktop-windows": { "tick_us": { @@ -2019,9 +2019,9 @@ "min": 61, "max": 243, "n": 32, - "samples": [207, 76, 71, 110, 92, 243, 107, 140, 109, 206, 203, 208, 141, 144, 69, 68, 62, 62, 61, 64, 65, 63, 64, 63, 69, 64, 62, 117, 87, 64, 63, 63] + "samples": [110, 92, 243, 107, 140, 109, 206, 203, 208, 141, 144, 69, 68, 62, 62, 61, 64, 65, 63, 64, 63, 69, 64, 62, 117, 87, 64, 63, 63, 68, 71, 74] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "desktop-windows": { "tick_us": { @@ -2146,9 +2146,9 @@ "min": 246, "max": 919, "n": 32, - "samples": [784, 287, 285, 484, 368, 874, 429, 568, 437, 919, 811, 847, 581, 606, 279, 281, 251, 248, 246, 258, 271, 249, 255, 253, 276, 251, 253, 385, 363, 252, 251, 250] + "samples": [484, 368, 874, 429, 568, 437, 919, 811, 847, 581, 606, 279, 281, 251, 248, 246, 258, 271, 249, 255, 253, 276, 251, 253, 385, 363, 252, 251, 250, 299, 287, 289] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "desktop-windows": { "tick_us": { diff --git a/test/scenarios/light/scenario_peripheral_switch.json b/test/scenarios/light/scenario_peripheral_switch.json index 4db58d05..c8198651 100644 --- a/test/scenarios/light/scenario_peripheral_switch.json +++ b/test/scenarios/light/scenario_peripheral_switch.json @@ -173,13 +173,13 @@ "desktop-macos": { "tick_us": { "p50": 4, - "p95": 16, + "p95": 14, "min": 4, "max": 17, "n": 32, - "samples": [16, 4, 4, 8, 6, 13, 9, 9, 7, 14, 13, 17, 9, 9, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 5, 4, 4, 4] + "samples": [8, 6, 13, 9, 9, 7, 14, 13, 17, 9, 9, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 5, 4, 4, 4, 4, 4, 4] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32p4rev1-eth": { "tick_us": { @@ -298,9 +298,9 @@ "min": 4, "max": 19, "n": 32, - "samples": [14, 4, 4, 8, 6, 11, 7, 10, 7, 13, 13, 16, 9, 9, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 19, 4, 4, 4] + "samples": [8, 6, 11, 7, 10, 7, 13, 13, 16, 9, 9, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 19, 4, 4, 4, 4, 4, 4] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32p4rev1-eth": { "tick_us": { @@ -417,11 +417,11 @@ "p50": 4, "p95": 14, "min": 4, - "max": 15, + "max": 14, "n": 32, - "samples": [15, 4, 4, 8, 6, 11, 7, 9, 7, 14, 13, 14, 9, 9, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 4, 4, 4] + "samples": [8, 6, 11, 7, 9, 7, 14, 13, 14, 9, 9, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 4, 4, 4, 4, 4, 4] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32p4rev1-eth": { "tick_us": { @@ -537,11 +537,11 @@ "p50": 4, "p95": 14, "min": 4, - "max": 17, + "max": 14, "n": 32, - "samples": [17, 4, 4, 8, 6, 9, 9, 9, 7, 14, 13, 14, 9, 9, 4, 4, 4, 4, 4, 5, 4, 4, 4, 4, 4, 4, 4, 5, 5, 4, 4, 4] + "samples": [8, 6, 9, 9, 9, 7, 14, 13, 14, 9, 9, 4, 4, 4, 4, 4, 5, 4, 4, 4, 4, 4, 4, 4, 5, 5, 4, 4, 4, 4, 4, 4] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32p4rev1-eth": { "tick_us": { @@ -656,13 +656,13 @@ "desktop-macos": { "tick_us": { "p50": 4, - "p95": 15, + "p95": 13, "min": 4, - "max": 17, + "max": 15, "n": 32, - "samples": [17, 4, 4, 8, 6, 10, 10, 9, 7, 13, 13, 15, 9, 9, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 4, 4, 4] + "samples": [8, 6, 10, 10, 9, 7, 13, 13, 15, 9, 9, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 4, 4, 4, 4, 4, 4] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32p4rev1-eth": { "tick_us": { @@ -793,13 +793,13 @@ "desktop-macos": { "tick_us": { "p50": 4, - "p95": 16, + "p95": 14, "min": 4, "max": 18, "n": 32, - "samples": [16, 4, 4, 8, 6, 11, 9, 9, 7, 13, 14, 18, 9, 9, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 4, 4, 4] + "samples": [8, 6, 11, 9, 9, 7, 13, 14, 18, 9, 9, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 4, 4, 4, 4, 4, 4] }, - "last_updated": "2026-09-06" + "last_updated": "2026-09-07" }, "esp32p4rev1-eth": { "tick_us": { diff --git a/test/unit/core/unit_moonlive_compiler.cpp b/test/unit/core/unit_moonlive_compiler.cpp index 10eb3e60..d25318b4 100644 --- a/test/unit/core/unit_moonlive_compiler.cpp +++ b/test/unit/core/unit_moonlive_compiler.cpp @@ -105,6 +105,114 @@ TEST_CASE("arguments reach a function two calls deep") { CHECK(buf[6] == 44); } +// --- function arguments ------------------------------------------------------------------------ +// +// Passed BY VALUE, through a block in the arena rather than in the frame: each function opens its +// own frame and a slot is addressed off the current frame pointer (on Xtensa via the windowed ABI's +// `entry a1, N`), so a caller cannot reach the slot its callee will read. The arena is what both +// activations share. See kScriptArgBase in MoonLiveBuiltins.h. + +TEST_CASE("a function receives the value its caller passed") { + moonlive::MoonLive eng; + REQUIRE(eng.compile("class T {\n" + " void paint(int idx, int level) { setRGB(idx, level, 0, 0); }\n" + " void tick() { paint(0, 11); paint(1, 22); }\n" + "}\n", kTable, kSys)); + REQUIRE(eng.ok()); + std::vector buf(4 * 3, 0); + eng.run(buf.data(), 4, 3, 0, "tick"); + CHECK(buf[0] == 11); + CHECK(buf[3] == 22); +} + +TEST_CASE("an argument is a copy: writing the parameter leaves the caller's variable alone") { + // By VALUE is the contract, and this is what it means at the call site. A reference would make + // the second pixel 99 as well. + moonlive::MoonLive eng; + REQUIRE(eng.compile("class T {\n" + " void bump(int v) { v = 99; setRGB(0, v, 0, 0); }\n" + " void tick() { int mine = 7; bump(mine); setRGB(1, mine, 0, 0); }\n" + "}\n", kTable, kSys)); + REQUIRE(eng.ok()); + std::vector buf(4 * 3, 0); + eng.run(buf.data(), 4, 3, 0, "tick"); + CHECK(buf[0] == 99); // the callee saw its own copy + CHECK(buf[3] == 7); // the caller's variable is untouched +} + +TEST_CASE("a recursive function keeps its own arguments through the calls it makes") { + // THE case the single arena block has to survive. One block serves every depth only because a + // callee copies its arguments into its own frame before it can call anything; without that + // copy, the inner call would overwrite the outer one's arguments and the countdown would never + // terminate or would paint the wrong pixels. + moonlive::MoonLive eng; + REQUIRE(eng.compile("class T {\n" + " void down(int n) { if (n > 0) { setRGB(n, n, 0, 0); down(n - 1); } }\n" + " void tick() { down(3); }\n" + "}\n", kTable, kSys)); + REQUIRE(eng.ok()); + std::vector buf(4 * 3, 0); + eng.run(buf.data(), 4, 3, 0, "tick"); + CHECK(buf[9] == 3); // each activation kept its own n + CHECK(buf[6] == 2); + CHECK(buf[3] == 1); +} + +TEST_CASE("a nested call does not clobber the arguments of the call it sits inside") { + // `outer(inner(x))`: the inner call writes the same arena block. It has RETURNED before the + // outer arguments are written, which is what makes one block enough. + moonlive::MoonLive eng; + REQUIRE(eng.compile("class T {\n" + " int twice(int v) { return v * 2; }\n" + " void paint(int idx, int level) { setRGB(idx, level, 0, 0); }\n" + " void tick() { paint(0, twice(21)); }\n" + "}\n", kTable, kSys)); + REQUIRE(eng.ok()); + std::vector buf(4 * 3, 0); + eng.run(buf.data(), 4, 3, 0, "tick"); + CHECK(buf[0] == 42); +} + +TEST_CASE("calling a function with the wrong number of arguments is refused") { + // Both directions, because a silent mismatch would read whatever the arena block held from an + // earlier call: a wrong picture rather than an error. + moonlive::MoonLive tooFew; + CHECK_FALSE(tooFew.compile("class T {\n" + " void paint(int a, int b) { setRGB(a, b, 0, 0); }\n" + " void tick() { paint(1); }\n" + "}\n", kTable, kSys)); + moonlive::MoonLive tooMany; + CHECK_FALSE(tooMany.compile("class T {\n" + " void paint(int a) { setRGB(a, 1, 0, 0); }\n" + " void tick() { paint(1, 2); }\n" + "}\n", kTable, kSys)); +} + +// What an argument COSTS. The question a script author actually asks before rewriting a helper to +// take parameters, and the reason it is measured rather than reasoned about: the answer decides +// whether the clearer form is also the affordable one. +TEST_CASE("passing an argument costs about what writing a member costs") { + // The OLD style: a member is the channel, written by the caller and read by the helper. + moonlive::MoonLive viaMember; + REQUIRE(viaMember.compile("class T {\n" + " int idx = 0;\n" + " void paint() { setRGB(idx, 11, 0, 0); }\n" + " void tick() { idx = 0; paint(); idx = 1; paint(); }\n" + "}\n", kTable, kSys)); + // The NEW style: the same work, said directly. + moonlive::MoonLive viaArg; + REQUIRE(viaArg.compile("class T {\n" + " void paint(int idx) { setRGB(idx, 11, 0, 0); }\n" + " void tick() { paint(0); paint(1); }\n" + "}\n", kTable, kSys)); + MESSAGE("member-passing: " << viaMember.codeLen() << " bytes, " + "argument: " << viaArg.codeLen() << " bytes"); + // Both go through the arena: a member write is StoreCtrl, an argument is StoreCtrl32 into the + // argument block, and the helper reads it back either way. So the argument form must not cost + // materially more, and this pins that rather than trusting it. + CHECK(viaArg.codeLen() < viaMember.codeLen() * 3 / 2); +} + // UNBOUNDED recursion must degrade visibly and keep the device rendering. A fixed render-task // stack means the alternative is a reset, which the robustness rule forbids. A reset is what // this script produced before the depth guard: ~176 bytes of frame per activation against a 12 KB diff --git a/test/unit/light/unit_AudioLevel.cpp b/test/unit/light/unit_AudioLevel.cpp index 34a68791..fc452452 100644 --- a/test/unit/light/unit_AudioLevel.cpp +++ b/test/unit/light/unit_AudioLevel.cpp @@ -1,11 +1,9 @@ // @module AudioService -// @also AudioVolumeEffect #include "doctest.h" #include "core/AudioLevel.h" #include "core/AudioService.h" #include "core/ModuleFactory.h" -#include "light/effects/AudioVolumeEffect.h" #include "light/effects/AudioSpectrumEffect.h" #include @@ -167,20 +165,16 @@ TEST_CASE("AudioLevel: isqrt64 matches floor(sqrt) on a spread of values") { // null even with no mic (so a consumer added before the mic can't deref null). TEST_CASE("AudioService + audio effects are registered and createable (boot-loop guard)") { mm::ModuleFactory::registerType("AudioService"); - mm::ModuleFactory::registerType("AudioVolumeEffect"); mm::ModuleFactory::registerType("AudioSpectrumEffect"); auto* mic = mm::ModuleFactory::create("AudioService"); REQUIRE(mic != nullptr); CHECK(mic->role() == mm::ModuleRole::Service); - auto* vol = mm::ModuleFactory::create("AudioVolumeEffect"); auto* spec = mm::ModuleFactory::create("AudioSpectrumEffect"); - REQUIRE(vol != nullptr); REQUIRE(spec != nullptr); delete mic; - delete vol; delete spec; } diff --git a/test/unit/light/unit_ColorTrailsEffect.cpp b/test/unit/light/unit_ColorTrailsEffect.cpp new file mode 100644 index 00000000..833f6841 --- /dev/null +++ b/test/unit/light/unit_ColorTrailsEffect.cpp @@ -0,0 +1,89 @@ +// @module ColorTrailsEffect + +// The two flows this effect can carry color with, and the property that separates them. +// +// `Noise` is the separable one it is named for: a shift per row and per column, so the picture +// shears and folds. `Radial` is a current along the line through the center, computed per pixel +// from geometry with no field and no state. What distinguishes radial from every other flow here +// is DIRECTION: color must end up further from the center than it started (or nearer, running in), +// which a shear can never do on average. + +#include "doctest.h" +#include "golden_frame.h" // the effect harness: Layouts, Grid, Layer +#include "light/effects/ColorTrailsEffect.h" + +#include + +using namespace mm; + +namespace { + +/// Mean distance from the center of every lit sample, weighted by brightness. The one number that +/// tells an outward flow from an inward one: a shear moves color around, radial moves it out. +double litRadius(const Layer& layer, uint16_t w, uint16_t h) { + const auto& buf = layer.buffer(); + const double cx = w / 2.0, cy = h / 2.0; + double sum = 0.0, weight = 0.0; + for (uint16_t y = 0; y < h; y++) { + for (uint16_t x = 0; x < w; x++) { + const size_t i = (static_cast(y) * w + x) * 3u; + if (i + 2 >= buf.bytes()) continue; + const double v = buf.data()[i] + buf.data()[i + 1] + buf.data()[i + 2]; + if (v <= 0.0) continue; + const double dx = x - cx, dy = y - cy; + sum += v * std::sqrt(dx * dx + dy * dy); + weight += v; + } + } + return weight > 0.0 ? sum / weight : 0.0; +} + +/// Run the effect for `frames` and hand back how far the lit color sits from the center. +double runFlow(uint8_t flowType, uint16_t frames) { + golden::ScopedTestClock clock(1000); + Layouts layouts; GridLayout grid; Layer layer; ColorTrailsEffect effect; + grid.width = 32; grid.height = 32; grid.depth = 1; + layouts.addChild(&grid); + layer.setLayouts(&layouts); + layer.setChannelsPerLight(3); + layer.addChild(&effect); + effect.flowType = flowType; + effect.flow = 255; // the strongest current, so the drift is unambiguous + effect.mode = static_cast(ColorTrailsEffect::Mode::Orbital); + layer.applyState(); + for (uint16_t i = 0; i < frames; i++) { platform::setTestNowMs(1000 + i * 20u); layer.tick(); } + return litRadius(layer, 32, 32); +} + +} // namespace + +TEST_CASE("an outward radial flow carries color further from the center than an inward one") { + const double out = runFlow(static_cast(ColorTrailsEffect::Flow::Radial), 60); + const double in = runFlow(static_cast(ColorTrailsEffect::Flow::RadialIn), 60); + // Both draw the same emitter in the same place; only the direction of the wind differs, so the + // difference in where the color ends up IS the flow. + CHECK(out > in); +} + +TEST_CASE("every flow renders something rather than draining the picture to black") { + for (uint8_t f = 0; f <= static_cast(ColorTrailsEffect::Flow::RadialIn); f++) { + CHECK(runFlow(f, 40) > 0.0); + } +} + +TEST_CASE("the center cell has no direction to move in, and does not divide by zero") { + // The one place a radial field is undefined. Reaching it must leave the effect running rather + // than trapping: the guard is a floored radius, and this is what pins it. + golden::ScopedTestClock clock(1000); + Layouts layouts; GridLayout grid; Layer layer; ColorTrailsEffect effect; + grid.width = 1; grid.height = 1; grid.depth = 1; // the center IS the whole grid + layouts.addChild(&grid); + layer.setLayouts(&layouts); + layer.setChannelsPerLight(3); + layer.addChild(&effect); + effect.flowType = static_cast(ColorTrailsEffect::Flow::Radial); + effect.flow = 255; + layer.applyState(); + for (uint16_t i = 0; i < 20; i++) { platform::setTestNowMs(1000 + i * 20u); layer.tick(); } + CHECK(layer.buffer().bytes() > 0); // still rendering +} diff --git a/test/unit/light/unit_Drivers_livePalettes.cpp b/test/unit/light/unit_Drivers_livePalettes.cpp new file mode 100644 index 00000000..1d3c183c --- /dev/null +++ b/test/unit/light/unit_Drivers_livePalettes.cpp @@ -0,0 +1,121 @@ +// @module Drivers +// @also Palette, MoonLivePalette + +// How a DOWNLOADED palette becomes a selectable one. +// +// A scripted palette arrives as a `.mlp` file the UI writes to the device, and three separate things +// have to agree before a user can pick it: the scan has to FIND the file, the picker has to LIST it, +// and the `palette` control has to ACCEPT its index. Each of those failed independently in the +// field, and each failure looked the same from the outside ("I downloaded it and nothing happened"), +// so they are pinned separately here. + +#include "doctest.h" +#include "light/drivers/Drivers.h" +#include "light/Palette.h" +#include "light/moonlive/MoonLiveScriptFile.h" +#include "platform/platform.h" +#include "../core/conditional_controls.h" // mm::test::controlIndex + +#include +#include +#include + +using namespace mm; + +namespace { + +/// The smallest thing that stands in for a palette script. These tests never RUN it: they are about +/// DISCOVERY (which files are found and offered), and what a scripted palette paints is covered by +/// MoonLivePalette's own tests. +constexpr const char* kPaletteSrc = "void setup() {}\n"; + +/// An empty filesystem root of its own per test, so a count assertion means what it says: the +/// developer's own device directory carries whatever palettes they have been trying, and a test +/// that counted those would pass or fail by accident. fsSetRoot is provided for exactly this +/// (platform.h), and the FilesystemModule persistence tests use the same shape. +struct IsolatedFs { + char root[256]; + explicit IsolatedFs(const char* tag) { + std::snprintf(root, sizeof(root), "/tmp/mm_palettes_%s_%u", tag, + static_cast(platform::millis())); + std::filesystem::remove_all(root); + platform::fsSetRoot(root); + REQUIRE(platform::fsMount()); + } + ~IsolatedFs() { + platform::fsSetRoot(""); // back to the real root for every other test + std::filesystem::remove_all(root); + } +}; + +/// Write one `.mlp` into a script directory, creating the directory first: fsWriteAtomic does not +/// create parents, exactly as POST /api/file does not. +void writePalette(const char* dir, const char* name) { + platform::fsMkdir(dir); + char path[160]; + std::snprintf(path, sizeof(path), "%s/%s", dir, name); + REQUIRE(platform::fsWriteAtomic(path, kPaletteSrc, std::strlen(kPaletteSrc))); +} + +/// The highest index the `palette` control ACCEPTS. This is the number every one of these bugs +/// moved: the control carries its ceiling in `max`, and a value above it is refused with "value out +/// of range", which is what made a freshly downloaded palette unselectable even once it was listed. +int32_t paletteMax(Drivers& drv) { + const int i = test::controlIndex(drv, "palette"); + REQUIRE(i >= 0); + return drv.controls()[static_cast(i)].max; +} + +} // namespace + +TEST_CASE("a palette downloaded to the factory directory is offered by the picker") { + // THE FIELD BUG: the UI downloads a `.mlp` to the FACTORY directory (`/.moonlive`) so that a + // later edit can shadow it, but the scan only ever read the USER directory (`/moonlive`). The + // file was on the device and could never be listed, so the picker said "reopen the picker to + // select it" and reopening changed nothing, forever. + IsolatedFs fs("factory"); + Drivers drv; + drv.defineControls(); + const int32_t before = paletteMax(drv); + + writePalette(mm::moonlive::kFactoryScriptDir, "unit-factory.mlp"); + drv.rebuildControls(); // CLEARS then re-defines, which is what a schema change does + + CHECK(paletteMax(drv) == before + 1); +} + +TEST_CASE("editing a factory palette leaves one entry, not two") { + // Editing a factory script SAVES A SECOND FILE of the same name to the user directory, which + // then shadows the factory copy (resolveScript prefers it). Both directories are scanned, so + // without a dedupe the same palette would appear twice in the picker, and one of those two rows + // would load a file the user cannot see. + IsolatedFs fs("both"); + Drivers drv; + drv.defineControls(); + const int32_t before = paletteMax(drv); + + writePalette(mm::moonlive::kFactoryScriptDir, "unit-both.mlp"); + writePalette(mm::moonlive::kScriptDir, "unit-both.mlp"); + drv.rebuildControls(); // CLEARS then re-defines, which is what a schema change does + + CHECK(paletteMax(drv) == before + 1); // ONE entry, from two files +} + +TEST_CASE("a palette added while running becomes selectable without a reboot") { + // THE BLOCKER BEHIND THE OTHER TWO: `palette`'s ceiling is baked when the control is defined + // (the scripted count plus the built-ins), while a downloaded file is discovered by prepare(). + // So the new palette was LISTED and then REFUSED with "value out of range": the picker offered + // a row that could not be chosen, and only a reboot fixed it. prepare() therefore rebuilds the + // controls when the count moves. + IsolatedFs fs("late"); + Drivers drv; + drv.defineControls(); + const int32_t before = paletteMax(drv); + + // Arriving AFTER the control was defined is the whole point: this is a download onto a running + // device, not a file that was present at boot. + writePalette(mm::moonlive::kFactoryScriptDir, "unit-late.mlp"); + drv.prepare(); + + CHECK(paletteMax(drv) == before + 1); +} diff --git a/test/unit/light/unit_FixedPointEffect.cpp b/test/unit/light/unit_FixedPointEffect.cpp new file mode 100644 index 00000000..3e939f64 --- /dev/null +++ b/test/unit/light/unit_FixedPointEffect.cpp @@ -0,0 +1,112 @@ +// @module FixedPointEffect + +#include "doctest.h" +#include "light/effects/FixedPointEffect.h" +#include "light/layouts/GridLayout.h" +#include "light/layouts/Layouts.h" + +#include +#include +#include + +namespace { + +// A panel big enough for the shapes to have room, small enough that the sub-pixel property is what +// is being tested rather than raw resolution. +struct Panel { + mm::Layouts layouts; + mm::GridLayout grid; + mm::Layer layer; + mm::FixedPointEffect effect; + + explicit Panel(mm::lengthType size = 24) { + grid.width = size; + grid.height = size; + grid.depth = 1; + layouts.addChild(&grid); + layer.setLayouts(&layouts); + layer.setChannelsPerLight(3); + layer.addChild(&effect); + layer.applyState(); + } + + // How many lights carry any color at all: the cheapest measure of "something was drawn". + int litCount() { + auto& buf = layer.buffer(); + int n = 0; + for (size_t i = 0; i < buf.count(); i++) { + const uint8_t* p = buf.data() + i * 3; + if (p[0] || p[1] || p[2]) n++; + } + return n; + } + + // How many carry a PARTIAL value: the antialiasing, which is the whole point of the effect. + int partialCount() { + auto& buf = layer.buffer(); + int n = 0; + for (size_t i = 0; i < buf.count(); i++) { + const uint8_t* p = buf.data() + i * 3; + for (int c = 0; c < 3; c++) if (p[c] > 0 && p[c] < 255) { n++; break; } + } + return n; + } +}; + +} // namespace + +TEST_CASE("every demo draws something on a panel") { + // The audit that matters for a Select: a value that renders nothing is a dead menu entry, and + // nothing else in the suite would notice, since a black frame is a valid frame. + for (uint8_t d = 1; d < mm::FixedPointEffect::kDemoCount; d++) { + Panel p; + p.effect.demo = d; + p.effect.fade = 255; // no trail carried between frames: judge one frame alone + for (int i = 0; i < 30; i++) p.layer.tick(); + CAPTURE(std::string(mm::FixedPointEffect::kDemoNames[d])); + CHECK(p.litCount() > 0); + } +} + +// NOT TESTED HERE: that a shape moves by fractions of a pixel between frames, which is the whole +// property this effect demonstrates. Its hands run on the WALL CLOCK (fixed periods, as the +// original does), and a unit test ticks a dozen frames in well under a millisecond, so nothing +// moves and any assertion about motion would be measuring the harness rather than the effect. The +// sub-pixel behavior is pinned where it actually lives, on the primitives in unit_draw.cpp, and +// judged on the bench. + +TEST_CASE("the all setting reaches every demo, and only the demos") { + // The rotation picks a demo from the wall clock, so a test cannot tick its way into the next + // slot: 200 ticks pass in milliseconds and a dwell is seconds. Testing the SELECTION instead is + // both faster and stricter, since the arithmetic is where the bugs are: an off-by-one that + // lands on `all` itself would recurse, and one that skips the last demo would hide it forever. + using FP = mm::FixedPointEffect; + bool seen[FP::kDemoCount] = {}; + for (uint32_t slotIndex = 0; slotIndex < FP::kCycled * 3; slotIndex++) { + const uint8_t active = static_cast(slotIndex % FP::kCycled + 1); + REQUIRE(active != FP::kAll); // never selects "all" itself + REQUIRE(active < FP::kDemoCount); // never runs off the end of the list + seen[active] = true; + } + for (uint8_t d = 1; d < FP::kDemoCount; d++) { + CAPTURE(FP::kDemoNames[d]); + CHECK(seen[d]); // every demo gets its turn + } +} + +TEST_CASE("a demo switch does not join the old figure to the new one") { + // The curve demos share one point buffer. Carried across a switch, the first segment drawn + // joins a spirograph point to a lissajous point, which is a bright line straight across the + // panel: visible, wrong, and gone the moment the trail is cleared on the change. + Panel p; + p.effect.demo = mm::FixedPointEffect::kSpirograph; + p.effect.fade = 255; + for (int i = 0; i < 40; i++) p.layer.tick(); + const int spiro = p.litCount(); + + p.effect.demo = mm::FixedPointEffect::kLissajous; + p.layer.tick(); // the FIRST frame after the switch is the risky one + // One frame of a fresh trail lights very little; a carried-over trail would light roughly what + // the full spirograph did, plus the bogus joining segment. + CHECK(p.litCount() < spiro); +} diff --git a/test/unit/light/unit_MoonLiveMotion.cpp b/test/unit/light/unit_MoonLiveMotion.cpp index e8d43ef7..ee0324fc 100644 --- a/test/unit/light/unit_MoonLiveMotion.cpp +++ b/test/unit/light/unit_MoonLiveMotion.cpp @@ -147,11 +147,11 @@ TEST_CASE("setPan past the last light is ignored") { } // The two SHIPPED motion scripts, run on a real head rig. They are the reference a user reads to -// learn setPan/setTilt, so "it compiles" is not enough: aim.mle must put every head where its -// sliders say, and sweep.mle must actually move them and differ between formations. -TEST_CASE("aim.mle points every head where its sliders say") { +// learn setPan/setTilt, so "it compiles" is not enough: mh-aim.mle must put every head where its +// sliders say, and mh-sweep.mle must actually move them and differ between formations. +TEST_CASE("mh-aim.mle points every head where its sliders say") { HeadRig rig; - rig.effect.setScript(shipScript("aim.mle")); + rig.effect.setScript(shipScript("mh-aim.mle")); rig.layouts.applyState(); rig.layer.applyState(); platform::setTestNowMs(1); @@ -169,10 +169,10 @@ TEST_CASE("aim.mle points every head where its sliders say") { CHECK(rig.channel(0, rig.fc.pan) == 128); } -TEST_CASE("sweep.mle moves the rig and its formations differ") { +TEST_CASE("mh-sweep.mle moves the rig and its formations differ") { auto aimsFor = [](uint8_t formation) { HeadRig rig; - rig.effect.setScript(shipScript("sweep.mle")); + rig.effect.setScript(shipScript("mh-sweep.mle")); rig.layouts.applyState(); rig.layer.applyState(); // A scripted control is set by name, the same path the UI takes. diff --git a/test/unit/light/unit_MoonLiveScriptResolve.cpp b/test/unit/light/unit_MoonLiveScriptResolve.cpp index 7c2aaf91..ef833807 100644 --- a/test/unit/light/unit_MoonLiveScriptResolve.cpp +++ b/test/unit/light/unit_MoonLiveScriptResolve.cpp @@ -155,3 +155,98 @@ TEST_CASE("the compiler and the change-detector read the same file") { REQUIRE(moonlive::scriptFileHash(name, hash)); CHECK(hash == moonlive::scriptHash(factory.c_str(), factory.size())); } + +// The fourth question: is a user copy HIDING a shipped one? From outside the two cases are +// identical, and a stale user copy has twice been chased as a compiler bug (a control that never +// appeared; then an old-syntax copy failing at offsets that matched nothing in the file just +// written). The binding puts the answer in its status, and this is the predicate it asks. +TEST_CASE("a user copy is reported as a shadow only when a shipped copy is under it") { + const char* name = "unit-shadow.mle"; + drop(moonlive::kScriptDir, name); + drop(moonlive::kFactoryScriptDir, name); + + CHECK_FALSE(moonlive::scriptShadowsFactory(name)); // neither + + put(moonlive::kFactoryScriptDir, name, "class A { void tick() {} }\n"); + CHECK_FALSE(moonlive::scriptShadowsFactory(name)); // shipped only: no shadow + + put(moonlive::kScriptDir, name, "class A { void tick() {} }\n"); + CHECK(moonlive::scriptShadowsFactory(name)); // both: the user's hides it + + drop(moonlive::kFactoryScriptDir, name); + CHECK_FALSE(moonlive::scriptShadowsFactory(name)); // user's own script: not a shadow + drop(moonlive::kScriptDir, name); +} + +// The fifth question, and the one the shadow marker alone cannot answer: has the SHIPPED copy moved +// on since the user forked it? Without lineage an edit and a stale leftover look identical forever, +// which is what let 29 pre-`void tick()` copies sit on a bench board failing every compile. +TEST_CASE("a fork knows whether the shipped script has changed under it") { + const char* name = "unit-lineage.mle"; + const char* shipped = "class A { void tick() {} }\n"; + drop(moonlive::kScriptDir, name); + drop(moonlive::kFactoryScriptDir, name); + + put(moonlive::kFactoryScriptDir, name, shipped); + put(moonlive::kScriptDir, name, "class A { void tick() { fill(1, 2, 3); } }\n"); + + // No lineage recorded (an older fork): "cannot say", never "unchanged". Claiming an update on a + // guess would send someone to discard work for nothing. + CHECK_FALSE(moonlive::scriptFactoryMovedOn(name)); + + REQUIRE(moonlive::noteScriptLineage(name, moonlive::scriptHash(shipped, std::strlen(shipped)))); + CHECK_FALSE(moonlive::scriptFactoryMovedOn(name)); // forked from exactly this text + + put(moonlive::kFactoryScriptDir, name, "class A { void tick() { fill(9, 9, 9); } }\n"); + CHECK(moonlive::scriptFactoryMovedOn(name)); // the library moved under the fork + + char side[128]; + moonlive::scriptLineagePath(name, side, sizeof(side)); + platform::fsRemove(side); + drop(moonlive::kScriptDir, name); + drop(moonlive::kFactoryScriptDir, name); +} + +// Lineage is bookkeeping the DEVICE does, on the same hook that reacts to any write or delete, so +// every writer gets it: the editor, a restored backup, a script pushed by a tool. +TEST_CASE("forking a shipped script records what it was forked from, and reverting forgets it") { + const char* name = "unit-fork.mle"; + const char* shipped = "class A { void tick() {} }\n"; + char userPath[96], side[128]; + std::snprintf(userPath, sizeof(userPath), "%s/%s", moonlive::kScriptDir, name); + moonlive::scriptLineagePath(name, side, sizeof(side)); + drop(moonlive::kScriptDir, name); + drop(moonlive::kFactoryScriptDir, name); + platform::fsRemove(side); + + // A write with nothing shipped under it is a user's OWN script, not a fork: no lineage. + put(moonlive::kScriptDir, name, "class A { void tick() {} }\n"); + moonlive::noteForkedFrom(userPath); + uint32_t from = 0; + CHECK_FALSE(moonlive::scriptLineage(name, from)); + + // Now the same name ships too, and the next write IS a fork. + put(moonlive::kFactoryScriptDir, name, shipped); + put(moonlive::kScriptDir, name, "class A { void tick() { fill(1, 2, 3); } }\n"); + moonlive::noteForkedFrom(userPath); + REQUIRE(moonlive::scriptLineage(name, from)); + CHECK(from == moonlive::scriptHash(shipped, std::strlen(shipped))); + + // EDITING the fork again must not move the branch point. Re-stamping here would mark the fork + // up to date with a library version the user never saw, erasing the one fact the record exists + // to carry. + put(moonlive::kFactoryScriptDir, name, "class A { void tick() { fill(9, 9, 9); } }\n"); + put(moonlive::kScriptDir, name, "class A { void tick() { fill(4, 5, 6); } }\n"); + moonlive::noteForkedFrom(userPath); + REQUIRE(moonlive::scriptLineage(name, from)); + CHECK(from == moonlive::scriptHash(shipped, std::strlen(shipped))); // still the ORIGINAL + CHECK(moonlive::scriptFactoryMovedOn(name)); // and the library moved + + // Reverting removes the fork; the hook fires again and the lineage goes with it, so a later + // fork of this name is not compared against a hash from one that no longer exists. + platform::fsRemove(userPath); + moonlive::noteForkedFrom(userPath); + CHECK_FALSE(moonlive::scriptLineage(name, from)); + + drop(moonlive::kFactoryScriptDir, name); +} diff --git a/test/unit/light/unit_MoonLiveScripts.cpp b/test/unit/light/unit_MoonLiveScripts.cpp index 867f36ee..6f10c5a3 100644 --- a/test/unit/light/unit_MoonLiveScripts.cpp +++ b/test/unit/light/unit_MoonLiveScripts.cpp @@ -451,8 +451,15 @@ TEST_CASE("every compile error fits the status line whole, its position included } INFO("longest diagnostic is " << longest << " chars"); CHECK(longest >= 40); // a control: a parse that found nothing would pass silently - // " @" + up to 5 digits + the terminator, against the buffer MoonLiveScript declares. - CHECK(longest + 8 <= mm::moonlive::MoonLiveScript::kMaxStatus); + // The shadow marker and its ": " in front, then " @" + up to 5 digits + the terminator, against + // the buffer MoonLiveScript declares. The marker is in the budget because it prefixes the + // longest message on the day a stale user copy fails, which is exactly when the offset matters. + // The LONGER of the two marks: the stale one prefixes exactly when a stale user copy fails, + // which is the case the offset matters most in. + const size_t shadow = std::strlen(mm::moonlive::MoonLiveScript::kShadowMark); + const size_t stale = std::strlen(mm::moonlive::MoonLiveScript::kStaleMark); + const size_t mark = (stale > shadow ? stale : shadow) + 2; + CHECK(longest + mark + 8 <= mm::moonlive::MoonLiveScript::kMaxStatus); (void)longestText; } diff --git a/test/unit/light/unit_MovingHeadEffect.cpp b/test/unit/light/unit_MovingHeadEffect.cpp index 962b2661..cf62e022 100644 --- a/test/unit/light/unit_MovingHeadEffect.cpp +++ b/test/unit/light/unit_MovingHeadEffect.cpp @@ -142,3 +142,91 @@ TEST_CASE("a 1 x N fixture chain still varies head by head") { CHECK(pans.size() > 1); } + +// --- the beam wheels --------------------------------------------------------------------------- +// +// A head's gobo and rotate channels were reachable by the PRESET model (FixtureChannels carries all +// five motion roles, Drivers assigns their slots and Correction reads them back) but by no EFFECT: +// EffectBase exposed setPan/setTilt/setZoom and nothing else, so the two wheels were plumbed end to +// end with nobody able to write them. Ported from MoonLight's MovingHeads effects, which drive both. + +namespace { + +// A head with the beam wheels as well as aim: RGBW + pan + tilt + rotate + gobo, in the packing +// order FixtureChannels::forEachMotionSlot defines (pan, tilt, zoom, rotate, gobo), with zoom +// absent, which is what makes this a good test: the slots must close up around the missing role. +constexpr uint8_t kBeamChannels = mm::FixtureChannels::kMotionBase + 4; + +mm::FixtureChannels beamRig() { + mm::FixtureChannels fc; + fc.pan = mm::FixtureChannels::kMotionBase + 0; + fc.tilt = mm::FixtureChannels::kMotionBase + 1; + fc.rotate = mm::FixtureChannels::kMotionBase + 2; + fc.gobo = mm::FixtureChannels::kMotionBase + 3; + return fc; +} + +} // namespace + +TEST_CASE("a head's gobo and rotate carry the values the effect asks for") { + mm::Layouts layouts; + mm::GridLayout grid; + grid.width = 3; + grid.height = 1; + grid.depth = 1; + layouts.addChild(&grid); + + mm::Layer layer; + layer.setLayouts(&layouts); + layer.setChannelsPerLight(kBeamChannels); + layer.setFixtureChannels(beamRig()); + + mm::MovingHeadEffect heads; + heads.gobo = 96; + heads.rotate = 200; + layer.addChild(&heads); + layer.applyState(); + + for (int i = 0; i < 3; i++) layer.tick(); + + auto& buf = layer.buffer(); + REQUIRE(buf.count() == 3); + for (size_t i = 0; i < buf.count(); i++) { + const uint8_t* light = buf.data() + i * kBeamChannels; + CHECK(light[mm::FixtureChannels::kMotionBase + 3] == 96); // gobo + CHECK(light[mm::FixtureChannels::kMotionBase + 2] == 200); // rotate + } +} + +// The orthogonality the whole role model rests on: the same effect on a fixture WITHOUT the wheels +// writes no beam bytes rather than scribbling on whatever channel happens to sit there. A rig of +// plain pan/tilt heads has its own meaning for the bytes past tilt, and a stray gobo write would +// land on one of them. +TEST_CASE("a head with no gobo channel is not written past its own channels") { + mm::Layouts layouts; + mm::GridLayout grid; + grid.width = 2; + grid.height = 1; + grid.depth = 1; + layouts.addChild(&grid); + + mm::Layer layer; + layer.setLayouts(&layouts); + layer.setChannelsPerLight(kBeamChannels); // room for four motion bytes + layer.setFixtureChannels(motionRig()); // but the fixture declares only pan + tilt + + mm::MovingHeadEffect heads; + heads.gobo = 96; + heads.rotate = 200; + layer.addChild(&heads); + layer.applyState(); + + for (int i = 0; i < 3; i++) layer.tick(); + + auto& buf = layer.buffer(); + for (size_t i = 0; i < buf.count(); i++) { + const uint8_t* light = buf.data() + i * kBeamChannels; + CHECK(light[mm::FixtureChannels::kMotionBase + 2] == 0); + CHECK(light[mm::FixtureChannels::kMotionBase + 3] == 0); + } +} diff --git a/test/unit/light/unit_Rings241Layout.cpp b/test/unit/light/unit_Rings241Layout.cpp index 09d40c91..f96aaed5 100644 --- a/test/unit/light/unit_Rings241Layout.cpp +++ b/test/unit/light/unit_Rings241Layout.cpp @@ -97,3 +97,38 @@ TEST_CASE("outside in puts light 0 on the outer ring and the center LED last, ri CHECK(o == kTotal); CHECK(b[kTotal - 1] == a[0]); // the center LED is the last light when wired outside in } + +// `angleFirst` says where light 0 of each ring sits, in degrees from the bottom. A disc is soldered +// with its first LED wherever the builder started, so without it the image is fixed against the +// hardware. The default of 0 must reproduce MoonLight's placement exactly, since that is what every +// other test here pins. +TEST_CASE("angleFirst moves the first light around the ring, and 0 leaves the disc where it was") { + mm::Rings241Layout plain; + const auto at0 = coordsOf(plain); + + mm::Rings241Layout alsoZero; + alsoZero.angleFirst = 0; + CHECK(coordsOf(alsoZero) == at0); // the default is not merely near MoonLight's, it IS it + + // A quarter turn moves every ring's first light. The disc is symmetric, so the SET of + // coordinates barely changes; what moves is which index sits where, which is the point. + mm::Rings241Layout turned; + turned.angleFirst = 90; + const auto at90 = coordsOf(turned); + REQUIRE(at90.size() == at0.size()); + CHECK_FALSE(at90 == at0); + + // The center LED has no angle, so it cannot move however far the disc is turned. + CHECK(at90[0] == at0[0]); + + // 359 is one degree short of a full turn, so the disc is nearly back where it started: the + // control stops at 359 because 360 IS 0 (the ring closes) and offering both invites the + // question of which one it is. + mm::Rings241Layout almost; + almost.angleFirst = 359; + const auto at359 = coordsOf(almost); + for (size_t i = 0; i < at0.size(); i++) { + CHECK(std::abs(int(at359[i].x) - int(at0[i].x)) <= 1); + CHECK(std::abs(int(at359[i].y) - int(at0[i].y)) <= 1); + } +} diff --git a/test/unit/light/unit_draw.cpp b/test/unit/light/unit_draw.cpp index f107c273..5e84305a 100644 --- a/test/unit/light/unit_draw.cpp +++ b/test/unit/light/unit_draw.cpp @@ -761,3 +761,90 @@ TEST_CASE("scrolling along y moves every column, and along z every cell of the v CHECK(vol.data()[((size_t(1) * 2 + y) * 2 + x) * 3] == 1); } } + +// --- ring and strokeLine ----------------------------------------------------------------------- +// +// The two shapes a fixed-point canvas needs beyond a disc: an outline and a thick line. Ported for +// Sutaburosu's fixed-point demos, which draw clock hands, orbits and spokes from them. + +TEST_CASE("a ring is hollow: lit on its band, dark at its center") { + Buffer buf; + Coord3D dims{11, 11, 1}; + REQUIRE(buf.allocate(121, 3)); + const draw::Canvas cv = draw::Canvas::of(buf, 11, 11, 1); + draw::ring(cv, draw::toSub(5), draw::toSub(5), draw::toSub(3), draw::toSub(1), + RGB{255, 255, 255}); + + // The hole is what separates a ring from a disc, and the property a caller relies on when + // stacking rings: the middle must stay dark however thick the stroke. + CHECK(isBlack(at(buf, dims, 5, 5, 0))); + CHECK(at(buf, dims, 5, 2, 0).r > 0); // on the band, three up from center + CHECK(isBlack(at(buf, dims, 0, 0, 0))); // outside it entirely +} + +TEST_CASE("a ring's inner edge is antialiased, not cut") { + Buffer buf; + Coord3D dims{21, 21, 1}; + REQUIRE(buf.allocate(441, 3)); + const draw::Canvas cv = draw::Canvas::of(buf, 21, 21, 1); + draw::ring(cv, draw::toSub(10), draw::toSub(10), draw::toSub(6), draw::toSub(2), + RGB{255, 255, 255}); + + // Walking in from the band toward the center must pass through a PARTIAL pixel. Two discs + // subtracted would step straight from full to black here, which is the bug this shape exists to + // avoid: the inner edge of a subtracted ring is never blended, only removed. + bool sawPartial = false; + for (int y = 10; y >= 0; y--) { + const uint8_t v = at(buf, dims, 10, static_cast(y), 0).r; + if (v > 0 && v < 255) sawPartial = true; + } + CHECK(sawPartial); +} + +TEST_CASE("a thick line covers pixels a one-pixel line would miss") { + Buffer thin, thick; + Coord3D dims{15, 15, 1}; + REQUIRE(thin.allocate(225, 3)); + REQUIRE(thick.allocate(225, 3)); + const draw::Canvas cvThin = draw::Canvas::of(thin, 15, 15, 1); + const draw::Canvas cvThick = draw::Canvas::of(thick, 15, 15, 1); + + draw::line(cvThin, {2, 7, 0}, {12, 7, 0}, RGB{255, 255, 255}); + draw::strokeLine(cvThick, draw::toSub(2), draw::toSub(7), draw::toSub(12), draw::toSub(7), + draw::toSub(3), RGB{255, 255, 255}); + + // Width is the whole point: a row either side of the axis is dark for the thin line and lit for + // the thick one. + CHECK(isBlack(at(thin, dims, 7, 5, 0))); + CHECK(at(thick, dims, 7, 6, 0).r > 0); + CHECK(at(thick, dims, 7, 8, 0).r > 0); +} + +TEST_CASE("a thick line stops at its endpoints instead of running along the infinite line") { + Buffer buf; + Coord3D dims{15, 15, 1}; + REQUIRE(buf.allocate(225, 3)); + const draw::Canvas cv = draw::Canvas::of(buf, 15, 15, 1); + // A short horizontal stroke in the middle of the grid. + draw::strokeLine(cv, draw::toSub(6), draw::toSub(7), draw::toSub(8), draw::toSub(7), + draw::toSub(2), RGB{255, 255, 255}); + + CHECK(at(buf, dims, 7, 7, 0).r > 0); // on the segment + // Well past both ends must be dark. Without clamping the projection to the segment, every pixel + // in the row would be "on the line" and the stroke would span the whole grid. + CHECK(isBlack(at(buf, dims, 0, 7, 0))); + CHECK(isBlack(at(buf, dims, 14, 7, 0))); +} + +TEST_CASE("a zero-length thick line draws a dot rather than nothing") { + Buffer buf; + Coord3D dims{9, 9, 1}; + REQUIRE(buf.allocate(81, 3)); + const draw::Canvas cv = draw::Canvas::of(buf, 9, 9, 1); + // What a fully retracted clock hand asks for. Dividing by the length would be a divide by zero, + // so this case is handled rather than guarded against. + draw::strokeLine(cv, draw::toSub(4), draw::toSub(4), draw::toSub(4), draw::toSub(4), + draw::toSub(3), RGB{255, 255, 255}); + + CHECK(at(buf, dims, 4, 4, 0).r > 0); +} From 52e03cbe55651a0ecdf247df576a9182092b6b13 Mon Sep 17 00:00:00 2001 From: ewowi Date: Mon, 7 Sep 2026 23:18:30 +0200 Subject: [PATCH 2/3] The app installs MoonBase, and every image says which one it is MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit MoonBase is the recovery image that installs the app, and until now nothing installed MoonBase: a device whose recovery image was broken needed a cable. The app can now write it over the network, both images report their version so a drifted pair is visible at a glance, and the Firmware card describes and installs either image through one selector. Performance: desktop 1909 KB, ESP32 image 2,056,928 bytes, tick 170us (was 172). 1890 unit tests (+11 cases), 27 scenarios, 0 failures. Flash: esp32 +33 KB, esp32s3-n16r8 +15 KB for 1513 lines of new firmware code. **Core** - The app installs a new MoonBase into the factory partition, the mirror of MoonBase installing the app. esp_ota_* refuses a factory target, so this is a raw erase-and-write and esp_image_verify replaces the validation esp_ota_end used to give. A 4 MB board has nowhere to stage 743 KB, so the image streams straight in: everything that can reject it is therefore decided from the FIRST CHUNK, before a byte is erased. - Neither image may be installed as the other. A MoonBase image written into the app slot leaves both partitions holding MoonBase, and every route out then resolves to the partition being executed (0x1501) while the device still answers and serves a page: reachable, and recoverable only with a cable. Both images now refuse it, since either can be the one writing the app slot. - `core/FirmwareImage.h` parses an ESP32 image header without ESP-IDF, so the rules that guard an erase run in a host test. Shared with MoonBase, whose CMakeLists opens the include path for this one header rather than keeping a second hand-written copy of the format. - Every image carries its version already, in the app descriptor IDF emits. build_esp32 sets PROJECT_VER for both, so the app reads the factory partition's version without booting it and marks a mismatch. - MoonLive: `else if` chains, `for` with `<=`, and 40 IR labels (was 16, which bounded a script to eight loops). A parameter name is now checked the way a local is, so it cannot shadow a builtin or repeat another parameter. **Light domain** - StadBeest eyes and legs, two .mle effects for the art installation. - MovingHead: the gobo slot clamps instead of wrapping past 255, and goboOnBeat reads audio even with audioReactive off, where it previously did nothing. **UI** - One Firmware card for two images: an `image` control chooses which partition the four rows describe and the three install paths target, rendered as a tab strip. The install picker is shared with the web installer again, with URL and file rows on its own extras seam. - Every install shows progress: the device reports byte counts in its status for the paths it drives, and a browser-pushed upload drives the same overlay. - The file editor keeps editing the fork it just created, instead of comparing against the shipped file forever. **Scripts/MoonDeck** - `serve_firmware.py` serves a built image over HTTP/1.1. `python -m http.server` speaks 1.0, whose unframed body makes esp_https_ota crawl and then fail; that cost two OTA attempts before the response line was read. - check_nonblocking fails closed when an incremental run measures nothing, which it silently reported as zero findings. **Docs** - architecture gains the update mechanism; getting-started gains a MoonBase section for users, and MoonBase's help link points there rather than at the architecture page. - `soundReactive` is `audioReactive` in the effects catalog, six places. **Reviews** - πŸ‡ pan/tilt clamping in .mle scripts: skipped, byteArg already clamps 0..255. - πŸ‡ FixedPoint fade through the Layer: reverted and backlogged. The swap is right but the two calls mean different things (per-frame amount vs per- reference-frame rate), and it made the effect 3.1x brighter at high framerate against a 1.35x band. It needs its default re-tuned and the trail looked at. - πŸ‡ the remaining six findings fixed: docs Tests link, soundReactive naming, parameter name checks, gobo overflow, goboOnBeat audio, save() destination. - πŸ‘Ύ dead code removed (moonbaseAssetUrl, bytesRead_, two CSS classes, a do-nothing wrapper); stale comments corrected, including two that documented the URL install as synchronous when it is async. Co-Authored-By: Claude Opus 5 (1M context) --- README.md | 4 +- docs/architecture.md | 22 + docs/backlog/backlog-light.md | 17 + docs/coding-standards.md | 2 +- docs/gettingstarted.md | 33 ++ docs/metrics/repo-health.json | 70 +-- docs/metrics/repo-health.md | 62 +-- docs/moonmodules/light/effects.md | 12 +- moonbase/main/CMakeLists.txt | 7 +- moonbase/main/moonbase_main.cpp | 94 +++- moondeck/build/build_esp32.py | 29 +- moondeck/check/check_nonblocking.py | 18 +- moondeck/run/serve_firmware.py | 94 ++++ moonlive/effects/stadbeest-eyes.mle | 62 +++ moonlive/effects/stadbeest-legs.mle | 67 +++ src/core/FirmwareImage.h | 96 ++++ src/core/FirmwareUpdateModule.h | 178 ++++-- src/core/HttpServerModule.cpp | 125 ++++- src/core/HttpServerModule.h | 9 + src/core/moonlive/MoonLiveCompiler.cpp | 72 ++- src/core/moonlive/MoonLiveIr.h | 9 +- src/light/effects/FixedPointEffect.h | 8 + src/light/effects/MovingHeadEffect.h | 9 +- src/light/moonlive/script_catalog.h | 10 +- src/platform/desktop/platform_desktop.cpp | 40 ++ src/platform/esp32/platform_esp32_ota.cpp | 395 ++++++++++++- src/platform/platform.h | 31 +- src/ui/app.js | 522 ++++++++++++++---- src/ui/install-picker.js | 54 +- src/ui/style.css | 32 +- test/CMakeLists.txt | 1 + .../light/scenario_Effects_composition.json | 2 +- .../scenario_MoonLiveEffect_livescript.json | 48 +- test/unit/core/unit_FirmwareImage.cpp | 158 ++++++ test/unit/core/unit_MoonBaseContract.cpp | 80 +++ test/unit/core/unit_PartitionTables.cpp | 25 + test/unit/core/unit_moonlive_compiler.cpp | 74 +++ 37 files changed, 2289 insertions(+), 282 deletions(-) create mode 100644 moondeck/run/serve_firmware.py create mode 100644 moonlive/effects/stadbeest-eyes.mle create mode 100644 moonlive/effects/stadbeest-legs.mle create mode 100644 src/core/FirmwareImage.h create mode 100644 test/unit/core/unit_FirmwareImage.cpp diff --git a/README.md b/README.md index 5d92e9e3..8219df95 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ If you like projectMM, give it a ⭐️, fork it, or open an issue or pull reque 🎨 **Plug in, open a browser, see lights**: a live 3D preview of every effect, modifier, and layout, controllable from the same tab. The interface renders any module from its declared controls, so adding a module needs zero UI code. -πŸŒ— **MoonBase, the second boot image (4 MB boards)**: instead of spending half a small flash on a second firmware copy, a ~750 KB maintenance image sits in the factory slot and installs updates into one large app slot, one click in the UI covers the whole reboot-install-reboot cycle, and a power cut mid-update lands back in MoonBase, never in a half-written app. See [architecture.md Β§ MoonBase](docs/architecture.md#moonbase-the-second-boot-image-4-mb-boards). +πŸŒ— **MoonBase, the second boot image**: instead of spending half the flash on a second firmware copy, a ~750 KB maintenance image sits in the factory slot and installs updates into one large app slot, one click in the UI covers the whole reboot-install-reboot cycle, and a power cut mid-update lands back in MoonBase, never in a half-written app. Forced on a 4 MB board, which has room for one application and not two, and chosen on the larger ones, where the freed slot goes to the filesystem instead. See [architecture.md Β§ MoonBase](docs/architecture.md#moonbase-the-second-boot-image). ⚑ **Flash from your browser in seconds**: the web installer picks your device, flashes the matching firmware, and hands WiFi credentials to the device over USB via Improv. No serial monitor, no recompile. @@ -179,7 +179,7 @@ Specific people whose work directly shaped parts of projectMM. We study their th - **The [Improv Wi-Fi](https://github.com/improv-wifi) project**: the open Improv serial provisioning standard ([sdk-cpp](https://github.com/improv-wifi/sdk-cpp) / [sdk-js](https://github.com/improv-wifi/sdk-js)) that the projectMM web installer uses to provision a freshly-flashed device over USB. - **[FastLED](https://github.com/FastLED/FastLED)**: the canonical LED-effects library whose conventions the LED-effect world shares. projectMM links no part of FastLED, but it carries forward FastLED's recognisable *names and models* for the color/animation primitives (`scale8`, `sin8`, the gradient-palette model (`CRGBPalette16` / `colorFromPalette`), the `beatsin8` / `inoise8` / `qadd8` family), so a contributor recognises them on sight. The implementations are projectMM's own, integer-only and hot-path-tuned for our render loop; FastLED is the prior art behind the convention, credited here and in each primitive's notes. - **[FPP](https://github.com/FalconChristmas/fpp) (Falcon Player)**: the show player that drives LED panel receiver cards from a Raspberry Pi. Seeing an FPP rig feed a wall of HUB75 panels is what prompted [PanelCardDriver](docs/moonmodules/light/drivers.md#panelcard): if a Linux host can send those frames, so can a board that is already rendering them, which removes the host from the installation entirely. FPP is the inspiration, and the reference point for what good looks like here: it sustains 50 fps. -- **[Tasmota](https://github.com/arendst/Tasmota) and Mathieu Carbou's [MycilaSafeBoot](https://github.com/mathieucarbou/MycilaSafeBoot)**: the safeboot pattern behind [MoonBase](docs/architecture.md#moonbase-the-second-boot-image-4-mb-boards): replacing a small board's second OTA slot with a minimal boot image that installs into one large app slot. Tasmota proved the scheme at scale; MycilaSafeBoot distilled it to a standalone image and set the size bar. MoonBase is our from-scratch minimal take, written directly against ESP-IDF. +- **[Tasmota](https://github.com/arendst/Tasmota) and Mathieu Carbou's [MycilaSafeBoot](https://github.com/mathieucarbou/MycilaSafeBoot)**: the safeboot pattern behind [MoonBase](docs/architecture.md#moonbase-the-second-boot-image): replacing a small board's second OTA slot with a minimal boot image that installs into one large app slot. Tasmota proved the scheme at scale; MycilaSafeBoot distilled it to a standalone image and set the size bar. MoonBase is our from-scratch minimal take, written directly against ESP-IDF. - **Damian Schneider ([dedehai](https://github.com/DedeHai))**: author of the WLED Particle System, whose emitters, forces and walls over one shared pool are the shape our [particle kernel](docs/moonmodules/light/power-functions.md#particles) and the scripted `pool` / `emit` / `step` builtins follow, in our own fixed-point implementation. - **wladi ([myhome-control](https://shop.myhome-control.de))**: designer of the [MHC-WLED ESP32-P4 shield](https://shop.myhome-control.de/en/ABC-WLED-ESP32-P4-shield/HW10027), and the source of the hardware and the pinout details that got its **line-in audio** working in [AudioService](docs/moonmodules/core/moxygen/AudioService.md): the onboard PCM1808 I2S ADC (WS 26 / SD 33 / SCK 32 / MCLK 36), the PCM1808's stereo wiring, and its `FMT` format-select jumper (open = I2S/Philips, our default; tie to 3V3 for left-justified), which is what confirmed the standard-I2S path the ADC needs. diff --git a/docs/architecture.md b/docs/architecture.md index c7301e27..3d16a23a 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -291,6 +291,28 @@ network, a stronger power-fail story than dual-OTA's. A failed install deliberat MoonBase, visibly, rather than silently reverting to the old app; the way back is its explicit "Boot the app" action, which only boots an image that validates. +**Updating MoonBase itself** runs the same cycle backwards: the app writes the factory slot while +running from `ota_0`, exactly as MoonBase writes the app slot while running from factory. Neither +image can rewrite the partition it executes from, so each installs the other and the app is the +only thing that can repair a broken recovery image. Without it a bad MoonBase means a cable, which +is the failure MoonBase exists to prevent. + +Two things make that safe enough to offer. `esp_ota_*` refuses a factory partition, so this is a +raw `esp_partition_erase_range` + `esp_partition_write`, which also forfeits the validation +`esp_ota_end` performs: `esp_image_verify` replaces it after the write. And because a 4 MB board +has nowhere to stage 743 KB before erasing, the image streams straight in, so everything that can +reject it is decided from its FIRST CHUNK, before a byte is erased: the image magic, the chip id +(one MoonBase per chip, one paste apart, and a checksum does not catch a swap), and the descriptor +naming `projectMM-moonbase` rather than the app. Those rules live in `src/core/FirmwareImage.h` so +a host test can drive them. What remains is a window, during the write, in which the device holds +no recovery image; the app keeps running throughout, so the answer to a failure is to retry. + +Each image reports its version from the app descriptor IDF puts in every binary, `PROJECT_VER` +being set to the same computed version for both, so the app can read the factory partition's +version without booting it and say when the two were built apart. A device that cannot name its +own recovery image cannot be diagnosed: two boards that looked identical, one of which could not +install firmware, took a bisect of the git log to tell apart. + MoonBase is a standalone ESP-IDF project (`moonbase/`, ~750 KB against an 896 KB slot) sharing no sources with the app, the deliberate trade for an image that must stay small and, once working, hardly change. `moondeck/build/build_esp32.py` builds it alongside every variant that opts in diff --git a/docs/backlog/backlog-light.md b/docs/backlog/backlog-light.md index d7ba0ce0..1da07234 100644 --- a/docs/backlog/backlog-light.md +++ b/docs/backlog/backlog-light.md @@ -827,6 +827,23 @@ The LED-driver increments **shipped**: increment 1 (RMT/WS2812B single-strand on (The shared lane-driver scaffolding extraction β€” when a 3rd parallel backend lands β€” is tracked separately under [Β§ Extract shared lane-driver scaffolding](#extract-shared-lane-driver-scaffolding-when-the-3rd-parallel-backend-lands-deferred) above.) +## FixedPoint fades outside the Layer's aggregation (2026-09-07) + +`FixedPointEffect` calls `draw::fade` directly where every other fading effect calls +`layer()->fadeToBlackBy`, so it skips what the Layer adds: the per-frame aggregation (N effects on +one layer cost one buffer pass, gentlest rate wins), the framerate scaling, the sub-unit carry, and +the buffer-generation bump. Invisible until a second effect shares the layer. + +The swap is one line and was tried: it makes the effect **3.1x brighter at high framerate than at +low**, against the 1.35x band `unit_Effects_framerate` enforces. The two calls mean different +things. `draw::fade(cv, n)` applies n every frame; `fadeToBlackBy(n)` is a RATE per reference frame +that Layer scales by elapsed time. The `fade` control (default 70, range 0..255) was tuned against +the first meaning, so moving it needs the default re-tuned and the trail looked at on a device, not +a silent swap. + +Worth doing, as its own change: it is the last effect outside the shared fade path, and while it +stays outside, "every fade goes through the Layer" is not true. + ## Downloading a scripted palette can repoint the active one (2026-09-06) Found while testing the palette-download fixes. A `.mlp` that sorts BEFORE an already-installed one diff --git a/docs/coding-standards.md b/docs/coding-standards.md index 0950d313..1e5aa9bb 100644 --- a/docs/coding-standards.md +++ b/docs/coding-standards.md @@ -208,7 +208,7 @@ Two corollaries. **Reference a module generically** in prose outside its own hom - `light/{effects,modifiers,layouts,drivers,supporting}.md` β€” the light-catalog + light-supporting pages (a type may later split by library into `effects_wled.md` / `effects_moonmodules.md`, still flat). - `core/{services,supporting,ui}.md` β€” the core-services (user-facing modules), core-supporting, and web-UI summary pages. - **The Links column** is assembled by the hook in a fixed order (**πŸ§ͺ Tests Β· πŸ“„ Technical Β· attribution Β· βŒ„ details**), each with a Material icon (`:material-…:`, rendered as inline SVG by `pymdownx.emoji`, the same mechanism as the tag emoji in the Name column) so a link's *type* is scannable. A card carries these lines: a `[Tests](tests/unit-tests.md#)` line (omitted when the module has no unit test, so a missing Tests link truthfully means "untested"), a **`Detail: [technical](../moxygen/.md)`** line pointing at the generated technical page, and an `Origin:` attribution line. `check_specs` matches each block to its `.h` via that `moxygen/.md` link, so keep the link's target on it. + **The Links column** is assembled by the hook in a fixed order (**πŸ§ͺ Tests Β· πŸ“„ Technical Β· attribution Β· βŒ„ details**), each with a Material icon (`:material-…:`, rendered as inline SVG by `pymdownx.emoji`, the same mechanism as the tag emoji in the Name column) so a link's *type* is scannable. A card carries these lines: a `[Tests](../../tests/unit-tests.md#)` line (omitted when the module has no unit test, so a missing Tests link truthfully means "untested"), a **`Detail: [technical](../moxygen/.md)`** line pointing at the generated technical page, and an `Origin:` attribution line. `check_specs` matches each block to its `.h` via that `moxygen/.md` link, so keep the link's target on it. Cross-file design rationale that no single `.h` owns (module interactions, buffer-lifecycle coupling) is a prose section beneath a summary page's table β€” a `## β€” details` section the hook links from the row as `βŒ„ details`. That's the only home for it, so a module needs no page of its own. diff --git a/docs/gettingstarted.md b/docs/gettingstarted.md index 8b77a6c4..bf6f436b 100644 --- a/docs/gettingstarted.md +++ b/docs/gettingstarted.md @@ -304,6 +304,39 @@ keep going. --- +### If your device shows MoonBase + +**MoonBase** is a small recovery image built into your device. If a firmware update +is interrupted, or an installed firmware does not start, your device boots MoonBase +instead of going dark, and its page offers you three ways out: + +- **Boot the app** puts you straight back if the firmware is still fine. Try this + first: it changes nothing on the device. +- **From a file** installs a firmware you have already downloaded. Get the + `firmware-...bin` matching your device from the + [releases page](https://github.com/MoonModules/projectMM/releases). +- **From a URL** downloads and installs in one step. The releases page gives you a + link to each file; paste it here and your device fetches it directly. + +Installing takes a few minutes, and the page reports its progress as it downloads. +Your device reboots into the new firmware on its own when it finishes. + +Two things worth knowing. A failed install **stays** in MoonBase rather than +pretending to have worked, so you can simply try again. And you cannot break a +device this way: MoonBase is never overwritten by an update, so it is still there +for the next attempt, including after a power cut in the middle of one. + +If your device is not on your network at all, MoonBase opens its own WiFi access +point and is reachable at **4.3.2.1** once you join it. + +MoonBase shows its own version on its page, and your device's Firmware card shows +which MoonBase it carries. If that version is marked outdated, the same card has an +**MoonBase** upload button that installs a newer one, so a device never needs a +cable to get a working recovery image. Your device checks the file first and refuses +anything that is not a MoonBase image for that board. + +--- + ### Where to go next - **Understand the pipeline** β€” how layouts, layers, effects, modifiers and diff --git a/docs/metrics/repo-health.json b/docs/metrics/repo-health.json index a0ddf6af..01991959 100644 --- a/docs/metrics/repo-health.json +++ b/docs/metrics/repo-health.json @@ -1,33 +1,35 @@ { - "commit": "2f6fb80e", + "commit": "73e52cb9", "flash": { - "esp32s3-n16r8": 2084720, - "desktop": 1891304, - "esp32": 2023776, + "esp32s3-n16r8": 2100032, + "desktop": 1909016, + "esp32": 2056928, "esp32p4rev1-eth": 1979232, "esp32p4rev1-eth-wifi": 2019392, - "esp32s3-n8r8": 1971008, + "esp32s3-n8r8": 2087168, "esp32s31": 2348592, "esp32-16mb": 1809472, "esp32-eth": 1397456, "esp32-wrover": 1843760, "qemu": 1383648, "esp32p4rev3-eth": 1643760, - "esp32s3-zero": 1788624, + "esp32s3-zero": 2024192, "esp32-pico": 2071584 }, "measured": { "esp32p4rev1-eth": "2026-09-07", "esp32s31": "2026-09-06", - "esp32": "2026-09-06", + "esp32": "2026-09-07", "esp32-pico": "2026-09-06", "esp32s3-n16r8": "2026-09-07", - "desktop": "2026-09-07" + "desktop": "2026-09-07", + "esp32s3-n8r8": "2026-09-07", + "esp32s3-zero": "2026-09-07" }, "perf": { "desktop": { - "tick_us": 172, - "fps": 5813, + "tick_us": 629, + "fps": 1589, "scenario_p50": { "Layer_base_pipeline": { "p50": 71, @@ -407,8 +409,8 @@ "MoonLiveEffect_livescript": { "desktop-macos": { "p50": 6, - "p95": 18, - "n": 32, + "p95": 7, + "n": 15, "last": "2026-09-07" }, "esp32s3-n16r8": { @@ -693,54 +695,54 @@ } }, "loc": { - "core": 25626, - "light": 35607, - "platform": 18036, - "ui": 10213, - "test": 57065, - "moondeck": 22570 + "core": 26019, + "light": 35626, + "platform": 18478, + "ui": 10581, + "test": 57402, + "moondeck": 22701 }, "comments": { "core": { - "lines": 10297, - "ratio": 0.434 + "lines": 10436, + "ratio": 0.433 }, "light": { - "lines": 13517, + "lines": 13529, "ratio": 0.417 }, "platform": { - "lines": 6336, - "ratio": 0.385 + "lines": 6478, + "ratio": 0.384 }, "ui": { - "lines": 3024, + "lines": 3135, "ratio": 0.313 }, "test": { - "lines": 10687, - "ratio": 0.214 + "lines": 10769, + "ratio": 0.215 }, "moondeck": { - "lines": 3673, + "lines": 3690, "ratio": 0.186 } }, "tests": { - "cases": 1979, + "cases": 1990, "scenarios": 27 }, "docs": { - "md_files": 220, - "md_lines": 36733, - "plans_files": 116, - "backlog_lines": 6777, + "md_files": 219, + "md_lines": 34892, + "plans_files": 115, + "backlog_lines": 6794, "lessons_lines": 705, "claude_md_lines": 259 }, "complexity": { - "functions": 3473, - "over_threshold": 245, + "functions": 3497, + "over_threshold": 249, "worst_ccn": 108 } } diff --git a/docs/metrics/repo-health.md b/docs/metrics/repo-health.md index 8ef38cc2..992743d3 100644 --- a/docs/metrics/repo-health.md +++ b/docs/metrics/repo-health.md @@ -1,6 +1,6 @@ # Repo health -Measured at `2f6fb80e`. Generated by [`moondeck/check/repo_health.py`](../../moondeck/check/repo_health.py) on every KPI-gate run. **Do not edit by hand.** +Measured at `73e52cb9`. 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/metrics/repo-health.md`). Nothing here fails a build: the numbers make growth visible, the judgment stays human. @@ -8,18 +8,18 @@ Current state only; the trend is this file's git history (`git log -p docs/metri | Target | Flash | Capacity | Used | Built | |---|---:|---:|---:|:--:| -| desktop | 1,847 KB (+35 KB) ⚠ | - | - | yes | -| esp32 | 1,976 KB | 2,496 KB | 79% | carried 1d | +| desktop | 1,864 KB (+17 KB) ⚠ | - | - | yes | +| esp32 | 2,009 KB (+32 KB) ⚠ | 2,496 KB | 80% | yes | | esp32-16mb | 1,767 KB | - | - | carried (age?) | | esp32-eth | 1,365 KB | - | - | carried (age?) | | esp32-pico | 2,023 KB | 3,072 KB | 66% | carried 1d | | esp32-wrover | 1,801 KB | - | - | carried (age?) | -| esp32p4rev1-eth | 1,933 KB (+23 KB) ⚠ | 4,096 KB | 47% | yes | +| esp32p4rev1-eth | 1,933 KB | 4,096 KB | 47% | yes | | esp32p4rev1-eth-wifi | 1,972 KB | - | - | carried (age?) | | esp32p4rev3-eth | 1,605 KB | - | - | carried (age?) | -| esp32s3-n16r8 | 2,036 KB (+19 KB) ⚠ | 4,096 KB | 50% | yes | -| esp32s3-n8r8 | 1,925 KB | - | - | carried (age?) | -| esp32s3-zero | 1,747 KB | - | - | carried (age?) | +| esp32s3-n16r8 | 2,051 KB (+15 KB) ⚠ | 4,096 KB | 50% | yes | +| esp32s3-n8r8 | 2,038 KB (+113 KB) ⚠ | 3,072 KB | 66% | yes | +| esp32s3-zero | 1,977 KB (+230 KB) ⚠ | 2,496 KB | 79% | yes | | esp32s31 | 2,294 KB | 4,096 KB | 56% | carried 1d | | qemu | 1,351 KB | - | - | carried (age?) | @@ -29,7 +29,7 @@ Current state only; the trend is this file's git history (`git log -p docs/metri | Target | Tick | FPS | |---|---:|---:| -| desktop | 172 Β΅s (+35 Β΅s) ⚠ | 5,813 (βˆ’1,486) ⚠ | +| desktop | 629 Β΅s (+457 Β΅s) ⚠ | 1,589 (βˆ’4,224) ⚠ | | esp32 | 8,354 Β΅s | 119 | ### Scenario tick by target (p50 of each sample window) @@ -37,31 +37,31 @@ Current state only; the trend is this file's git history (`git log -p docs/metri | Scenario | desktop-macos | desktop-windows | esp32 | esp32s3-n16r8 | esp32p4rev1-eth | esp32s31 | esp32-eth | esp32-eth-wifi | unknown | |---|---|---|---|---|---|---|---|---|---| | Audio_mutation | 26 | 40 ? | 13,152 | 47 ? | - | - | - | - | - | -| Aurora_fps | 1,518 (+4) ⚠ | - | - | - | - | - | - | - | - | -| Driver_mutation | 20 (βˆ’1) βœ“ | 42 ? | 12,812 | 39 ? | - | - | - | - | - | -| Effects_composition | 148 (βˆ’21) βœ“ | 549 ? | - | - | - | - | - | - | - | -| Fields_polar_lut | 1,239 (+5) ⚠ | - | - | - | - | - | - | - | - | -| Fluid_solver | 222 (+2) ⚠ | - | - | - | - | - | - | - | - | +| Aurora_fps | 1,518 | - | - | - | - | - | - | - | - | +| Driver_mutation | 20 | 42 ? | 12,812 | 39 ? | - | - | - | - | - | +| Effects_composition | 148 | 549 ? | - | - | - | - | - | - | - | +| Fields_polar_lut | 1,239 | - | - | - | - | - | - | - | - | +| Fluid_solver | 222 | - | - | - | - | - | - | - | - | | GridBlacks_blackpixel | 2 | 8 ? | 269 ? | 267 ? | - | - | - | - | - | | GridLayout_resize | 127 | 219 ? | 1,352 ? | 1,011 ? | 1,143 ? | - | 95,771 ? | 82,231 ? | - | | Layer_base_pipeline | 71 | 118 ? | - | - | - | - | - | - | - | | Layer_memory_1to1 | 5 | 1 ? | - | - | - | - | - | - | - | -| Layouts_mutation | 97 (+1) ⚠ | 111 ? | 13,692 | 45 ? | - | - | 27 ? | - | - | +| Layouts_mutation | 97 | 111 ? | 13,692 | 45 ? | - | - | 27 ? | - | - | | MoonLiveEffect_controls | 11 ? | - | 12,901 | 4,624 ? | - | - | - | - | - | | MoonLiveEffect_livescript | 6 | - | 13,433 ? | 8,255 ? | 11,336 ? | - | - | - | - | | MoonLive_pipeline | 6 | 1 ? | 9,604 ? | 3,278 ? | - | 11,398 ? | - | - | 4,393 ? | -| MoonModule_control_change | 143 (βˆ’1) βœ“ | 262 ? | 212 ? | 166 ? | 165 ? | - | 111,731 ? | 89,895 ? | - | +| MoonModule_control_change | 143 | 262 ? | 212 ? | 166 ? | 165 ? | - | 111,731 ? | 89,895 ? | - | | MqttModule_haDiscovery_toggle | 3 ? | - | 36 ? | 36 ? | - | - | - | - | - | | MultiplyModifier_memory_lut | 3 | 3 ? | - | - | - | - | - | - | - | | MultiplyModifier_pipeline | 126 | 225 ? | - | - | - | - | - | - | - | | NetworkModule_eth_reconfigure | - | - | 1,169 ? | 97,843 ? | - | - | - | - | - | | NetworkModule_mdns_toggle | 13 ? | - | 36 ? | 36 ? | 21 ? | - | 109,767 ? | 93,963 ? | - | -| Trails_ladder | 360 (+5) ⚠ | - | - | - | - | - | - | - | - | -| modifier_chain | 44 (βˆ’3) βœ“ | 69 ? | 13,337 | - | - | - | - | - | - | +| Trails_ladder | 360 | - | - | - | - | - | - | - | - | +| modifier_chain | 44 | 69 ? | 13,337 | - | - | - | - | - | - | | modifier_swap | 24 | 41 ? | 12,250 | 354 ? | 362 ? | - | 1,010 ? | - | - | | perf_full | 279 | 592 ? | 10,392 | 16,915 ? | 17,433 ? | - | - | - | - | | perf_light | 17 | 35 ? | 2,183 | 2,485 ? | 2,038 ? | - | - | - | - | -| peripheral_grid_sweep | 296 (βˆ’12) βœ“ | 649 ? | 6,991 ? | - | 11,495 ? | 12,273 ? | - | - | - | +| peripheral_grid_sweep | 296 | 649 ? | 6,991 ? | - | 11,495 ? | 12,273 ? | - | - | - | | peripheral_switch | 4 | 9 ? | 437 | 46 ? | 217 ? | - | - | - | - | Microseconds. `?` marks a cell backed by fewer than 4 samples, which is a first impression rather than a percentile; several are months old and were captured during a network reconfigure, so they read as whole milliseconds. `-` means that target has never run that scenario. @@ -81,36 +81,36 @@ These build a bare pipeline with no optional modules, so a change here is a chan | Area | Lines | Comments | Comment share | |---|---:|---:|---:| -| core | 25,626 (+110) ⚠ | 10,297 | 43.4 % | -| light | 35,607 (+992) ⚠ | 13,517 | 41.7 % (βˆ’0.2 %) βœ“ | -| platform | 18,036 | 6,336 | 38.5 % | -| ui | 10,213 (+9) ⚠ | 3,024 | 31.3 % (+0.1 %) ⚠ | -| test | 57,065 (+704) ⚠ | 10,687 | 21.4 % | -| moondeck | 22,570 | 3,673 | 18.6 % | +| core | 26,019 (+393) ⚠ | 10,436 | 43.3 % (βˆ’0.1 %) βœ“ | +| light | 35,626 (+19) ⚠ | 13,529 | 41.7 % | +| platform | 18,478 (+442) ⚠ | 6,478 | 38.4 % (βˆ’0.1 %) βœ“ | +| ui | 10,581 (+368) ⚠ | 3,135 | 31.3 % | +| test | 57,402 (+337) ⚠ | 10,769 | 21.5 % (+0.1 %) ⚠ | +| moondeck | 22,701 (+131) ⚠ | 3,690 | 18.6 % | ## Tests | Kind | Count | |---|---:| -| unit cases | 1,979 (+24) βœ“ | +| unit cases | 1,990 (+11) βœ“ | | scenarios | 27 | ## Complexity | Metric | Value | |---|---:| -| functions | 3,473 (+32) βœ“ | -| over threshold | 245 (+6) ⚠ | +| functions | 3,497 (+24) βœ“ | +| over threshold | 249 (+4) ⚠ | | worst CCN | 108 | ## Documentation | Metric | Value | |---|---:| -| markdown files | 220 (+1) ⚠ | -| markdown lines | 36,733 (+371) ⚠ | -| plan files | 116 (+1) ⚠ | -| backlog lines | 6,777 (+30) ⚠ | +| markdown files | 219 (βˆ’1) βœ“ | +| markdown lines | 34,892 (βˆ’1,841) βœ“ | +| plan files | 115 (βˆ’1) βœ“ | +| backlog lines | 6,794 (+17) ⚠ | | lessons lines | 705 | | CLAUDE.md lines | 259 | diff --git a/docs/moonmodules/light/effects.md b/docs/moonmodules/light/effects.md index a87411d9..4f87e4fa 100644 --- a/docs/moonmodules/light/effects.md +++ b/docs/moonmodules/light/effects.md @@ -315,7 +315,7 @@ An aquarium on a light wall: fish of three shapes swim across a dark tank, each - `school`: how many tiny schooling fish (0-8). - `speed`: swim rate in body-lengths, so motion reads the same on any grid; each fish varies around it, and the smaller shapes drift slower, which reads as depth. - `spriteSize`: integer magnification (crisp nearest-neighbor); 0 = auto, scaling with the grid so a fish reads as a fish on a 16x16 matrix and on a 768-wide desktop grid alike. -- `soundReactive`: move to the music: each sprite follows its own frequency band, so the scene breathes rather than surging as one block, and silence stands it still. Without an audio source the sprites keep moving normally. +- `audioReactive`: move to the music: each sprite follows its own frequency band, so the scene breathes rather than surging as one block, and silence stands it still. Without an audio source the sprites keep moving normally. Uses the global palette: every fish takes a body color from it, with its band a paler version of that same color rather than a second pick, which would read as two fish fused together. @@ -333,7 +333,7 @@ The classic screensaver on a light wall: chrome toasters with flapping wings and - `toast`: how many slices trail along (0–8). - `speed`: drift rate in sprite-widths, so flight reads the same on any grid; each flier varies Β±25% around it. - `spriteSize`: integer magnification for toasters AND toast (crisp nearest-neighbor); 0 = auto, scaling with the grid so a toaster reads as a toaster on a big wall. -- `soundReactive`: move to the music: each sprite follows its own frequency band, so the scene breathes rather than surging as one block, and silence stands it still. Without an audio source the sprites keep moving normally. +- `audioReactive`: move to the music: each sprite follows its own frequency band, so the scene breathes rather than surging as one block, and silence stands it still. Without an audio source the sprites keep moving normally. The sprites carry their own colors (chrome, wing, crust), so the global palette does not apply. Needs a grid at least the toaster's size (12Γ—9). @@ -439,7 +439,7 @@ In this first iteration the characters travel independently and do not notice ea - `ghosts`: how many ghosts (0-8); the arcade cast is four. - `speed`: travel rate in sprite-widths, so motion reads the same on any grid; Pacman runs slightly ahead of the ghosts, as in the original. - `spriteSize`: integer magnification (crisp nearest-neighbor); 0 = auto, scaling with the grid so the characters read on a 16x16 matrix and on a 768-wide desktop grid alike. -- `soundReactive`: move to the music: each sprite follows its own frequency band, so the scene breathes rather than surging as one block, and silence stands it still. Without an audio source the sprites keep moving normally. +- `audioReactive`: move to the music: each sprite follows its own frequency band, so the scene breathes rather than surging as one block, and silence stands it still. Without an audio source the sprites keep moving normally. Pacman is always his own yellow; the ghosts take their body colors from the active palette, so they stay four distinguishable characters whatever palette is loaded. @@ -459,7 +459,7 @@ On a panel narrower than the formation the ranks scroll through the court instea - `stepX`: how far a step moves the formation sideways, in pixels. - `dropY`: how far a wall turn drops it, in pixels. - `size`: integer magnification per art pixel; 1 on a matrix, 2 or more on a wall. -- `soundReactive`: the beat becomes the clock: the formation steps on transients and stands still in silence, so the march locks to the track. +- `audioReactive`: the beat becomes the clock: the formation steps on transients and stands still in silence, so the march locks to the track. The invaders take their body color from the active palette. Origin: projectMM original; inspired by Taito's Space Invaders (1978), the pixel art drawn fresh for this effect @@ -478,7 +478,7 @@ Physics run on elapsed time, not per frame, so the plume looks the same on a 60 - `rate`: sprites launched per beat of the emit clock. - `emitBpm`: launches per minute, so the plume's density is a choice rather than a side effect of how fast the device runs. - `size`: integer magnification per art pixel. -- `soundReactive`: one sprite per frequency band, thrown when that band is loud, so the cast maps onto the spectrum in order: the bass bands throw fish, the treble bands throw invaders. Silence throws nothing. +- `audioReactive`: one sprite per frequency band, thrown when that band is loud, so the cast maps onto the spectrum in order: the bass bands throw fish, the treble bands throw invaders. Silence throws nothing. Colors come from the active palette, one entry per sprite, held for its whole flight. Origin: projectMM original @@ -497,7 +497,7 @@ The court is fixed point rather than pixels, so the game plays identically on a - `reflex`: how sharply a paddle chases the ball. Below full speed it lags a fast ball, which is where the misses come from. - `size`: integer magnification, when the ball is a sprite. - `spriteBall`: swap the classic square for a member of the shared sprite cast, re-picked on every hit, so a paddle knocks one character away and another back. -- `soundReactive`: the ball advances only on the beat, so it crosses the court in time with the track and stands still in silence. +- `audioReactive`: the ball advances only on the beat, so it crosses the court in time with the track and stands still in silence. Uses the global palette. Origin: projectMM original; inspired by Atari's Pong (1972) diff --git a/moonbase/main/CMakeLists.txt b/moonbase/main/CMakeLists.txt index 4939f6f0..4640e6e9 100644 --- a/moonbase/main/CMakeLists.txt +++ b/moonbase/main/CMakeLists.txt @@ -1,6 +1,11 @@ idf_component_register( SRCS "moonbase_main.cpp" - INCLUDE_DIRS "" + # The app's src/ is NOT on the include path: MoonBase shares no sources with the application, + # which is the trade for an image that stays small and rarely changes. core/FirmwareImage.h is + # the one exception, and earns it: a header-only parser of the ESP32 image format that depends + # on nothing but . Both images must refuse to install the other, and that rule living + # in two hand-written copies is how they drift. + INCLUDE_DIRS "../../src" # The app's own logo, embedded IDF-natively; served as /logo.png (header + favicon). EMBED_FILES "../../src/ui/moonlight-logo.png" # esp_https_ota brings esp_http_client and esp-tls with it, so neither is listed separately. diff --git a/moonbase/main/moonbase_main.cpp b/moonbase/main/moonbase_main.cpp index 2e8f5f5f..879d7184 100644 --- a/moonbase/main/moonbase_main.cpp +++ b/moonbase/main/moonbase_main.cpp @@ -23,6 +23,8 @@ #include "esp_event.h" #include "esp_http_client.h" #include "esp_crt_bundle.h" +#include "core/FirmwareImage.h" // identify(): the one shared header, see main/CMakeLists.txt +#include "esp_app_desc.h" // esp_app_get_description: this image's own version #include "esp_https_ota.h" #include "esp_littlefs.h" #include "esp_netif.h" @@ -365,8 +367,12 @@ const char kPage[] = "

    MoonBase

    " // The (?) module cards carry, pointing at the published MoonBase doc. "?
    " - "

    Install firmware to return this device to normal operation.

    " + "href='https://moonmodules.org/projectMM/gettingstarted.html#if-your-device-shows-moonbase'>?" + "

    Install firmware to return this device to normal operation." + // WHICH MoonBase this is. Filled by the boot script below rather than baked into this + // literal: PROJECT_VER is defined only for IDF's own descriptor TU, and the descriptor is + // already in the image, so reading it back costs nothing and cannot drift from it. + "

    " "
    From a file
    " "" // The last resort when no URL is at hand: name where the firmware--v*.bin files @@ -381,14 +387,34 @@ const char kPage[] = // Shown only while an install is running (S() toggles it): the one moment cancel applies. "
    " "
    " + // A real bar, not a sweep: an install is a minute of a user watching a number they cannot + // read as a fraction. Hidden until a byte count actually arrives. + "" "