From 32f35c70cffaab7e3bc84063065e06de43141d4f Mon Sep 17 00:00:00 2001 From: 0x1d Date: Sat, 11 Oct 2025 21:18:21 +0200 Subject: [PATCH] feat: node canvas grid --- MULTI_NODE_UPDATE.md | 234 ++++++++++++++ README.md | 3 + assets/ledlab.png | Bin 0 -> 228707 bytes public/index.html | 120 ++++--- public/scripts/ledlab-app.js | 48 +-- public/scripts/node-canvas-grid.js | 486 +++++++++++++++++++++++++++++ public/scripts/node-discovery.js | 178 ----------- public/scripts/preset-controls.js | 148 +++++++-- public/styles/main.css | 356 ++++++++++++++++++++- server/index.js | 283 +++++++++++------ server/udp-discovery.js | 9 - 11 files changed, 1444 insertions(+), 421 deletions(-) create mode 100644 MULTI_NODE_UPDATE.md create mode 100644 assets/ledlab.png create mode 100644 public/scripts/node-canvas-grid.js delete mode 100644 public/scripts/node-discovery.js diff --git a/MULTI_NODE_UPDATE.md b/MULTI_NODE_UPDATE.md new file mode 100644 index 0000000..8045364 --- /dev/null +++ b/MULTI_NODE_UPDATE.md @@ -0,0 +1,234 @@ +# Multi-Node Canvas Grid Update + +## Overview + +The SPORE LEDLab interface has been redesigned to display all SPORE nodes simultaneously with individual canvases in a responsive grid layout. Each node can be controlled independently with its own preset and parameters. + +## Key Changes + +### 1. UI Layout Redesign + +**Before:** +- Single canvas display in center +- Node list in right sidebar +- Controls always visible in right sidebar + +**After:** +- Full-width grid layout displaying all nodes +- Each node has its own canvas card +- Floating control panel appears when a node is selected +- Maximizes screen space for displaying multiple nodes + +### 2. New Components + +#### `NodeCanvasGrid` Component +- **Location:** `/public/scripts/node-canvas-grid.js` +- **Purpose:** Manages the grid of node canvases +- **Features:** + - Displays all discovered SPORE nodes in a responsive grid + - Each node card shows: + - Node IP address + - Connection status (connected/streaming) + - Live canvas with streaming visualization + - Click on any node to select it and show controls + - Supports both individual node selection and broadcast mode + - Real-time frame rendering for each node + +#### Updated `PresetControls` Component +- **Location:** `/public/scripts/preset-controls.js` +- **Changes:** + - Now works with floating control panel + - Tracks parameters per node (using Map) + - Restores node-specific settings when switching between nodes + - Sends node-specific commands to server + +### 3. CSS Styling + +#### New Classes +- `.matrix-grid-section` - Full-width container for node grid +- `.node-canvas-grid` - CSS grid layout for node cards +- `.node-canvas-item` - Individual node card styling + - Hover effects + - Selected state (green border glow) + - Streaming animation +- `.floating-controls` - Floating control panel + - Appears when node is selected + - Slides in from right (desktop) or bottom (mobile) + - Closes when clicking X or deselecting node + +#### Responsive Design +- Desktop: 3-4 columns based on screen width +- Tablet: 2-3 columns +- Mobile: 1-2 columns with controls sliding from bottom + +### 4. Server-Side Multi-Node Streaming + +#### Updated `LEDLabServer` Class +- **Location:** `/server/index.js` +- **New Features:** + - `nodeStreams` Map: Tracks active streams per node + - `nodeConfigurations` Map: Stores per-node settings + - Simultaneous streaming to multiple nodes + - Per-node preset instances and parameters + +#### Key Methods Updated +- `startPreset(presetName, width, height, nodeIp, parameters)` + - Now accepts nodeIp to target specific node + - Supports initial parameter values + +- `stopStreaming(nodeIp)` + - Stops streaming for specific node or all nodes + +- `updatePresetParameter(parameter, value, nodeIp)` + - Updates parameters for specific node or broadcast to all + +- `streamFrameForNode(nodeIp)` + - Generates and sends frames for specific node + - Multiple intervals running simultaneously + +### 5. HTML Structure + +#### Stream View (Main View) +```html +
+
+ +
+
+ + +``` + +### 6. User Workflow + +1. **Node Discovery** + - Nodes automatically discovered via UDP + - Each node appears as a card in the grid + +2. **Node Selection** + - Click any node card to select it + - Floating control panel appears + - Node card highlights with green border + +3. **Configure Node** + - Select preset from dropdown + - Adjust parameters with sliders + - Changes apply only to selected node + +4. **Start Streaming** + - Click "Start Streaming" button + - Node card shows "streaming" status + - Canvas displays live animation + +5. **Multi-Node Operation** + - Select different node + - Configure with different preset/parameters + - Start streaming independently + - Multiple nodes can stream simultaneously + +6. **Broadcast Mode** + - Click "Broadcast to All" button + - Control panel shows "Broadcast to All" + - Preset and parameters apply to all nodes + +## Technical Details + +### Per-Node State Management + +#### Client-Side (PresetControls) +```javascript +this.nodeParameters = new Map(); // nodeIp -> {presetName, parameters} +``` +- Stores preset selection and parameters for each node +- Restores settings when switching between nodes +- Maintains independent state per node + +#### Server-Side (LEDLabServer) +```javascript +this.nodeStreams = new Map(); // nodeIp -> {preset, presetName, interval, matrixSize} +this.nodeConfigurations = new Map(); // nodeIp -> {presetName, parameters, matrixSize} +``` +- Active streams run independently with separate intervals +- Configurations saved per node +- Multiple presets can run simultaneously + +### WebSocket Messages + +#### Enhanced Messages +All streaming-related messages now include optional `nodeIp` field: +```javascript +{ + type: 'startPreset', + presetName: 'lava-lamp', + width: 16, + height: 16, + nodeIp: '192.168.1.100', // or null for broadcast + parameters: {speed: 1.5, scale: 2.0} +} +``` + +### Frame Rendering + +Each node has its own canvas with: +- Independent rendering context +- Automatic sizing based on container +- Serpentine pixel order support +- Glow effects for bright pixels +- Smooth animations + +## Benefits + +1. **Visual Overview** - See all nodes at once +2. **Independent Control** - Each node can run different animations +3. **Space Efficient** - Responsive grid maximizes screen usage +4. **Scalable** - Works with 1-20+ nodes +5. **Intuitive** - Click to select, visual feedback +6. **Flexible** - Individual or broadcast mode + +## Backwards Compatibility + +- Old single-stream API still supported +- Settings view unchanged +- Existing presets work without modification +- UDP discovery unchanged + +## File Changes Summary + +### New Files +- `/public/scripts/node-canvas-grid.js` - New component + +### Modified Files +- `/public/index.html` - Updated layout +- `/public/styles/main.css` - New grid and floating control styles +- `/public/scripts/preset-controls.js` - Per-node parameter tracking +- `/public/scripts/ledlab-app.js` - Initialize new component +- `/server/index.js` - Multi-node streaming support + +### Unchanged Files +- All preset files (`/presets/*.js`) +- `/server/udp-discovery.js` +- `/public/scripts/framework.js` +- `/public/scripts/theme-manager.js` +- `/public/scripts/navigation.js` + +## Testing Recommendations + +1. Test with single node +2. Test with multiple nodes (2-4) +3. Test node selection and switching +4. Test broadcast mode +5. Test parameter independence +6. Test starting/stopping individual streams +7. Test responsive layout on different screen sizes +8. Test node disconnection/reconnection + +## Future Enhancements + +- Drag to reorder nodes +- Group nodes for collective control +- Save/load multi-node scenes +- Node status graphs +- Performance metrics per node + diff --git a/README.md b/README.md index 4a189d9..56199b2 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,9 @@ # SPORE LEDLab LEDLab is a tool for streaming animations to SPORE nodes that implement the PixelStreamController. +SPORE LEDLab is a powerful tool for streaming animations to LED matrices connected to SPORE nodes. Create stunning visual effects with real-time parameter control and multi-node streaming capabilities. + +![ledlab](assets/ledlab.png) ## Components diff --git a/assets/ledlab.png b/assets/ledlab.png new file mode 100644 index 0000000000000000000000000000000000000000..ecd592f1e122c948ba5b49ad2dbe6b3b42664d29 GIT binary patch literal 228707 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�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
    M(2&>yuE>00 z%AEJu1vt>NbIJ9xX3Qq8?A<%`)?9G{GOlNlo3#_zqqAnWd=BG;=NoME!aMMD=A&bl z(wF3iv8No}?k&V_1fpH~F0U2O?=U5(F~AbUQBXYxh?Lp8&_A=HRv3&NJmvGFYuI)8 ztm5~KX8!u4P^48Mr&*1IiasvuOszC-`S0-X6*EuXEq&cebDY=)f8kYMKZeqi4nrX@ z^)}@f`&b^m=esd>SaW*DXgb@k+V*DQZPBA1q==HOGs4DPwbr2zQx>?Njq6E>TOXR8 z{w!zHk{=;MU$_Wx^uUXS?}`s!E<^NuHz$uMVit`rs#ko%%lBPPEx&B7=50YGmFdgt zmj`0Ui5Ou+au8(c)@Du|N-wRImB>*S`qncP)P>L2qIl?)K{h;gwWi7EG(pP;5Iua3 zbG*&+T(+&dI}c2sk6XLm_j3GDS{imGb$C15dvJXC=bB59Wzvd$)20+&VBj}}3YM9^ zdy|nt+gfJQFZbPjJl%IkxJOjF5`yl(s|T93`ucs%ZzPa$!uM0o)VKkb7hk!j+j2X8 zY>0qA3Q@(;=yI501|^Q2kIHSRSv-B+#ri{j`g4z#)H||Y@@^CvHQ0@Lc{og$U1W5g z=Nd~@0VfL$pNd-}l6(1|i8>grUikyR;cH8lD)hAd{gYZqR02YE1JNG1qkCRfQ}80I zvf}pa=3SZw?perF=JRu~D-uoO;IR($i-*d`0xz`Pq7TTj`Ih_3$1bmwr)w9TEj6&gd%9a1KwISb*>X|I4*6mc3G zZA{EoG{L^Ck zOvltPHWg`sQWA5>HY0reobw0cGS9ZIRZ0PF{ zLXag{G3m}p8vF<5@|Zr?B_g?;M-Cyo3G|~k1;#B?TUMCEkr9r4g?#VuOInSsSBzNw zfqY}($7(Ekn_|BUxkY_i>dP?JzdUZ(VxJK#T3~p4GQtNCYDGw|mSl`TJA8O+ zu~qEXBLmlL@Tz~Fzx#IBxy_&m0)8Q>2I|Uj+V|@xAQP*Js-k~@IVV>tW_~Z=rSMki z?_d}T>fy`sU5nrM>P{6=Idz*E2}O#vq}Jbq^ATzi+xpq^0b z;y~biNlB?`U9!l$Y1m- z=x7is6aU5$xjoY)iYclrCkK-ed7uF%eM(45K=?rB^6BkPf+YE;TD!|TWVrYA_R)v6|^dK|dRJ9lc_yxeLQcJZTLj(3$t8>Ri#0XjFPO+3*u+iz|b{5NSr@@0LrY9)M<#5z?_ImkXOgiJLzq)Rk&4jw`ztsZ8Nd1NYZW6Mo-6GvAoq zYBKd2_tdRsK0wHLjkDro%77q*FqsKx`?3WZJhm9kD!|DZYZY7r^_YxAF$>zeRd%)5 zeqhN@ps0g>CPT;@o>^@bo7%iljQBz8?L>DH+K_WPD{9~Y-D%vvVsz&X3^%BCX`FDc zcgqGHSztY@$(~beQL9-}CI(*|G#syHm@;|a0%w!9oCyZBZJ-e2Oy};z;8OPw<>kEW zu)IL8hMucJ;T-z?AL+jbwH`GnweGR|enXx2^`>!V5AgNa^PEzWGr>X+%mL6rs<#1W zPvNvuPx%W>dRR#@PXh^Np*n&Ewoay&lDR!4TxYb8bkGdiH{tl@{qE(<06m3~qt~W& z?7rfMOX4ak+(Yk+GA7+2K3N7r2IU)XSU$x!(=@h zP|n5PyR4=6x-F`MS6?HSn)jtSbWIN}NsRZgYLs>oJ~i`i-ix`oHX-2EC1Hk1dNBXC zveInq#hOFlU;x&`U zjOVln0F?X4OZ&NJM+9EgLFO*qop#zgw9i)ymV?)r2&B0r?HiUWl?p_cLkXlAV}7RZ zbkT-?@p5w7WCv4|*^zvxb|b#AW|@3Ya7BZjvv~Zg7i(ve9F!ANOzIeeDJ$^v#EE^U z7{_wjc6Dj5=mUvwJOP?csdtq&xI6{2tfy_alTo%pE3aUqkoxo16|1du)4S^Sr>)>L zO$P8(>Cx-Sc}reF7Q9!U_^*-%6F^%}e2?E_guUol^EDNbd+n81^h)w6QTs#T4@+QM zn{?ibg=*Hk3YPqRCYUGX`Og4g4tM4)sOqJuog`@RqWpYgdZhf5x%gv%?;#$GN!xVb zF2txuS44^cR)dLNf|`w66Ap{8Tln`&zBJDxEtg0m=~y)-a;MXWyqNU|Sfq!ZrhgBqIv)2rWQBht-uRkM(K*I1`D zvh&}mjuvQ_D*ovY+wEEaDtgcL_bpRE&9<&{$L21+F z|3%qb2SnL@?ZWqrgMg@j2q@AiAfO=9VNfEVh|&xy-JvwhV4)}=Qqnx4g0vtdF=HSN zN;f=8cXymMD*oR0ob!F(`~64E-1pvVuejE=*WRnK|4OjjwB*u=&sz00-RL2V0rGmdVyITDr3} zqcWIi^LCifk4xcg46W1P!Mk3rAbGR(wk1{vvA*Jv(^KMxa)Y(1GgljH zzwWF&Gb>nBe^dT-@}ta<`IA=;UdfBuot*ImAMFopb<-sbRo#k6A#=gyVV}{<=}1GW z=hw|_f&r6zmqQ%Vko_|ve|+n9-P;#9bXO{0`h(h@B%eqrH2 z%~1-|GPC?(y=iQ(b!5QwHEKCym2tG>qxE_vBuWJ#rzNVlFb*#|CmUpPJ7Annr56w8 z2^Aus;F`J5FVRyo_86Q)Qw-ck)DHR!@II?K^bL1eT~Q$>KBdlMf~w`vH?glmsIn_c zqXnf_F_fcZu5qM-;&(dVAx+?D6OuHGqeOa5Ymj0zh^y%F8H zV|xqtg1<54q^0m4Rc%r8Xi-~7>&bZ?7!LosG`?ewJ&E@4@Enz+n?(6EZsDTJu(Nla zHI^QDPw`K*Wzq@VB+N}Y9`j63_7o|eJ(oxBw0(n)=ymL=qwk2!e3~vnxxl`gS9fQ% zay~-D*ICCP7Lhj*a`k8x=Mt4typ;W+g4Y5bn5UO+x8mA z)-AtlYU5d%hJ4ylZ!&&qz{!sk_vi^eESL#JQI7jNNI?)uf={MK1Da0pf) zJ(@XZhN_;G7$QG6SR{vsoeqJGw>+n+Kz2S6` z#rkJLIK8y($WZI-UJV0hV!?FV(SA1J}%wv%EWnIe^`)~I`FUT z`gOZAwel0mJH78wF;1f3q&R`EYfBAd+Z?TQX{zRnm78BD zUmr4_k-v6#h;He8TggnBR$F>N8g9LrZ74paRDFuJ)X2o^QJ138lu9LtkpxImG5*J? zSsqI}tHi(J#T&XEaX=d&6U7GCH)Ed5pU~f}1>m=+K^Gme53)T+0x@9uCliP*64O~P z4J1^9HuM=rIcchnhcvyPIoNb3-LHsgOVXlKY1picJV$;}w2=$#(Xn!H=720GzW#Aj zM|{xY;}W@;$il>u(VMQB&D$%udN-!R&0&f0#yc*ZucKOy6vCVoa<4;+07o;TxVR`f9vh^)9>^WxCXGr0u2q@?>XIQxm7Lv2jyxuaK{= zuf+y&v+;QgBe*sxw8lommGq#e8BAvixV>W9GKP<6c-M*Ebx%#lF8Y=EUVJ*9>=wXp z!4tl&FC_XZ(u`HFxZ+XorJba;t;6|zPRU(-ML(moRF$V%WriwbF8(xe4L{j;qPvBG zE#F2wVoI~eQ0Q~%l>)gOWt%stt=C%mJ{gF*Z@;-l+1+Qvx@JDH-hGiLsI`E8+)D3# z{Arexy5p9o&3Up8ReTIQxn@3Esx(w6Rif+c)VnE5F5_iZ>zH^(#NPdf$#|Tyxo2zO ziL!g5IXBW5H*GWbzrAKPPrdb;L2k#&+JRQC^5~0Zc6)aPo;`c?udob#yY*h)%f^5? zB|z(iIu|~<7Q020{Ru5uyxA%a-M<5rEHAaBhD{arn+RW{TZAhB4JZdtYqg2nX3ML+ zrBWr6-ydH*h#PiI6jK-89_inS4DlK5`BrB5^7g?7|KA||usVAnB7A11`nj+#N;Y@I zu^ee@x7HWsih$elv?Y4@euEpLJ6cF(`oulkk`@z(WVTmpCJt=1x?-7U$A{mmuJq@A zKXWC-8Ld~{H*GGB)*E@&JE6NH<)$#ejn=D8N{I}%yG0wm6rGY78O7@Li1u^hHNl+H ziIx@Bt5?G|=a##NN~v+G(lWW!o=e~sKh6Xi*AJyf`5E`QuU9d!d|c|=DQ_NpbIkEH zPRLC>DyK9#gPShjM2Z@Hi&EztGGT=+8`2CIFPWN}qQJ)RU}Sk{c=2*V1%(v`IXgG4 zO~lyk?d^x3h+GMFLNN>DmhLn$66Xf9qs6a7G`$U-#2<5`B`-d3J@|XF2>LajVvCx~ zSAXQ-OU;7bGut;3CIq1R;1o4_?&)d_c4p3I^HyuQp%Xw{yL*eJI!SoT#!aM6F!5O(uXpn4qZSh`PoLm ze#dBz7b0y~t8d-48CR~XOOHqGLDS4eDSnpEYdutDm}e;G#Lby>$9gNc`IWPI$Qt_T z_WYCWLzg=KWgvcsNhp6nOO|hnU;R=;F|b|xKomc1L z1GkOoH_lX2ndXz{1S1DuiJ&FVTs@>nR6!3NCVFM}OSukLrCm$EDday6{ogVE)rv_b zzK>5NFIOChv`g5(VwC2cab@8hQ~s+ZVjhbHVL|B$L$yJEd_{r%v}cwvq5|8Vw~Q7pji9k<7!m!sbPZ|dr-_5;`d7}2l3y|?{)9*EtUOtla|=2 zf!7Fksy&2pnrGr7|DD_6u^1bJ@mE8$@h#^oIk^1AY_L+nRu~)0(`n|3DXKwTJB1S_ z`HOj73&PW<3=qp?Unpeq3yccd$7(_qLorZV-u^!EcI30{d2e~&Z_8n!en|^FGdi(_bXEiq75ibAq z%6jw<&vB=7(PU2R^Sb?VXh~~b_T5FICM{Arxsb)Z)UX8aA5&5(*+zN@b-)_aTzca< zgfE>(`}}W5FUxn?kn2Fn+o2@)SpGXgO9_l^i9ZgwEvXR<GU~Qvb;`7Q8{DZrPI*;(*V-ob7<*(dS2u$ zX(xP~ll8*$yTu>3w5E;re>aRBrKh#AwKd;bpDca*?UV_^DDh7HDiRP$bUAmF%*lE% zJBuCT^sX0w`&S@BPy`B^JK8?Jqp5UTQ_3uNay3-q7awR+R~nzlLe8Ai+bSHPS9wwD z&^`6?ha*1x&zAsVJ*PWDOLP}J^pTbL@zA&R*HDLY?;N5vKm2J*%M?9CLxhq#i{fVU z+Q?}7I7yfb<%Ohjil5OOrvw#O~|Y zfByNDp8u4ASP_y~jd4=8XiVUVemM4Tzu@h|?=GQ>ZqMuL%A+MU83&C1sLlxHku-nW z-PPV2gN~85(~_gKLX znNk#Catv1WW3jHR=ofqU{KgXCp_=$;1n~D#u?wm8lIV_0jWoou_PtW)l5S&aIPiBC z9lgCvZoB7&SdG~{kK;i6AFG2P-EjJw|YUbNnpoHsk3@2bqdCVcY#E|3>|83PYt zW@>8sW6#fnBOf+;IN^B{@GpZV@>&#p4eIT5?uOrI|C~2iZ{Y${o)<@>??ce9?4zT z#!vHz2j808sLyZ5I`a;5d*5a?8a>2$`5>y)too4thui!cJCW(y#Sjfn-k@k{Ym4#4 zFCEbzO$F-B;x;YDX@9aIC(1~EE&Ux#>r(&Aq}_>oTtZNj&O?_^?=DDMf}$D9P8Eom z^0Q9&uBnq$p;2xnysfP*&AcjzG;q~(L~-RvEFzdJv-!IG8^yqp`Sv=7<`6_U8*a() zM>LyS)TsWhV=ksf2!Bsad~;X$ct!C;dU+Na8Qp=huZ6_8F=z;Tqdpjnz9Fn`;Z^Q(gJieLspy-8#(~C$=Mb z%A8b(WsjwE`(_>RuU1RS%X94s(ltTSIivY|VH=imfD^1`EF3fYwL^%nT(|)HQV+#k z@{RjX@P^4=gS9iNh^Won)usVCR626T@N51Y^M$K&MNQw|n zTma)#`nA4uSL+m$pby*0DfC}~>I5U`BA3ZxQA~{*OiHuMhzkBk^gu_@5s4>L@GK{mC&`+fCRG~LEG=Ez0lxOa6kgP}?^vcwGR1&)4Hh$tnb1GX zxI0NlN_Ko%CeuDrQcf~|A~!o8Nx($Z37u1vbpjY>OjYMq{vC ztn7=J$#OsT zdX^Eb)Qx)5h z-R?kjsQiDB<#?TGEBR<@WpAI!z}!QQNsA;6Sw&%<(z+u{e_h6VP>bA;M|%qjyKB9* zyc3ympD1(NO}y1y)t_Ww3pEq`)~(mJ>L+=K&9|x4b77F6WnMYGLYO&SJofdNtF@Nw7Y98$mZhoqMNHz^PE;Waua&_#NqukI<5QC!l28v?E{b=sF0AHL|&5GUob z;OH32IGLw4-P6}+@_qjFBbRR5m0mL_Fs9Q)$U{G^e}#s#L0=qfY(!VqLR}jpCbH_4 z#Z;sM>4`D7KzPM|I2n*2|*nAX3LAg zy9;nh9u%cocckak?%20!9*N-Z<#OS--YQ*0`#Yh-ln|`@)`9tlw?f1f7w7Au{Fc%! ztVdu|vh&W|P0!wmesv0qKm46BcosNGuW6@+d8 z|Hy7k<_*WC0z0=>r~UozMoPP}AfwM>^2>_lgEEus*^=|B`o%XNY%Y8x*YNvLXX!I= z$#bNnkLQVdw}zLu*I>E#OhhBr<(=%(VA#uep!>c@*_g-gJ zDkF^va)t>8AL<70R4XyoP_6W8o$@QQ>&;byI|eIB{KRlpUP|EC^2yl#=Zq{qIr`J< z3yjzkjK13oxq7X&;<{L&5!~SC;U3q9t!HsBYs#Hc;-6YM80INYmyNKlje4?CI*!Jn zP$85$M#w}JcEQmA?NPefy2^rBeVv=rZT-ERDG4rt zYinPzI|h&IlyZ%#`_9t8+xQVxu4B;<$6pK8@&PPfsgGZRFJ|+e=Z{vvm2a+T;k4%$ zIX&ke^F3u}@%H)I-5=?mxXv230{x`;W%xtWRs^RfN1y4kc;0{hooZ+SyZ)TniRjNe zmTO*X*1XV|zF{o5((9TX_hy-^Pvh||-_4EwkSfI;{N`9lVQo8MIlsr3{G22fnaGt* zpHIt7uYIksR?k-zkK0OrtW%C{t!|K+xmi={v*x0oTJz6DijvTG7K(wN!MHFZ->LlK z+=&k@O&MxJ6J?DF-uESLH{kJ=7y$wNfvD4DIlgw#QgBp2f`<70>i=jBUQ!KA<~CB8 z;>LrYE3zN-uV%+%w*$Eb+Y5Vc=2%@xe~>9(jvJyL8Z0aq4}hz%{jQg9#Mc6Wtipyn z=Vp|n$htnFFtmCrBvhUUk8|n0<1%?HB#f0_tz?B&{nBk)c6`2$@7lis)iEOpV%ke} zc@1aUJ*z*8Jb$eo70B?)tJs>QIGyYMO7{-JCAs80If3P)-rSlAC7T_yjN`zr*XX+b z%n@!pzvFY+&v&8TrB}TD1`|4Got_asqL8L zkjTWXdEMcBMI>?OT}U;b!q!o)SuM%wpohisi@w%Z>QQidILQlc2-+TB=V!_3cuhOBXYa25(>+%_jmk(Ij#lxa7@*XzJHy&&G8U*|G+PczapF#Ds_w$9w&An2?y)$^ZCeyzixwdv+f}rnr zdr7OVQ95n)BW{z655JJ?d*{LwcKSnY99$r=G}E`0uu?^qxEW5Hbt^>izH$)KHnuch z%?D?@=I3=wKV4WF9|fJ9A5n-BYxE$*dCXV442AgF+0Pqfly8r=!|pY1oQ|<7qJO8n zcv)e4DJQgG$Nlrt{Kve8nrdgE7RH9y*e7*uwJNrcA(Su@26Eg#HF=8UKhdJi76wMVFc-W3_SRDE()vrA$WF2y)NkR|( zL0^cY)N4xmyl5a&KI)nnCMdj9Af=Ft$X})$kWsMm;A zc4DojJ$K_r`HpW&wT49B5h=8Xo!B>ZwH?LkKHakQR$gt-5i*&Y*zk;P|E_F3wsw;R zy3SJT=2SD=_AK$|*Ylcc%}1iRB2yzH?88>~|L2=!MGQn8wS<6pcg& zvsppxoQvm=xyq}f2h33ZfTKzf*7EvA=;^-M8dXO}oEys43?+~|nWtU6Pcd*YbmYUX z1a;^Daf!F`uAq1E-UY4!2I4w@0x)rXV!{e&$z&7T@m^Dh!hCT-T3`iGI7*UC$95JU z?u50oxjudSDAB|{)5vY?b*@*dKptj+PD|mIiIywnXmD`-yl8&*Ojkj{cXdTJmz+RJ zd3HYS72Ln_7SW?V(agGtE&s-d!q$~V?ON&Vw>D~HY-#O_+BIJK;}tR@HA1M&nFZIx zwWmHafir_lL#T_FC$`*n{C2iPeM_bWJ0sHTX5=?NQZrru_|KYk@Vew;(w-sxe4Mir zBuon{*Zo#x`uPic*JY&E^Rpv%HY!9k+Mv|oTt0TLO~_EmwKbr;G9^mRHZr1(Q=iKG zAixqdogtzUM)=_Hkj%+>Ue^+^Z>mO|%dVXw{@+R1mEtd=2kh#G$~c_;obUkSv`nf% zbjkl3!9kNqG@~WDjx=1WRqW^Vo+@)csExxB;56Le_B3qpztmPKUw-?jRY_*Xu4!0A zkmb?0OvAz$^A{2Yg(D5kE?3nxSy0|H{cI<_XZz-&2vr0&&kLHqGu|49bL4;Q8>lo) zWbnnUf7{rCyJJVD)u@bwT$bjh1hbyGC(H{kEGV#gD4ucbJ5e%KUUEV|mz$5UG;{m? zB4l_$vTfMGwFwsYswl!LS*LM4lyzb~cUgkqEk9;qD9gz?huimm*8;f`E z<0*Wf=MW}+&QQgY9K9-+63>f;Ja_P&3fr}I2Rfnq)UvbeN12$OlLDM){2nx2gkmRV zwrj~^n}NCd7rE}M!GqTdj5^0xlMemAFWCPGKen50P&|eF?2XcYpkfUzaC$PA{P$4~ zgpvnBUeL;<`%uw`1jKAb;S619bED+>VDIMG@Wr0bkF#;pgq?_)9l}iYO7`YIYsN;X zj3^7gdjhe+gRSb4wr|S}syhuG*D{|sV?(E>9m2AO7oa6BzSLOFO2{=IX{W7OflcVm zS#pJwL*FWGu`ANWgH+gXW4GSc!8;If2w+Bc`UMiND4uCAQcqP)3fGW&f&o>QTC zJnbb}PJ^pfe%yk2|7Ik!PZh_To~TscNW%J3cC7bzBl%>>F*$tWPDiDAqVIBOr+`gK ziFd4Q=9d-vD6BBy>Pq#mICKK7=c{Jc`{6X1lU>9yED{n#uZ(C7T4;9uB|V4~knv`s z{;rNrFwp~bqN(hC^I@wDq^(wdL?tu_b9-n!Nbo$nuzxiiO3VFsbDri~;#QQ9VPyBt zO3r8MC_{&hvf|ZFOFu=wZCs~$iWK|hOw2`Ld_;P@f`|r+8M_^`b}J4_{iu|<@ag$f zPS{;{bmG7WMocXWs{&CpN@Mt8QK|Ya(;gM(W6aMG`)W8 zlFri45Cvg?&!JJQZbgq9wr6gIRNG>=1jeq_+Pf+y#ZZRpAk-yY;1QikEKu@3({AC9 z6azNXdwY)UzA5Z6AWqTNGb{W4xI(-m<|Tz`-l=22!lfn4(mYZ!eYtNyt`Qe;LTZD; zbGXD^eZt)R%Lhx%DLf0AtS|I zP|fuILMx3L(hWNcqG(B4+@ZhD1?33SDto(c-(P3U%?%qaVm31>ThwTeLuU>;6sM7L zC!=c-#Couquoy)(%p+qZ&B5_5?|gJP`BzKRoP7 zSfZ2XHd+5ZKAc30+_tMe3df-pVS$dp0@1v9iqWPgMhba7VI)d_W{Q?8xlc>HGAIHf zb~`Y=OH%pU@Ze!nH)g1OH-^8Uz<}x7tIGuF`tYJXI9oW(?<*dLR~`?SB!^cjj#0qA ztP8VM~0Hv^GlUZNanV33BK*{J*qS~6?1mCPn< zENbak7Z&;BKOWVA6mlDyk8D(Y;F<5^d4`h{M)EZ`U>_zAQ^< zAG!Yz;Ax&%s$3+!$(lx$8_!jRHU2uPt~hbIHzQs{2^onH;ln?H_OXf-1E*t-dHxp{ z3xtVo`N89;znULK%C*|$+~tcw0r_-&T?=XOcpN5>fk+GV-cKvE#|sTe*)FX;MTD=z z5VmZK!gm=c6vbh6(47-fO}hji;y(yMvij)rJs4gz3LJhaPYnf-Mq>Uif#Y3E?~E`; z7>{G?w=W`mZ&f+*Vc)ob^x7r81Az2S{E)=GyL5k(^tnM`6%*o?8jQhUAW;{>KgmgT zKxOEqruG{-IW$q2s;|)yx8F-$+%+Gd124kRu521H|4~+dHQ**>tB)at3f82lYFu+o zhN-4tZUU1D204{WX{rKGNf>Q-O}SeOa7HnZ>@V9?qXAEJ_+do-SN)%oFenrINh#6; zRpeZw;DH1TCl!erHAW`-_g8Mcp+zxk%VTl~_RpUGM@qRs2u0CLFz&80f=;G5%!6OL zr?7;)d+UC$Iz2z1J`J8W0^&^2rKx}q0`bj_I#K^v@^CQHrvHW;50|k;bHX0uOKI-E zECx*~6X;>u+lvmE-FZ{0vKJr?-uOpI0-jzoluroO-_UPcQ)bEJT=k7bL#orBO#L7tenQr8oo+a**!Xgl6AJf+@W+ zSc`ue*JTs9vrSzMQ3)r&NNfvwX#TG7@dVIr54TtUVJy`sFE9{?&ruA#DpjNQzX(o5 zH&C|y0Z>QJcrMGMN*nB2L*=w-h^Gd#RUcBAGRgjZ7G5zDEHZKz|C9J%_UFj;P(o)! zA}!S& ztn01~OAz???Aeptri zd55y4>(&kqk#J1DmXa^-8rO$Ije*sr-YjUdzvl5E?L9c7Xp|Do1m0=AAdj4!FwbTSI+D);7=;{ zXjIrKm7V)SH~%igw{Fu9Hc*GRaoY=tvC=>Bius3*hai1t;TeeuNH9O{PA_cSr+VEX8#Un%}Um{Y#Crnr|lT%tsOIxW~3PW<*51J8SDa9X&oDdumj+FeVJtO(-!ph8+dEz@wz17E#2;yE z(#>n#k6lXBt$w2sJ6QBHI1H|jS%Yth1Teci>T&C~&jkV|TE;!AbW};?d13idW^u01 z+!JiLE@8d(;o65g0$!ne(AQLx7SWPi3nTR!S_mU-5aeqB>A+hSR5ta7vY?>g`i-lD zk-NSSujmOrrS@}l`hT4FIZPb7;}JF%VX*$uc_e5bn(m>ZIK_YjVXZ#brZvsEZVzhn zfr!spKhUh$s=ljQa;;TZA^&?nJ8p$UJP|3^bNDdE>scXa!qIJCXe^w2J&}&WRLFCr zKGu@cm9SDaQ|*Y`FzhU_k3C^hT9kww%sTe^6b3C>1m|^Ddfl;WtCb4E?mf;b!cQ7~ zr(In(p`mH?CddH`-2+d3&lTVKX6_BswwoS{G<2xm5-18;nrN>*Rmn{ES}(U*Q|74K zT4QwXn^)B}!d zh__+suSAIy{&0lKOCa^jN$?x6i+nzb3F9PhFQj}=wOdhpeCXax>4IkQ>?bOX`(u3a zbCln&eEdjz;bnqbmo@LjYg9GaK0|`@>DaBBxI>Sw3K{BV=-uF+gQ44Vogpl~7Kyg{ zH-{&Q&1;lH>gQ9jj00RWMCmj=5maWf!%}V)UxLR?;rVMjThzGKduF0X>4G+r*|t=H zSC-CQ>$FU)A7bIfS2CQ7Qjg01_D@v)cAcgCtw_`I?ez($u@lK=DSd$hWh|e_Dj78F zUypozx$T^nl~vV+;}b(gBu`PJ#usn)eB#kKZfB!^KDK{Td3!DdH<*>TwcH*1p^3I8 zCDCvF%a~sHVe~1Aa7`qnqe}~XimLWF z&$E1^0|$L~45S_4*gRCf?dV3H(C6%5{VJiX)HY0ID)bO)_7Y>Z+}ktsx!AU612on_ zic7`ovfZcL6mFHNyz8UVRjJ=wd8~g`xp?&DlS`+w7`{mx=uzD&6Ui=bAAqYhZ$;tT zLhE1?*y!U+YpINii4=t`Yr1#Gm{HxEP_#YcJjqIwjxXn{-~KR>CDz%Jxtkd8`Od&8F-^eimEV?bEOk6RK#9nYBX2>cLha|M>%MC}v)qMq>X?1m6P; zO-XuT@f&QLW0mknqXI6i?QvU9e64Z<)oyf$LSZ2EjEZ}hc4Ji^-4Q;#n0Qkev^mJ5 zp0D>umdhRZ*)j8!I`@!+hG+wk&J40CsgXD?()JBF&0$QkiL(BV?&vq~@4^rxbTBy# zv0nT)%NVnRw_9DbsanpVi(c>~-H9=F?`^%nG4VPEDvnrKSl)Pe9UZ(!E$?A;1-f%7 ziQLLuA!}24fduDaZnL|H6b~M9P5elEhtdi-1HaGk6IJ~K-@cc{N;o!b8P_hg zmkx_7JCHxun{mxJI#D$drX?TUK;@st{j3~e&DN)*G!-Y0lj|17Cs$#`l;WJw9#4O5 zs%O>6R{?(httgi*0ELL|8FATF8%6dI;&D_4Ti09MJ}T3#4y`Q))TIr7;(hLuPW5m7ILafz469`0QZ$>9H~X4oxV8&sZsI-RR%`!AN+P?K@?A=z>7DVWDRE_EPr9 z{I{2@#68sE)V`zVU1rKwV%k4rW;>vM;{6@JSI&MY?Dl+AEKgje@=+DA2Ug+(2ZOx! z&`K@2rSQ;pui~+2F-zd(;v)?A8mO4r`e!7E+&L`zOJhF#Dz5*I?l7}tBwiWHt~NhM zIe`APWm&{j!oC9e#xGZ{SPbyJRwHg=S5}BWEm{iY)6m;VpGdXObm7vsO={Go34h`j z?vv3NCtu$(+BBJ&(!9|}*M->b=wvc{+F4N82}>s$yLBo#l+Gzra@wxIfhaD={Nt^( z@74l_Ex{xV?*}{7hj`TQY(erQb@!Her6&z+)j}4?0JXem z)Fs@*-}nLqQVr4w6XX6FFX@v1~tuGnI$!IP8ispXQ>x?`)1Jn3o7M-i0OQW+XbSrO)t1BCNripprKSvxV>N zpd~MCkH-SkFY$Jg+f7l^LIDIb*+%>gRi-Z?jnE2@c^OBesto(5Pubp*02epUvr9-o zE!MakI(58*toNfMiuvrX=keK3zY6#(Le3!uV*UZKvQH+>@5>~Hsu$fouQC`v8xxW0 zPoKB*9WCh#PkEEo8JjzLx6W&du~eW@xH56{nkO^~F6D0=?{-{xbK(R0v2CZvxKOFr66|vRofM_ zU8^8+!-^;)-7yO24*8Sp_}+WaW32&h;h%r_1SvqDL%O>)mneVL+*1sw$tsMrrH6qS zr6(dvAmZ~LgwXCJi#jHN&pYOQ;V^M7YpM_l=D>wf48$#Pk(c2 zC-z_jo2pHWg-$umXP#7h>$x{4EK1X|SJGt<9Po>%6qA?#cyx4h_N}C7OL1T9yxIEZ z&9I}B3lD?%RV}I#=gk6RpS`}bC)&BapFz+Ta}xT4nbHuKvj)3M;cD-d9H?}Rr-oBn zXP}&TQIHd#iHGWlC=)~^L6on}=Uoe*MBDnpQNQbD*hWJJiA((A+j?tkrv-aIFzx6o z`?gT=Uzy!F?^d7i;;7~g6WtvuKZWoWDgM>PRBY3Tg@+fOP`6WZQy8IASnbXgu`5t6B1XcQ7NiYc%SyjJ*HUaGnK z>bUxa2HelCuDc@)HX&<#!57Aq%5`4R>1OjAC8$1DcWMf3$T88o`@|r(XS6dfwc)8k zdaIS$9#&sZ(c81a*t}D^HZ%Rw(}8njPMhUWH*FctlpyB)#*7R96Dw161FQ%NqkOq4 zlo7b8T&}*5TpuoPH|D_i&Kv>ADoS|GfRh3-!7lJC_^T_P2FeG|O7o~IcCT^Z`5H=( z!fm(`W|UTfaPsule)z$%5{~`JB>W(oHTF87NJpa{oS}rJ~IDG!Tfu}M59thZG2t*o8glLG(Kd5s(`8N*{ zm8!75A`}A`?2}Ay!e!R?xJZlk2svmia{)0#ap0%yNt!4hfHa_>VlA3p3sL!49L=EP6c!KtW5$XdOQnet#3rM$Z z2*tp&03WDt9$TlEV?^0ihQKJHo|YNvM00QKN7;>#v@ghU!2;&d^Nhmuw*W67GBR*& zcQ8x?=kO3I5Ic{ASl&Yl3K=m@@8?p=?B9n|bm`>Stm-X=T^0MR@bns!8V@M8i6e!n zdo0-H+F=oVm{20TZJgU5$T1afu_xYejGD1I+$UCo>zB-K#qTBkt6++q^lL%LK~N}jqHbT-*&LJdK2=VCSZpRGq{L7L zoJJ)TDuX=o-zm9$O2~v9F0b~iF5EnRZq0UYf1lgclFZD^cVB&$k%FJ|Q)fXYCc0pz zvV-T5N+w1@Pf>J-W+KQq60U|qaiS$VkAt)p;84epx>#BwhwFKgX3!9WPl0GHE5R+z z(d>#8J|ue#RI-c)HOY#*+t^@1X>}(pc(oO`T;H$Rmf#z{SZbByY^jbo14+SF}WLXB~D`PoM{hd@J-614B!M zJ91#`%LQW4TxC)ZUdxJc+LVH7o`(G>*@Oeok;Vk3W_jZCgv`WpSnnQ5L7caH0#CYv zd)$79{zKNYY27_SR0_B!r?Wle#VJ9BlU0zCSRRtlEm3wCjU&*KJZtG|?0Bv+z6$B; z-#VNAS7*mJB4m%ECRd%B+OJfn9d)0oGfmVTg6hvKc_0mAcxj0T*XEutgniVIT51a@ zk97&IupH_B?F)VzBFimkG2Qu&hUg{>LYc{iIf!9qJeg7DT-YaN*5Z3DWnI%)8n%ar+gs$LL2< zSJ>^XEL*89(USCR(a?w%RchF3sT{gf$;y>CGRjjb^ zquZ8=%?`X3f}AnWlt#t9+-&usAwKTHef&}`R|PsUaRj`_Gip@aHge@9Gc7Tgnh(q> z{X8E(LfqU=U~*Wf(URLeVB3}t!Jq6! z**Su*`eb*vvF>AT;}rA?9Ws*C!wYlf|D@#5O)r7F)~CxLYc zD8fRe%%E3W9X-m7oa;l(>eE_toko<%$Yw+QobQ!xrgE9L2GTdJ_w$(rtSt=sdrwEy z%I^%lT(@|Z%8AxHAi6NpNtR=>?CJ4+M1YRSUyFr8=>mlttY*KwVZkCK)9*%W5`LTh zchVn~Boe+;(t>^8j5&nv(6EpCsdZwnZFN%%$@rDt3rFJJ&Yy<>@nrOR8#gSa#($QQ z(IQL)AE2|R30-7Mc#u2%>F1#X=2XHTl-|fM$F-yxg_Ad^4HR7g+wm3$w4l-AjwyiJNzV+18#?F>EQKf$8A7d_ty0^DQBqcm4 zeIuk_dD-jS$)J~a%zciB1WRX!euy!cGe*ekupY#1SW0&XhI32( z4GAAtS-kB6VWS5itqPYs;hl1U?@qkv`-#a5E7wYVk}s_hmz2MbnI{F%Yb|TB9AchR zL}a>7qdWGcT&Em(s@wQ=a>HOP_@Z*xd~k*Hu6*~RBE$Ev*-?x+ELv4CKZqa@9 z6@0>HFJhd0Qva(*;(vfROpK~CtQ|YtPKV04_aYyeUT;0h*&OqOT5pZNV7aCx441@t zsx>R&v$`VrMGPu#zx^{fWX-5j7Hemos1hU)pM3lb%IEuQY$UYxEvZi+q?E5^lBivG z*?H>dw-;tVmP`p58x|byeOAMXr|NNqvt|U=qf}}9=%O$4y6w{FqR|3JjnO|^4L)xf zP6Ok7j$aFgk?O-Gj3hS%p(8BlmmBh^UaKB>6X!K?zF$MC@<-l+ecz@36G;GO`M>#J zMk^8NL0y*ho%PDIOZ{)c$#UQ($(JcbzWB$8+k0zHJd0x*9TrL4cpOr#KZ4WC+W7a{ ze1(>8ThBzJ-;SZw?6Z4AqvsEXT@$?iHBo1O%JE{PfMP}wiIv0E7d_iBP>q;G8SPz5 z{|HBp9X8tT|5xuC!jts>tf?U|*JC8KHt?*N12l;OHF;zYEwLf^0lNM&Ly7;+uW zFHL31%`oTl+%7gBzW-+GkaFQc?3=Dg{26pnneqqRvxY<8ge+5el3LdrApqUNg&ziJ zwW&yd0=3m8!73Pq^)(kp7Zn$GUO*fbT;DL~G&?l)_p`l@J}jH^3f)0Fl|cse5fj&< zNhYTT2S1b$#@^*jN?&j2J><53)P zm;=u;e-8@7#2{FdRQfZKTn@V9)Lu?}JPRmoEib%`b}@pR$o+8;b6>bkm78Ab&?JuPb4o@J+@U}TEAhs)JH&T$z@c>86> z!F!s6u(p;xc-K`vJk>k`^4N?I#?GjW8r{4dL9L7LB|Uy0I+6c?u7PCm0qk0n!sRc7 zqaoH5U}6>wsH}w^!bCyFJRfN`T=?@{&<~WH0u^TmuBv+tjQD@xes)1w_(i00rj=|w zvyd;y?&b)sk4f8Ud#jrlSXQxd%k;&wW<=u1Z! z8~XL3YT3NecR5na_urdRib5NucWSQ}FNENpXPc~gc6N0}Kf0!dak`&%HPl# z9ne!ej?@Djtsd_&eK`fZf_FuHlI>)iMpo}dUOY7v8j<_Cf^Zd_^Gypfr+40@1nwFh zoTXMjnbVbc!PghwQo&ZCE@RnEw1?jIxaccEydXQARDpzkoYJ#%^?w*XI282IUHdA3 zK~pmam>4AazjLTte{!f1i(k&v3H6V}W)nw=1+FR;my5I5VU$f~V`9Lqn-6W~j=bnk z$31MU-O;c8_>RzAOE$4Tpk?Q7|FOrCJ`T$xc9d>?CH<;OTU|-(iRBO1JXiDIOpRPz z;Vly}8#{<`@?U-qT~wqyzeUm$xAIbIK4d3w@5xK4NDE&dDKVQ?!SM&h792&z-KK_Q zlLfem-qWOf?d`sSN2GiW5(MCXMPKpZ1-XAo061wS>CWHTZa!qY8jzZ)8uvX31K4e& zhyHJ~WrlG_oB^dD{;LSY9AJ?FO;ucg3#N<*9oPrr}u%LS6 zEvN@n&zpJiL52LSql3Eu2;dC$8h{)e{`eJAtbm}Xn*1kL{D!Om#s4Sk2k`s^%KkTI zRi4_D!F0K#Ymc6a19jRrr!C9=PgAddX6RmAp<I?vQC4JTmk*i4w@ ztzaP``7@6|HJur-kOCe z^Zt$xw)B6{_t$5aBV{3Vr~@~{3wPC%a`|If&{=NHA1U}WXWs{h(V~y-CU_9xC-vG+ zd0Fk&0)Pxi`BL%G|DG>B=p3XnWkF?-<@jl+plsoWrPf};N^q0wszXy@BYMp66Q9A@9ilSn%2^_?L88P|wCevQB|qKI@`gT4q+0_q6U`?Wo2UGuxx zg(Did{!`cW09vwveOeZBeq2tQq?~x2wV6(HxbM%Ee*xOt`tv0DTD|^WgGUNn&w+#B z_^oGM9=BvjK&JB0H#bO<+zH)7t8`&^>cX$Kv*R-_{6R94kN?c=Ec1U$GE6JQB1_Bg z-QD5H^^{=MfywR0j|mOZQAzP+0__*pV~+PvCi-u-60{C&rDuaDA`u!}34!2})VT3a z!U-Qvo0C$y^xDg%2rKIx&?0iis_MVuO-5}QA>wh*s(el@mly;aLX>mUP`bL4hlFvTf%02Z`cSoXha3Pg25^o5bF4d6NdBOX;0US4^ z2#`5p*3ut;VIkK04w!Omiw0&nR&&V$g2g54n1pS!lK17lDC z$wB_#I|Boj2lF^}3}}XyHR4cp->kM~5K^#538{3ngHQgKbUPqKVSOPFDuyY#nvT!e za?g%-NYPEiZb|Un4Kk}PF#>>Z36}LAn(G=Lo~s5ccBTTZN64|1LQ8JebI-%2HiEEl zW%Qu_a{E!to|v>%&_{22cKrDmzCQu~I4Hmx2+$6s>j$WO0eV?J?fk=T_4SlUb(*mc zwE!Yh1m|EuF)#-oTwcD51fSV{Ul_!|y2hzDa?)+AWx$RFWj9#!qLw?9AT0=Q?SluN zf%z@G6+khc-;OyYkc$XII=Gi&z{-&~v;l6&I|c6*0>n6N48A-$gc1BC3w168uUl< zH8<*kPcmj*%k}TAp1)k)WHG$>--gD7V!pad?Vj2yJG1cHULSzQB8}JkZIfeKm z1n7`{12CDR3iuf|pwo`r6Yvp0cg#UHIq47&*33pqt4I{(-?R$E28^Vr#cyIN7+5Mm zxpvZ$0^;b70}Dy|2l$(WPxRZ-zW4|Tk;GxB*e0x@B^8uj?AN@yK8yutNHW^r)ERFn zBCHK!azHV2{tp(AwD7 z*>Wqas=<4uHfdd-a3*y-Mfb>=ztsDC`HD7a`SgZJvfR1ip_ywIx#XjA-x=8X`&i3Cu@U?YjxGsVJ-cqwpO-}at&Y50eQbAz65ICj6J&+v0 zMoJ${a9SRMx${#2=j*V91N*_)*CClFsqY>VM@S94oZ_|ixQu^a$9c8c5}vsPSLgn= zy7OH?lag|#KceU>P<{=m#|L7}Nt4XnKa_Pc(m$30FVqR6qRWvYSd){XShR=D%Pbu|QjOR;T&;0oQ-u%A1)lhSgauh3&`J#1 z(2|wppc+Xe;7{@cK#l$1EbSy{{cR^58%)kIn6@LTG~YScuCG*W-5aVugWo)bZ@Ge? zwJa^zE8OD-VSve01J=!Ns-GSe8!R44h`o=Nd2qGYlaE!$#2Rp23q#F1XW;`5Wnmz6N%1OtKQKP7e*SRpy+6cC%T@@ z@e`!8SJV|7wbd0I!YGqLW?6-ol{nh`0@eCsSb8$*A@?X)?V zGZ59JP#IkCv%NA9DrY-(bVYV#PhOS`ESX3DFV@~VuBxqT8=iYp(kh`ysfZ{bC@l!6 z2#5$Mjie$VjdZgO%0eD5d6fW9{acf(rieuA3g$K+#*m%-gT>G1CO+V|e0{Z#OR z(e@gu0w=k*K z#Z!Y>V|y=$uEmLaH-D)h`uEmSrBfB9Dc^5|77x~^U(nu&@SEGn$#q}zte)&NGkyQH z-plCv3y-yeZh?Ev+Ca?oLEqI0{46F83DGPa2=Mlj1xmjIGtJuPWWoNWuT@M1clQz& zVk-8wtY&=WsZX~TnB(3*R9RF};%|L*dnki(iDHS`VwGP+vo{Tk+mA|S@70c}pX29b zUiZ#f>{@ejm~8k-znmZ6Cmbl*TPCx5$)UnmB{o=EJSt$l)c5ukUu{7;IzN#;U$f|A z?bkJjhMmS-4ft=3`j1;Lt3?|nvifFRU$z+;sS)Tj`fR#agNr?4;)Q89Z@&9&*_9AG z{nC`Dh3tG&TFPTrqK!v`!>AJ5@lT%F8?@UuhoG$9m-K`xnTQ>op zf&tN~e3)9HYbXjhxUJ8fK{WO%ndFcodVzaBCZX=!P5u6^0BS7;aQ?Ba6#vbF*mlaIY+E93mD@gAfhp6IC;p&YpJ zC-<5(`kyH%z*}}eWHq#f+M5ibA4X{^!ZEMgpdi0-^VnKEDA!d60LeMFc|Vbp2|Rvp z59ASN&_F%>=FS`nS6}{GrF9(;{GUyED5w;_R+ z5HuL%RY!aOFxa1^+ttv5=zW3>r$M!WpcdsChA)V#`H{4gt5t^tj0zM4sb6n!-&v zUNYcptbvn!w4k%ehy5j()a3xbH>JbE?X&Visl+Ntd7*`F&e*J#1w_rU?Y}Xb52?dt z87J3pE)tE=#Egt1BGcj@Q~RN2RWc0Qw^yo01!Trq0}){ zkNpg=uaKQI`_@By`t%*d;?K}mK1*8qT7XF(`=f**{SY8S{nn8|{d7Eg5MQ*-0jno6 zxOpV-oPp^qJm(`rE}Y+JC@k+8Fq&9s5e4rm`PfG!bZ{1xc}468#pHdS4LGAjdiU3t zLx&)#JYQJ0wX=MDSfkm!wVNwrO#3ro&)9R00S4k*?sIx*sM2jeA)&>Sr4I7izFdke zgn!&;XJ*L@nGjgNozylH3eMOA5xfVLPd@z0gqQesyEeHX5V>lD6bEPwGcdy041mvw zvjYpf!iQl;u*4Q$3N3UF2;07uRHP1%91m%5l{X$*6IFSVk`lZxg>Ou9uk=LpFZ<_b z4tHp`gdQ6Do?|#bzsHGWf@EOLk#PUgkcsmR9kw<16mlWokN`MOF+Tpmj`FoNAFIS$ zwmG)eu35bWJ??27PZg0x4ovBB$>UDU-`9YETPt~C0VTp6pas^{7S1XaMgB7Iq5c#` zf*a4I#CAgM$$41>eVL9PoOj8Uu4W71HT^uy52)%11CW25$G{`j5h&s-{O{B zftRQz$FWr!2Qm?VIh_@M9~v^&RD1N4UHyr{dM8OA)`x{WMG-p>7&hxHNhjRu>^Rz| zrso{t8L)irWZ5GB+D@X&``)vZ>dQQYW) zvA5F%Qq%?@7@_F2y{_U>O5#L&2~HvYNWhg@>{;FKtpIKpV|pp@q}d_xj`1F6$jg}W z3CjLoY{WA&V10YDAohSWbMwMb67a@0qhCMcW!QZwP1Xd=$L&+`MUPfR1+Hu)sOGE* zsI!Z<&Q>qehOAkgGqs;z23`E|XSQdW8sc1AP0D67QSb)V=ar=PrkSP$Bv?M1?1Y4` zZ*9_7p|LlRQ4(51FtC)yPwJ3vC$oMvwgW)39+pa=yMR=(ov1AXtsG>{fU?RhV&xwR z1alo&X#}9e35@sHN=+8+HCtGhkK<~XCx=H(a3*r4G=h6wsCkkIS`a2UW;g(#6&MM2 z5G9euw_Umn7tybq^(dfxu(|Ok(a;`ffWC?R>CXQjY`C4MCk6*(UH(#zDb5kx%79WZ zP^$k8>VRS6KQk79(x1PSo{UhSZG8r2`v?rGP2N_WTS#NG5A@m#GB36>D%d>9Ixr-cJZ*It%BTonMbk%OQ1M6|YtQmnk?fQ`{2R z0jIk_GVOus1q|qJWq3Wve68~ivpFiyaCMjfxGT`m) zWugK?Kg^3z4q3|N+k#s0cNYJ5lG$uF{+d& zr3vCRx6TRTB~rn)Z(>V{Og#6`Es}<%Sdqiq+A^3FAmooQK;j-cgC70_g63Hw+z#@2 zVxIc+FQ4_cs)q76c*8SKk&;re<0Bkl;~KYT&x4v*{5Ow$BvMSxbT@g2j>acH(}Oa#oe&m-O{bRsNXAaM@qH!q$HI|Mz~4OKEjr zPoe$)ZYHX~%(Nfx{-(@0ga@xXXE^u%7^%aLZ`{*&?~f&)ktt*Y>*YShtOqP1SZ~}; z4b})*IJ))+Gm&db9nNgI7W?%>tUn6ch|$XdJY9uJ@l22$ySaZ?EhrOioxoANuG)eH zywtd74v~WzozU%Jc?TM_a$tDm0WcNv?kC83!nB3<$;4g6w_(totrhg01BW#A8R7WC zp{SVg?0T%(hmSpb0S9S5=NiIB7Jligh>-!;0YsyPum{=C;f41weVOOh`Njf7NA|UI zkKhCnjAhx}N2!G0`v|E3M#RSZ`hyQN(UWcejRE2|F+kmC*v!FNcscEVr|`H&Diiia z{oryj$W{lk9UP%?<-_Yy;-eWONYsgG-1%g=`@+c$L|fJtozG2o91TcnMK2SSr@rb*MJAHii$%4R! zlV?QYBMl&6RlaOy=7g7URjft`NkFY5z|pD-EAYUTd*y>C;G8OyKtTjGKBS6=)2%;pHZJnWcgneI`p``sd(K$_@8Ie{ zH(_`y{nYO&*07l(;YEILpxY?eVoA1&hh>DC5cn3>EB|j5?3@l7J4%-UPaacRcs~w? zgax!W92^yGS%a~K*qA3qE%(o=&sDI&asy@r6p)4EXfrn<;ZyH^IN)rxnPo4bX$*)d z@Zk*X?gWy$heh~t69+-KppyZd(H*LXm&Cx_6~%YooS}ZetfkN8_YBBhNGvWE39zhz5!TAi((KbueYDGns?PQkrsb1q$Nv3%vhF1?jB&QkpQFBe$Y0 zE(5z?_k=r+z1}ogRV8aj(jyHOQ&Xzq7h(RJ@NJuk^#De&L1W0l0Pj}=i&6H<0u}OC zt%0EV-!Pl-SX4g`??q^TSotAP3~XA#dY`b^03gPJG4e`k*g3N$A{XIl{q&z#YHom7 z4@c)7SAbw2$f|=!XUFxs7o9h=I@D1IjKMnv7?{NwLoM)aoiKaZT@PoeVGA2FgZn)h z`yyhU<}~JmJpVJQPB5C_%8g?davUavc|MWZzGr;q$ z@WPd_gZGeF@g1tZ??19WNgANef2~YP8N9sS6bioU=|5Mt3qz|IeMBQThNW zXDhuxOYuK|I^HOxy@N}|=N~0HrhBLk+7p{BNE@Ll>!v?zej3k9l?kqteybc?5Wy&t z3qMPig&!SQ=AK#pY5jT$US$%rUb=qV%ShqQojZQOkc_rA``uce`!-V>JIdx`w^P20fv@pIjdZc4+3FOF6-^_UT;$ws;!o0u6YCht-tn zVk9(Q!aJL8_dyg=1{m*vk;eZG^}}Qm_GEJ(BpwG2-Mz=*g!c$|UoDIQx5BFa6^{qD zPAQJuJk_8@s$k>61raDE*b4?=M7*LoPz?l+6CZ&};bVilqF+8>;G*Qi3w;qr7>K

    u~47;zp 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

    RcIRc_t)-IGCEtp(aTc4-tr5+O0+4%gj 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

    - -
    -
    -

    Matrix Display

    -
    - 16x16 | - Stopped + +
    +
    +

    SPORE Nodes

    +
    + +
    -
    -
    - -
    -
    - - -
    - -
    -

    SPORE Nodes

    -
    - -
    -
    +
    Discovering nodes...
    -
    +
    - -
    -

    Global Settings

    -
    -
    - -
    - - 20 + +
    - -
    -

    Animation Presets

    -
    - -
    -
    - -
    -
    - -
    -
    - - -
    + +
    @@ -148,8 +138,8 @@ + - diff --git a/public/scripts/ledlab-app.js b/public/scripts/ledlab-app.js index f037a1e..e1aed85 100644 --- a/public/scripts/ledlab-app.js +++ b/public/scripts/ledlab-app.js @@ -33,26 +33,26 @@ class LEDLabApp { } initComponents() { - // Initialize Matrix Display component + // Initialize Node Canvas Grid component (new multi-canvas view) + const gridSection = document.querySelector('.matrix-grid-section'); + if (gridSection) { + this.nodeCanvasGrid = new NodeCanvasGrid(gridSection, this.viewModel, this.eventBus); + this.nodeCanvasGrid.mount(); + } + + // Initialize Preset Controls component (now works with floating controls) + const floatingControls = document.querySelector('#floating-controls'); + if (floatingControls) { + this.presetControls = new PresetControls(floatingControls, this.viewModel, this.eventBus); + this.presetControls.mount(); + } + + // Keep old Matrix Display component for backwards compatibility with settings view const matrixContainer = document.querySelector('.matrix-section'); if (matrixContainer) { this.matrixDisplay = new MatrixDisplay(matrixContainer, this.viewModel, this.eventBus); this.matrixDisplay.mount(); } - - // Initialize Preset Controls component - const controlsContainer = document.querySelector('.control-section'); - if (controlsContainer) { - this.presetControls = new PresetControls(controlsContainer, this.viewModel, this.eventBus); - this.presetControls.mount(); - } - - // Initialize Node Discovery component - const nodeContainer = document.querySelector('#node-list').parentElement; - if (nodeContainer) { - this.nodeDiscovery = new NodeDiscovery(nodeContainer, this.viewModel, this.eventBus); - this.nodeDiscovery.mount(); - } } connectWebSocket() { @@ -180,13 +180,6 @@ class LEDLabApp { }); }); - this.eventBus.subscribe('broadcastToAll', (data) => { - this.sendWebSocketMessage({ - type: 'broadcastToAll', - ...data - }); - }); - this.eventBus.subscribe('selectNode', (data) => { this.sendWebSocketMessage({ type: 'selectNode', @@ -194,13 +187,6 @@ class LEDLabApp { }); }); - this.eventBus.subscribe('selectBroadcast', (data) => { - this.sendWebSocketMessage({ - type: 'selectBroadcast', - ...data - }); - }); - this.eventBus.subscribe('updateFrameRate', (data) => { this.sendWebSocketMessage({ type: 'updateFrameRate', @@ -235,10 +221,6 @@ class LEDLabApp { sendToNode(nodeIp, message) { this.viewModel.publish('sendToNode', { nodeIp, message }); } - - broadcastToAll(message) { - this.viewModel.publish('broadcastToAll', { message }); - } } // Initialize the app when DOM is loaded diff --git a/public/scripts/node-canvas-grid.js b/public/scripts/node-canvas-grid.js new file mode 100644 index 0000000..cd75dd1 --- /dev/null +++ b/public/scripts/node-canvas-grid.js @@ -0,0 +1,486 @@ +// Node Canvas Grid Component - Displays multiple SPORE nodes with individual canvases + +class NodeCanvasGrid extends Component { + constructor(container, viewModel, eventBus) { + super(container, viewModel, eventBus); + this.nodes = []; + this.selectedNode = null; + this.nodeCanvases = new Map(); // Store canvas contexts for each node + this.nodeFrameData = new Map(); // Store frame data for each node + this.matrixWidth = 16; + this.matrixHeight = 16; + this.pendingRenders = new Set(); // Track which nodes need rendering + this.animationFrameId = null; // Track animation frame + } + + mount() { + super.mount(); + this.setupEventListeners(); + this.setupViewModelListeners(); + this.loadNodes(); + this.startPeriodicRefresh(); + } + + setupEventListeners() { + // Settings toggle button + const settingsToggleBtn = document.getElementById('settings-toggle-btn'); + if (settingsToggleBtn) { + this.addEventListener(settingsToggleBtn, 'click', () => { + if (window.navigationManager) { + window.navigationManager.switchView('settings'); + } + }); + } + + // Close controls button + const closeControlsBtn = document.getElementById('close-controls-btn'); + if (closeControlsBtn) { + this.addEventListener(closeControlsBtn, 'click', () => { + this.deselectNode(); + }); + } + } + + setupViewModelListeners() { + this.subscribeToEvent('nodeDiscovered', (data) => { + this.addOrUpdateNode(data.node); + }); + + this.subscribeToEvent('nodeLost', (data) => { + this.removeNode(data.node.ip); + }); + + this.subscribeToEvent('frame', (data) => { + // Update frame data for specific node + if (data.nodeIp) { + this.nodeFrameData.set(data.nodeIp, data.data); + this.scheduleRender(data.nodeIp); + } + }); + + this.subscribeToEvent('matrixSizeChanged', (data) => { + this.matrixWidth = data.size.width; + this.matrixHeight = data.size.height; + this.renderAllCanvases(); + }); + + this.subscribeToEvent('streamingStarted', (data) => { + if (data.nodeIp) { + this.updateNodeStreamingStatus(data.nodeIp, true); + } + }); + + this.subscribeToEvent('streamingStopped', (data) => { + if (data.nodeIp) { + this.updateNodeStreamingStatus(data.nodeIp, false); + } + }); + + this.subscribeToEvent('status', (data) => { + // Update UI to reflect current server state + if (data.data.nodes) { + this.nodes = data.data.nodes; + this.renderNodeGrid(); + } + if (data.data.matrixSize) { + this.matrixWidth = data.data.matrixSize.width; + this.matrixHeight = data.data.matrixSize.height; + } + }); + } + + async loadNodes() { + try { + const response = await fetch('/api/nodes'); + const data = await response.json(); + + // Filter out any broadcast nodes + this.nodes = (data.nodes || []).filter(node => node.ip !== 'broadcast'); + this.renderNodeGrid(); + + } catch (error) { + console.error('Error loading nodes:', error); + this.showError('Failed to load nodes'); + } + } + + startPeriodicRefresh() { + // Refresh node list every 5 seconds + setInterval(() => { + this.loadNodes(); + }, 5000); + } + + addOrUpdateNode(node) { + // Never add broadcast nodes + if (node.ip === 'broadcast') { + return; + } + + const existingIndex = this.nodes.findIndex(n => n.ip === node.ip); + + if (existingIndex >= 0) { + // Update existing node + this.nodes[existingIndex] = { ...node, lastSeen: Date.now() }; + } else { + // Add new node + this.nodes.push({ ...node, lastSeen: Date.now() }); + } + + this.renderNodeGrid(); + } + + removeNode(nodeIp) { + // Don't process broadcast nodes + if (nodeIp === 'broadcast') { + return; + } + + this.nodes = this.nodes.filter(node => node.ip !== nodeIp); + this.nodeCanvases.delete(nodeIp); + this.nodeFrameData.delete(nodeIp); + + // If the removed node was selected, deselect it + if (this.selectedNode === nodeIp) { + this.deselectNode(); + } + + this.renderNodeGrid(); + } + + renderNodeGrid() { + const gridContainer = document.getElementById('node-canvas-grid'); + if (!gridContainer) return; + + // Clear existing content + gridContainer.innerHTML = ''; + + // Filter out broadcast nodes one more time for safety + const validNodes = this.nodes.filter(node => node.ip !== 'broadcast'); + + if (validNodes.length === 0) { + gridContainer.innerHTML = '
    No nodes discovered. Waiting for SPORE nodes...
    '; + return; + } + + validNodes.forEach(node => { + const nodeItem = this.createNodeCanvasItem(node); + gridContainer.appendChild(nodeItem); + }); + + // Update visual selection + this.updateNodeSelection(); + } + + createNodeCanvasItem(node) { + const nodeItem = document.createElement('div'); + nodeItem.className = `node-canvas-item ${node.status || 'connected'}`; + nodeItem.dataset.nodeIp = node.ip; + + // Create header + const header = document.createElement('div'); + header.className = 'node-canvas-header'; + + const title = document.createElement('div'); + title.className = 'node-canvas-title'; + + const ip = document.createElement('div'); + ip.className = 'node-canvas-ip'; + ip.textContent = node.ip; + + const status = document.createElement('div'); + status.className = `node-canvas-status ${node.status || 'connected'}`; + status.textContent = node.status || 'connected'; + + title.appendChild(ip); + header.appendChild(title); + header.appendChild(status); + + // Create canvas container + const canvasContainer = document.createElement('div'); + canvasContainer.className = 'node-canvas-container'; + + const canvas = document.createElement('canvas'); + canvas.className = 'node-canvas'; + canvas.dataset.nodeIp = node.ip; + + canvasContainer.appendChild(canvas); + + // Assemble node item + nodeItem.appendChild(header); + nodeItem.appendChild(canvasContainer); + + // Setup canvas + this.setupNodeCanvas(node.ip, canvas); + + // Add click handler for node selection + nodeItem.addEventListener('click', (e) => { + e.stopPropagation(); + this.selectNode(node.ip); + }); + + return nodeItem; + } + + setupNodeCanvas(nodeIp, canvas) { + const ctx = canvas.getContext('2d', { alpha: false }); + if (!ctx) { + console.error('Failed to get canvas context for node:', nodeIp); + return; + } + + // Create off-screen canvas for double buffering + const offscreenCanvas = document.createElement('canvas'); + const offscreenCtx = offscreenCanvas.getContext('2d', { alpha: false }); + + // Set initial size for offscreen canvas + offscreenCanvas.width = canvas.width || 320; + offscreenCanvas.height = canvas.height || 320; + + // Configure both contexts + [ctx, offscreenCtx].forEach(context => { + context.imageSmoothingEnabled = false; + context.webkitImageSmoothingEnabled = false; + context.mozImageSmoothingEnabled = false; + context.msImageSmoothingEnabled = false; + }); + + // Store both canvas contexts + this.nodeCanvases.set(nodeIp, { + canvas, + ctx, + offscreenCanvas, + offscreenCtx, + resizeTimer: null + }); + + // Function to update canvas size + const updateCanvasSize = () => { + const container = canvas.parentElement; + const containerWidth = container.clientWidth; + const containerHeight = container.clientHeight; + + // Calculate pixel size to maximize canvas space + const maxPixelWidth = Math.floor(containerWidth / this.matrixWidth); + const maxPixelHeight = Math.floor(containerHeight / this.matrixHeight); + const pixelSize = Math.min(maxPixelWidth, maxPixelHeight); + + const newWidth = this.matrixWidth * pixelSize; + const newHeight = this.matrixHeight * pixelSize; + + // Only update if size actually changed + if (canvas.width !== newWidth || canvas.height !== newHeight) { + canvas.width = newWidth; + canvas.height = newHeight; + offscreenCanvas.width = newWidth; + offscreenCanvas.height = newHeight; + this.renderNodeCanvas(nodeIp); + } + }; + + // Initial size - call immediately and wait for next frame + requestAnimationFrame(() => { + updateCanvasSize(); + // Render initial frame if we have data + if (this.nodeFrameData.has(nodeIp)) { + this.renderNodeCanvas(nodeIp); + } + }); + + // Handle resize with debouncing + let resizeTimer = null; + const resizeObserver = new ResizeObserver(() => { + // Clear existing timer + if (resizeTimer) { + clearTimeout(resizeTimer); + } + + // Set new timer with debounce + resizeTimer = setTimeout(() => { + updateCanvasSize(); + }, 100); + }); + + resizeObserver.observe(canvas.parentElement); + } + + scheduleRender(nodeIp) { + // Add node to pending renders + this.pendingRenders.add(nodeIp); + + // Schedule animation frame if not already scheduled + if (!this.animationFrameId) { + this.animationFrameId = requestAnimationFrame(() => { + this.renderPendingFrames(); + }); + } + } + + renderPendingFrames() { + // Render all pending nodes + this.pendingRenders.forEach(nodeIp => { + this.renderNodeCanvas(nodeIp); + }); + + // Clear pending renders and animation frame ID + this.pendingRenders.clear(); + this.animationFrameId = null; + } + + renderNodeCanvas(nodeIp) { + const canvasData = this.nodeCanvases.get(nodeIp); + if (!canvasData) return; + + const { canvas, ctx, offscreenCanvas, offscreenCtx } = canvasData; + const frameData = this.nodeFrameData.get(nodeIp); + + // Check if canvases are properly sized + if (!canvas.width || !canvas.height || !offscreenCanvas.width || !offscreenCanvas.height) { + console.warn(`Canvas not sized for ${nodeIp}`); + return; + } + + // Skip if no frame data to prevent unnecessary clears + if (!frameData || !frameData.startsWith('RAW:')) { + return; + } + + const pixelData = frameData.substring(4); + const pixelSize = offscreenCanvas.width / this.matrixWidth; + + // Render to off-screen canvas (not visible, no flicker) + offscreenCtx.fillStyle = '#000000'; + offscreenCtx.fillRect(0, 0, offscreenCanvas.width, offscreenCanvas.height); + + // Batch render all pixels to off-screen canvas + for (let row = 0; row < this.matrixHeight; row++) { + for (let col = 0; col < this.matrixWidth; col++) { + // Calculate serpentine index + const hardwareIndex = (row % 2 === 0) ? + (row * this.matrixWidth + col) : + (row * this.matrixWidth + (this.matrixWidth - 1 - col)); + const pixelStart = hardwareIndex * 6; + + if (pixelStart + 5 < pixelData.length) { + const hexColor = pixelData.substring(pixelStart, pixelStart + 6); + + // Quick parse RGB + const r = parseInt(hexColor.substring(0, 2), 16); + const g = parseInt(hexColor.substring(2, 4), 16); + const b = parseInt(hexColor.substring(4, 6), 16); + + // Skip black pixels for performance + if (r === 0 && g === 0 && b === 0) continue; + + // Draw pixel to off-screen canvas + const x = col * pixelSize; + const y = row * pixelSize; + offscreenCtx.fillStyle = `rgb(${r},${g},${b})`; + offscreenCtx.fillRect(x, y, pixelSize, pixelSize); + } + } + } + + // Copy the complete off-screen canvas to visible canvas in one operation (smooth!) + ctx.drawImage(offscreenCanvas, 0, 0); + } + + + renderAllCanvases() { + this.nodes.forEach(node => { + this.renderNodeCanvas(node.ip); + }); + } + + selectNode(nodeIp) { + this.selectedNode = nodeIp; + this.updateNodeSelection(); + this.showFloatingControls(nodeIp); + + // Notify other components + this.viewModel.publish('selectNode', { nodeIp }); + } + + deselectNode() { + this.selectedNode = null; + this.updateNodeSelection(); + this.hideFloatingControls(); + } + + updateNodeSelection() { + const gridContainer = document.getElementById('node-canvas-grid'); + if (!gridContainer) return; + + // Remove selected class from all items + gridContainer.querySelectorAll('.node-canvas-item').forEach(item => { + item.classList.remove('selected'); + }); + + // Add selected class to the selected node + if (this.selectedNode) { + const selectedItem = gridContainer.querySelector(`[data-node-ip="${this.selectedNode}"]`); + if (selectedItem) { + selectedItem.classList.add('selected'); + } + } + } + + showFloatingControls(nodeIp) { + const floatingControls = document.getElementById('floating-controls'); + const selectedNodeName = document.getElementById('selected-node-name'); + + if (floatingControls && selectedNodeName) { + selectedNodeName.textContent = nodeIp; + floatingControls.style.display = 'flex'; + } + } + + hideFloatingControls() { + const floatingControls = document.getElementById('floating-controls'); + if (floatingControls) { + floatingControls.style.display = 'none'; + } + } + + updateNodeStreamingStatus(nodeIp, isStreaming) { + const gridContainer = document.getElementById('node-canvas-grid'); + if (!gridContainer) return; + + const nodeItem = gridContainer.querySelector(`[data-node-ip="${nodeIp}"]`); + if (nodeItem) { + if (isStreaming) { + nodeItem.classList.add('streaming'); + } else { + nodeItem.classList.remove('streaming'); + } + + const statusElement = nodeItem.querySelector('.node-canvas-status'); + if (statusElement) { + statusElement.textContent = isStreaming ? 'streaming' : 'connected'; + statusElement.className = `node-canvas-status ${isStreaming ? 'streaming' : 'connected'}`; + } + } + } + + showError(message) { + const gridContainer = document.getElementById('node-canvas-grid'); + if (gridContainer) { + gridContainer.innerHTML = `
    ${this.escapeHtml(message)}
    `; + } + } + + escapeHtml(str) { + return String(str) + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); + } +} + +// Export for use in other modules +if (typeof module !== 'undefined' && module.exports) { + module.exports = NodeCanvasGrid; +} + diff --git a/public/scripts/node-discovery.js b/public/scripts/node-discovery.js deleted file mode 100644 index 8c7bd81..0000000 --- a/public/scripts/node-discovery.js +++ /dev/null @@ -1,178 +0,0 @@ -// Node Discovery Component - -class NodeDiscovery extends Component { - constructor(container, viewModel, eventBus) { - super(container, viewModel, eventBus); - this.nodes = []; - this.currentTarget = null; - } - - mount() { - super.mount(); - this.setupEventListeners(); - this.setupViewModelListeners(); - this.loadNodes(); - this.startPeriodicRefresh(); - } - - setupEventListeners() { - // Broadcast button - const broadcastBtn = this.findElement('#broadcast-btn'); - if (broadcastBtn) { - this.addEventListener(broadcastBtn, 'click', () => { - this.selectBroadcastTarget(); - }); - } - } - - setupViewModelListeners() { - this.subscribeToEvent('nodeDiscovered', (data) => { - this.addOrUpdateNode(data.node); - }); - - this.subscribeToEvent('nodeLost', (data) => { - this.removeNode(data.node.ip); - }); - - this.subscribeToEvent('status', (data) => { - // Update UI to reflect current server state - if (data.data.nodes) { - this.nodes = data.data.nodes; - this.currentTarget = data.data.currentTarget; - this.renderNodeList(); - } - }); - } - - async loadNodes() { - try { - const response = await fetch('/api/nodes'); - const data = await response.json(); - - this.nodes = data.nodes || []; - this.renderNodeList(); - - } catch (error) { - console.error('Error loading nodes:', error); - this.showError('Failed to load nodes'); - } - } - - startPeriodicRefresh() { - // Refresh node list every 5 seconds - setInterval(() => { - this.loadNodes(); - }, 5000); - } - - addOrUpdateNode(node) { - const existingIndex = this.nodes.findIndex(n => n.ip === node.ip); - - if (existingIndex >= 0) { - // Update existing node - this.nodes[existingIndex] = { ...node, lastSeen: Date.now() }; - } else { - // Add new node - this.nodes.push({ ...node, lastSeen: Date.now() }); - } - - this.renderNodeList(); - } - - removeNode(nodeIp) { - this.nodes = this.nodes.filter(node => node.ip !== nodeIp); - this.renderNodeList(); - } - - renderNodeList() { - const nodeListContainer = this.findElement('#node-list'); - if (!nodeListContainer) return; - - if (this.nodes.length === 0) { - nodeListContainer.innerHTML = '
    No nodes discovered
    '; - return; - } - - const html = this.nodes.map(node => ` -
    -
    -
    -
    ${this.escapeHtml(node.ip === 'broadcast' ? 'Broadcast' : node.ip)}
    -
    ${node.status} • Port ${node.port}
    -
    -
    - `).join(''); - - nodeListContainer.innerHTML = html; - - // Add click handlers for node selection - this.nodes.forEach(node => { - const nodeElement = nodeListContainer.querySelector(`[data-ip="${node.ip}"]`); - if (nodeElement) { - this.addEventListener(nodeElement, 'click', () => { - this.selectNode(node.ip); - }); - } - }); - } - - selectNode(nodeIp) { - this.currentTarget = nodeIp; - this.viewModel.publish('selectNode', { nodeIp }); - - // Update visual selection - const nodeListContainer = this.findElement('#node-list'); - if (nodeListContainer) { - nodeListContainer.querySelectorAll('.node-item').forEach(item => { - item.classList.remove('selected'); - }); - const selectedNode = nodeListContainer.querySelector(`[data-ip="${nodeIp}"]`); - if (selectedNode) { - selectedNode.classList.add('selected'); - } - } - } - - selectBroadcast() { - this.currentTarget = 'broadcast'; - this.viewModel.publish('selectBroadcast', {}); - - // Update visual selection - const nodeListContainer = this.findElement('#node-list'); - if (nodeListContainer) { - nodeListContainer.querySelectorAll('.node-item').forEach(item => { - item.classList.remove('selected'); - }); - const broadcastNode = nodeListContainer.querySelector(`[data-ip="broadcast"]`); - if (broadcastNode) { - broadcastNode.classList.add('selected'); - } - } - } - - showError(message) { - const nodeListContainer = this.findElement('#node-list'); - if (nodeListContainer) { - nodeListContainer.innerHTML = `
    ${this.escapeHtml(message)}
    `; - } - } - - // Public method to select broadcast (called from outside) - selectBroadcastTarget() { - this.selectBroadcast(); - } - - escapeHtml(str) { - return String(str) - .replace(/&/g, '&') - .replace(//g, '>') - .replace(/"/g, '"') - .replace(/'/g, '''); - } -} - -// Export for use in other modules -if (typeof module !== 'undefined' && module.exports) { - module.exports = NodeDiscovery; -} diff --git a/public/scripts/preset-controls.js b/public/scripts/preset-controls.js index f928283..3d48daa 100644 --- a/public/scripts/preset-controls.js +++ b/public/scripts/preset-controls.js @@ -6,6 +6,8 @@ class PresetControls extends Component { this.presets = {}; this.currentPreset = null; this.presetControls = new Map(); + this.selectedNode = null; // Track which node is currently selected + this.nodeParameters = new Map(); // Store parameters per node: nodeIp -> { presetName, parameters } } mount() { @@ -80,28 +82,36 @@ class PresetControls extends Component { } setupViewModelListeners() { - this.subscribeToEvent('streamingStarted', (data) => { - this.updateStreamingState(true, data.preset); + // Listen for node selection + this.subscribeToEvent('selectNode', (data) => { + this.selectedNode = data.nodeIp; + this.loadNodeSettings(); }); - this.subscribeToEvent('streamingStopped', () => { - this.updateStreamingState(false); + this.subscribeToEvent('streamingStarted', (data) => { + this.updateStreamingState(true, data.preset, data.nodeIp); + }); + + this.subscribeToEvent('streamingStopped', (data) => { + this.updateStreamingState(false, null, data.nodeIp); }); this.subscribeToEvent('presetParameterUpdated', (data) => { - // Update control display without triggering another update - const control = this.presetControls.get(data.parameter); - if (control) { - if (control.type === 'range') { - control.value = data.value; - const valueDisplay = control.parentElement.querySelector('.preset-value'); - if (valueDisplay) { - valueDisplay.textContent = parseFloat(data.value).toFixed(2); + // Only update if this is for the currently selected node + if (data.nodeIp === this.selectedNode) { + const control = this.presetControls.get(data.parameter); + if (control) { + if (control.type === 'range') { + control.value = data.value; + const valueDisplay = control.parentElement.querySelector('.preset-value'); + if (valueDisplay) { + valueDisplay.textContent = parseFloat(data.value).toFixed(2); + } + } else if (control.type === 'color') { + control.value = this.hexToColorValue(data.value); + } else { + control.value = data.value; } - } else if (control.type === 'color') { - control.value = this.hexToColorValue(data.value); - } else { - control.value = data.value; } } }); @@ -202,9 +212,60 @@ class PresetControls extends Component { } this.currentPreset = this.presets[presetName]; + + // Store preset selection for current node + if (this.selectedNode) { + const nodeParams = this.nodeParameters.get(this.selectedNode) || {}; + nodeParams.presetName = presetName; + this.nodeParameters.set(this.selectedNode, nodeParams); + } + this.createPresetControls(); } + loadNodeSettings() { + if (!this.selectedNode) return; + + // Get stored parameters for this node + const nodeParams = this.nodeParameters.get(this.selectedNode); + + if (nodeParams && nodeParams.presetName) { + // Load the preset and restore parameters + const presetSelect = this.findElement('#preset-select'); + if (presetSelect && presetSelect.value !== nodeParams.presetName) { + presetSelect.value = nodeParams.presetName; + this.selectPreset(nodeParams.presetName); + } + + // Restore parameter values + if (nodeParams.parameters) { + Object.entries(nodeParams.parameters).forEach(([param, value]) => { + const control = this.presetControls.get(param); + if (control) { + if (control.type === 'range') { + control.value = value; + const valueDisplay = control.parentElement.querySelector('.preset-value'); + if (valueDisplay) { + valueDisplay.textContent = parseFloat(value).toFixed(2); + } + } else if (control.type === 'color') { + control.value = this.hexToColorValue(value); + } else { + control.value = value; + } + } + }); + } + } else { + // Reset to default + const presetSelect = this.findElement('#preset-select'); + if (presetSelect) { + presetSelect.value = ''; + this.clearPresetControls(); + } + } + } + createPresetControls() { const controlsContainer = this.findElement('#preset-controls'); if (!controlsContainer) return; @@ -313,13 +374,24 @@ class PresetControls extends Component { } updatePresetParameter(parameter, value) { + // Store parameter for current node + if (this.selectedNode) { + const nodeParams = this.nodeParameters.get(this.selectedNode) || {}; + if (!nodeParams.parameters) { + nodeParams.parameters = {}; + } + nodeParams.parameters[parameter] = value; + this.nodeParameters.set(this.selectedNode, nodeParams); + } + // Send parameter update to server immediately (real-time) this.viewModel.publish('updatePresetParameter', { parameter, - value + value, + nodeIp: this.selectedNode }); - console.log(`Parameter updated: ${parameter} = ${value}`); + console.log(`Parameter updated for ${this.selectedNode}: ${parameter} = ${value}`); } clearPresetControls() { @@ -355,21 +427,39 @@ class PresetControls extends Component { return; } + if (!this.selectedNode) { + alert('Please select a node first'); + return; + } + const width = parseInt(this.findElement('#matrix-width')?.value) || 16; const height = parseInt(this.findElement('#matrix-height')?.value) || 16; + // Get current parameters for this node + const nodeParams = this.nodeParameters.get(this.selectedNode); + const parameters = nodeParams?.parameters || {}; + this.viewModel.publish('startPreset', { presetName: presetSelect.value, width, - height + height, + nodeIp: this.selectedNode, + parameters }); } stopStreaming() { - this.viewModel.publish('stopStreaming', {}); + this.viewModel.publish('stopStreaming', { + nodeIp: this.selectedNode + }); } sendTestFrame() { + if (!this.selectedNode) { + alert('Please select a node first'); + return; + } + // Create a test frame with a simple pattern in serpentine order const width = parseInt(this.findElement('#matrix-width')?.value) || 16; const height = parseInt(this.findElement('#matrix-height')?.value) || 16; @@ -390,12 +480,18 @@ class PresetControls extends Component { } } - this.viewModel.publish('broadcastToAll', { + this.viewModel.publish('sendToNode', { + nodeIp: this.selectedNode, message: frameData }); } clearMatrix() { + if (!this.selectedNode) { + alert('Please select a node first'); + return; + } + // Send a frame with all black pixels in serpentine order const width = parseInt(this.findElement('#matrix-width')?.value) || 16; const height = parseInt(this.findElement('#matrix-height')?.value) || 16; @@ -411,7 +507,8 @@ class PresetControls extends Component { } } - this.viewModel.publish('broadcastToAll', { + this.viewModel.publish('sendToNode', { + nodeIp: this.selectedNode, message: frameData }); } @@ -425,7 +522,12 @@ class PresetControls extends Component { } } - updateStreamingState(isStreaming, preset) { + updateStreamingState(isStreaming, preset, nodeIp) { + // Only update UI if this is for the currently selected node + if (nodeIp !== this.selectedNode && nodeIp !== null) { + return; + } + const toggleBtn = this.findElement('#toggle-stream-btn'); const btnIcon = toggleBtn?.querySelector('.btn-icon'); const btnText = toggleBtn?.querySelector('.btn-text'); diff --git a/public/styles/main.css b/public/styles/main.css index c861c68..2aa9523 100644 --- a/public/styles/main.css +++ b/public/styles/main.css @@ -146,10 +146,10 @@ body { } .nav-tab.active { - background: var(--bg-tertiary); - border: 1px solid var(--accent-primary); + background: rgba(255, 255, 255, 0.15); color: var(--text-primary); - box-shadow: 0 4px 12px rgba(74, 222, 128, 0.2); + box-shadow: 0 4px 20px rgba(255, 255, 255, 0.1); + transform: translateY(-1px); } .nav-right { @@ -207,12 +207,152 @@ body { .ledlab-main { display: flex; flex: 1; - gap: 1.5rem; + position: relative; overflow: hidden; min-height: 0; } -/* Matrix display section */ +/* Matrix Grid Section - Full Width */ +.matrix-grid-section { + flex: 1; + background: var(--bg-secondary); + border-radius: 16px; + border: 1px solid var(--border-primary); + padding: 1.5rem; + display: flex; + flex-direction: column; + min-height: 0; + box-shadow: var(--shadow-primary); + backdrop-filter: var(--backdrop-blur); +} + +.matrix-grid-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 1rem; +} + +.matrix-grid-controls { + display: flex; + gap: 0.5rem; + align-items: center; +} + +/* Node Canvas Grid */ +.node-canvas-grid { + flex: 1; + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + grid-auto-rows: minmax(min(200px, calc((100vh - 10rem) / 3)), max(200px, calc((100vh - 10rem) / 2))); + gap: 0.75rem; + overflow-y: auto; + overflow-x: hidden; + padding: 0.5rem; + align-items: stretch; +} + +.node-canvas-item { + background: var(--matrix-bg); + border-radius: 12px; + border: 2px solid var(--border-secondary); + padding: 0.75rem; + display: flex; + flex-direction: column; + cursor: pointer; + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); + height: 100%; + position: relative; + overflow: hidden; +} + +.node-canvas-item:hover { + border-color: var(--border-hover); + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3); + transform: translateY(-2px); +} + +.node-canvas-item.selected { + border-color: var(--accent-primary); + box-shadow: 0 0 0 3px rgba(74, 222, 128, 0.2), 0 8px 24px rgba(0, 0, 0, 0.4); + transform: translateY(-2px); +} + +.node-canvas-item.streaming { + border-color: var(--accent-primary); +} + +.node-canvas-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 0.5rem; + padding-bottom: 0.375rem; + border-bottom: 1px solid var(--border-primary); + flex-shrink: 0; +} + +.node-canvas-title { + display: flex; + align-items: center; + gap: 0.375rem; +} + +.node-canvas-ip { + font-size: 0.8rem; + font-weight: 600; + color: var(--text-primary); + font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace; +} + +.node-canvas-status { + font-size: 0.6rem; + padding: 0.2rem 0.4rem; + border-radius: 6px; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.05em; +} + +.node-canvas-status.connected { + background: rgba(34, 197, 94, 0.15); + color: var(--node-connected); + border: 1px solid rgba(34, 197, 94, 0.3); +} + +.node-canvas-status.streaming { + background: rgba(74, 222, 128, 0.15); + color: var(--accent-primary); + border: 1px solid rgba(74, 222, 128, 0.3); + animation: pulse-glow 2s ease-in-out infinite; +} + +.node-canvas-container { + flex: 1; + display: flex; + align-items: center; + justify-content: center; + background: var(--matrix-bg); + border-radius: 8px; + position: relative; + overflow: hidden; + min-height: 0; + width: 100%; + height: 100%; +} + +.node-canvas { + image-rendering: pixelated; + image-rendering: -moz-crisp-edges; + image-rendering: crisp-edges; + width: 100%; + height: 100%; + max-width: 100%; + max-height: 100%; + object-fit: contain; +} + +/* Old Matrix display section - kept for backwards compatibility */ .matrix-section { flex: 1; background: var(--bg-secondary); @@ -310,7 +450,92 @@ body { object-fit: contain; } -/* Control panel section */ +/* Floating Control Panel */ +.floating-controls { + position: absolute; + top: 1rem; + right: 1rem; + width: 380px; + max-width: calc(100vw - 4rem); + max-height: calc(100vh - 12rem); + background: var(--bg-secondary); + border-radius: 16px; + border: 1px solid var(--border-primary); + padding: 0; + display: flex; + flex-direction: column; + overflow: hidden; + box-shadow: 0 12px 48px rgba(0, 0, 0, 0.6); + backdrop-filter: var(--backdrop-blur); + z-index: 100; + animation: slideInFromRight 0.3s cubic-bezier(0.4, 0, 0.2, 1); +} + +@keyframes slideInFromRight { + from { + opacity: 0; + transform: translateX(20px); + } + to { + opacity: 1; + transform: translateX(0); + } +} + +.floating-controls-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 1.25rem 1.5rem; + border-bottom: 1px solid var(--border-primary); + background: var(--bg-tertiary); +} + +.control-title { + font-size: 1rem; + font-weight: 600; + color: var(--text-primary); + display: flex; + align-items: center; + gap: 0.75rem; + margin: 0; +} + +.control-title .node-indicator { + width: 10px; + height: 10px; + border-radius: 50%; + background: var(--node-connected); + display: inline-block; +} + +.btn-close { + background: transparent; + border: none; + color: var(--text-secondary); + font-size: 1.25rem; + cursor: pointer; + padding: 0.25rem 0.5rem; + border-radius: 6px; + transition: all 0.2s ease; + line-height: 1; +} + +.btn-close:hover { + background: var(--bg-hover); + color: var(--text-primary); +} + +.floating-controls-content { + flex: 1; + overflow-y: auto; + padding: 1.5rem; + display: flex; + flex-direction: column; + gap: 1.5rem; +} + +/* Old Control panel section - kept for backwards compatibility */ .control-section { width: 380px; min-width: 320px; @@ -358,6 +583,24 @@ body { border-radius: 2px; } +.control-group-subtitle { + font-size: 0.875rem; + font-weight: 600; + color: var(--text-primary); + margin-bottom: 0.75rem; + display: flex; + align-items: center; + gap: 0.5rem; +} + +.control-group-subtitle::before { + content: ''; + width: 3px; + height: 14px; + background: var(--accent-primary); + border-radius: 2px; +} + /* Node list */ .node-controls { margin-bottom: 1rem; @@ -819,34 +1062,121 @@ body { } /* Scrollbar styling */ -.control-section::-webkit-scrollbar { +.control-section::-webkit-scrollbar, +.floating-controls-content::-webkit-scrollbar, +.node-canvas-grid::-webkit-scrollbar { width: 6px; } -.control-section::-webkit-scrollbar-track { +.control-section::-webkit-scrollbar-track, +.floating-controls-content::-webkit-scrollbar-track, +.node-canvas-grid::-webkit-scrollbar-track { background: var(--bg-tertiary); border-radius: 3px; } -.control-section::-webkit-scrollbar-thumb { +.control-section::-webkit-scrollbar-thumb, +.floating-controls-content::-webkit-scrollbar-thumb, +.node-canvas-grid::-webkit-scrollbar-thumb { background: var(--border-primary); border-radius: 3px; } -.control-section::-webkit-scrollbar-thumb:hover { +.control-section::-webkit-scrollbar-thumb:hover, +.floating-controls-content::-webkit-scrollbar-thumb:hover, +.node-canvas-grid::-webkit-scrollbar-thumb:hover { background: var(--text-tertiary); } /* Responsive adjustments */ +@media (min-width: 1600px) { + .node-canvas-grid { + grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); + grid-auto-rows: minmax(220px, 1fr); + } +} + +@media (max-width: 1400px) { + .node-canvas-grid { + grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); + grid-auto-rows: minmax(180px, 1fr); + } +} + +@media (max-width: 1200px) { + .node-canvas-grid { + grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); + grid-auto-rows: minmax(min(160px, calc((100vh - 8rem) / 3)), max(160px, calc((100vh - 8rem) / 2))); + gap: 0.5rem; + } + + .node-canvas-item { + padding: 0.625rem; + } + + .node-canvas-ip { + font-size: 0.75rem; + } +} + @media (max-width: 768px) { .container { - padding: 0 1rem; - gap: 1rem; + padding: 0 0.5rem; + gap: 0.5rem; } .ledlab-main { flex-direction: column; - gap: 1rem; + gap: 0.5rem; + } + + .node-canvas-grid { + grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); + grid-auto-rows: minmax(min(140px, calc((100vh - 7rem) / 3)), max(140px, calc((100vh - 7rem) / 2))); + gap: 0.5rem; + padding: 0.25rem; + } + + .node-canvas-item { + padding: 0.5rem; + } + + .node-canvas-header { + margin-bottom: 0.375rem; + padding-bottom: 0.25rem; + } + + .node-canvas-ip { + font-size: 0.7rem; + } + + .node-canvas-status { + font-size: 0.55rem; + padding: 0.15rem 0.35rem; + } + + .floating-controls { + position: fixed; + top: auto; + bottom: 0; + right: 0; + left: 0; + width: 100%; + max-width: 100%; + max-height: 70vh; + border-radius: 16px 16px 0 0; + animation: slideInFromBottom 0.3s cubic-bezier(0.4, 0, 0.2, 1); + } + + @keyframes slideInFromBottom { + from { + opacity: 0; + transform: translateY(20px); + } + to { + opacity: 1; + transform: translateY(0); + } } .control-section { diff --git a/server/index.js b/server/index.js index 4fc8d05..fe27855 100644 --- a/server/index.js +++ b/server/index.js @@ -24,14 +24,16 @@ class LEDLabServer { this.udpDiscovery = new UdpDiscovery(this.udpPort); this.presetRegistry = new PresetRegistry(); + // Legacy single-stream support (kept for backwards compatibility) this.currentPreset = null; this.currentPresetName = null; this.streamingInterval = null; this.connectedClients = new Set(); - // Per-node configurations and current target + // Multi-node streaming support + this.nodeStreams = new Map(); // ip -> {preset, presetName, interval, matrixSize, parameters} this.nodeConfigurations = new Map(); // ip -> {presetName, parameters, matrixSize} - this.currentTarget = null; // 'broadcast' or specific IP + this.currentTarget = null; // Currently selected node IP this.setupExpress(); this.setupWebSocket(); @@ -85,7 +87,7 @@ class LEDLabServer { }); // Save updated configuration for current target - if (this.currentTarget && this.currentTarget !== 'broadcast') { + if (this.currentTarget) { this.saveCurrentConfiguration(this.currentTarget); } @@ -136,15 +138,15 @@ class LEDLabServer { handleWebSocketMessage(ws, data) { switch (data.type) { case 'startPreset': - this.startPreset(data.presetName, data.width, data.height); + this.startPreset(data.presetName, data.width, data.height, data.nodeIp, data.parameters); break; case 'stopStreaming': - this.stopStreaming(); + this.stopStreaming(data.nodeIp); break; case 'updatePresetParameter': - this.updatePresetParameter(data.parameter, data.value); + this.updatePresetParameter(data.parameter, data.value, data.nodeIp); break; case 'setMatrixSize': @@ -155,18 +157,10 @@ class LEDLabServer { this.selectNode(data.nodeIp); break; - case 'selectBroadcast': - this.selectBroadcast(); - break; - case 'sendToNode': this.sendToSpecificNode(data.nodeIp, data.message); break; - case 'broadcastToAll': - this.broadcastToAllNodes(data.message); - break; - case 'updateFrameRate': this.updateFrameRate(data.fps); break; @@ -199,34 +193,66 @@ class LEDLabServer { } setupPresetManager() { - // Start with no active preset + // Start with no active presets this.currentPreset = null; + this.nodeStreams.clear(); } - startPreset(presetName, width = this.matrixWidth, height = this.matrixHeight) { + startPreset(presetName, width = this.matrixWidth, height = this.matrixHeight, nodeIp = null, parameters = null) { try { - // Stop current streaming if active - if (this.currentPreset) { - this.stopStreaming(); + const targetIp = nodeIp || this.currentTarget; + + if (!targetIp) { + console.warn('No target specified for streaming'); + return; } + // Stop current streaming for this node if active + this.stopStreaming(targetIp); + // Create new preset instance - this.currentPreset = this.presetRegistry.createPreset(presetName, width, height); - this.currentPresetName = presetName; // Store the registry key - this.currentPreset.start(); + const preset = this.presetRegistry.createPreset(presetName, width, height); + preset.start(); - console.log(`Started preset: ${presetName} (${width}x${height})`); + // Apply parameters if provided + if (parameters) { + Object.entries(parameters).forEach(([param, value]) => { + preset.setParameter(param, value); + }); + } - // Start streaming interval + console.log(`Started preset: ${presetName} (${width}x${height}) for ${targetIp}`); + + // Start streaming interval for this node const intervalMs = Math.floor(1000 / this.fps); - this.streamingInterval = setInterval(() => { - this.streamFrame(); + const interval = setInterval(() => { + this.streamFrameForNode(targetIp); }, intervalMs); + // Store stream information + this.nodeStreams.set(targetIp, { + preset, + presetName, + interval, + matrixSize: { width, height }, + parameters: preset.getParameters() + }); + + // Update legacy support + if (targetIp === this.currentTarget) { + this.currentPreset = preset; + this.currentPresetName = presetName; + this.streamingInterval = interval; + } + + // Save configuration + this.saveCurrentConfiguration(targetIp); + // Notify clients this.broadcastToClients({ type: 'streamingStarted', - preset: this.currentPreset.getMetadata() + preset: preset.getMetadata(), + nodeIp: targetIp }); // Also send updated state to keep all clients in sync @@ -234,58 +260,85 @@ class LEDLabServer { } catch (error) { console.error('Error starting preset:', error); - this.sendToClient(ws, { + this.broadcastToClients({ type: 'error', message: `Failed to start preset: ${error.message}` }); } } - stopStreaming() { - if (this.streamingInterval) { - clearInterval(this.streamingInterval); - this.streamingInterval = null; + stopStreaming(nodeIp = null) { + const targetIp = nodeIp || this.currentTarget; + + if (targetIp) { + this.stopNodeStream(targetIp); + } else { + // Legacy: stop current streaming + if (this.streamingInterval) { + clearInterval(this.streamingInterval); + this.streamingInterval = null; + } + + if (this.currentPreset) { + this.currentPreset.stop(); + this.currentPreset = null; + this.currentPresetName = null; + } } - if (this.currentPreset) { - this.currentPreset.stop(); - this.currentPreset = null; - this.currentPresetName = null; - } - - console.log('Streaming stopped'); + console.log(`Streaming stopped for ${targetIp || 'current target'}`); this.broadcastToClients({ - type: 'streamingStopped' + type: 'streamingStopped', + nodeIp: targetIp }); - // Save current configuration for the current target if it exists - if (this.currentTarget && this.currentTarget !== 'broadcast') { - this.saveCurrentConfiguration(this.currentTarget); - } - // Also send updated state to keep all clients in sync this.broadcastCurrentState(); } - updatePresetParameter(parameter, value) { - if (this.currentPreset) { - this.currentPreset.setParameter(parameter, value); + stopNodeStream(nodeIp) { + const stream = this.nodeStreams.get(nodeIp); + if (stream) { + clearInterval(stream.interval); + stream.preset.stop(); + this.nodeStreams.delete(nodeIp); - this.broadcastToClients({ + // Update legacy support if this was the current target + if (nodeIp === this.currentTarget) { + this.currentPreset = null; + this.currentPresetName = null; + this.streamingInterval = null; + } + } + } + + updatePresetParameter(parameter, value, nodeIp = null) { + const targetIp = nodeIp || this.currentTarget; + + if (targetIp) { + const stream = this.nodeStreams.get(targetIp); + if (stream) { + stream.preset.setParameter(parameter, value); + stream.parameters = stream.preset.getParameters(); + this.saveCurrentConfiguration(targetIp); + } + } + + // Legacy support + if (this.currentPreset && targetIp === this.currentTarget) { + this.currentPreset.setParameter(parameter, value); + } + + this.broadcastToClients({ type: 'presetParameterUpdated', parameter, - value - }); + value, + nodeIp: targetIp + }); - // Save updated configuration for current target - if (this.currentTarget && this.currentTarget !== 'broadcast') { - this.saveCurrentConfiguration(this.currentTarget); - } - - // Don't broadcast full state on every parameter change to avoid UI flickering - // State is already updated via presetParameterUpdated event - } + // Don't broadcast full state on every parameter change to avoid UI flickering + // State is already updated via presetParameterUpdated event } setMatrixSize(width, height) { @@ -303,7 +356,7 @@ class LEDLabServer { }); // Save updated configuration for current target - if (this.currentTarget && this.currentTarget !== 'broadcast') { + if (this.currentTarget) { this.saveCurrentConfiguration(this.currentTarget); } } @@ -316,10 +369,8 @@ class LEDLabServer { const frameData = this.currentPreset.generateFrame(); if (frameData) { - // Send to specific target or broadcast - if (this.currentTarget === 'broadcast') { - this.udpDiscovery.broadcastToAll(frameData); - } else if (this.currentTarget) { + // Send to specific target + if (this.currentTarget) { this.udpDiscovery.sendToNode(this.currentTarget, frameData); } @@ -332,12 +383,29 @@ class LEDLabServer { } } - sendToSpecificNode(nodeIp, message) { - return this.udpDiscovery.sendToNode(nodeIp, message); + streamFrameForNode(nodeIp) { + const stream = this.nodeStreams.get(nodeIp); + if (!stream || !stream.preset) { + return; + } + + const frameData = stream.preset.generateFrame(); + if (frameData) { + // Send to specific node + this.udpDiscovery.sendToNode(nodeIp, frameData); + + // Send frame data to WebSocket clients for preview + this.broadcastToClients({ + type: 'frame', + data: frameData, + nodeIp: nodeIp, + timestamp: Date.now() + }); + } } - broadcastToAllNodes(message) { - return this.udpDiscovery.broadcastToAll(message); + sendToSpecificNode(nodeIp, message) { + return this.udpDiscovery.sendToNode(nodeIp, message); } broadcastCurrentState() { @@ -366,10 +434,21 @@ class LEDLabServer { this.fps = fps; console.log(`Frame rate updated to ${fps} FPS`); - // If streaming is active, restart the interval with new frame rate + const intervalMs = Math.floor(1000 / this.fps); + + // Update all active node streams + this.nodeStreams.forEach((stream, nodeIp) => { + if (stream.interval) { + clearInterval(stream.interval); + stream.interval = setInterval(() => { + this.streamFrameForNode(nodeIp); + }, intervalMs); + } + }); + + // Legacy: If streaming is active, restart the interval with new frame rate if (this.currentPreset && this.streamingInterval) { clearInterval(this.streamingInterval); - const intervalMs = Math.floor(1000 / this.fps); this.streamingInterval = setInterval(() => { this.streamFrame(); }, intervalMs); @@ -386,50 +465,54 @@ class LEDLabServer { selectNode(nodeIp) { this.currentTarget = nodeIp; - // Load configuration for this node if it exists, otherwise use current settings - const nodeConfig = this.nodeConfigurations.get(nodeIp); - if (nodeConfig) { - this.loadNodeConfiguration(nodeConfig); + // Check if this node already has an active stream + const stream = this.nodeStreams.get(nodeIp); + if (stream) { + // Node is already streaming, update legacy references + this.currentPreset = stream.preset; + this.currentPresetName = stream.presetName; + this.matrixWidth = stream.matrixSize.width; + this.matrixHeight = stream.matrixSize.height; } else { - // Save current configuration for this node - this.saveCurrentConfiguration(nodeIp); + // Load configuration for this node if it exists + const nodeConfig = this.nodeConfigurations.get(nodeIp); + if (nodeConfig) { + this.matrixWidth = nodeConfig.matrixSize.width; + this.matrixHeight = nodeConfig.matrixSize.height; + // Don't auto-start streaming, just load the configuration + } } this.broadcastCurrentState(); } - selectBroadcast() { - this.currentTarget = 'broadcast'; - this.broadcastCurrentState(); - } - saveCurrentConfiguration(nodeIp) { - if (this.currentPreset && this.currentPresetName) { + const stream = this.nodeStreams.get(nodeIp); + if (stream && stream.preset && stream.presetName) { this.nodeConfigurations.set(nodeIp, { - presetName: this.currentPresetName, // Use registry key, not display name + presetName: stream.presetName, + parameters: stream.preset.getParameters(), + matrixSize: stream.matrixSize + }); + } else if (this.currentPreset && this.currentPresetName) { + // Legacy fallback + this.nodeConfigurations.set(nodeIp, { + presetName: this.currentPresetName, parameters: this.currentPreset.getParameters(), matrixSize: { width: this.matrixWidth, height: this.matrixHeight } }); } } - loadNodeConfiguration(config) { - // Stop current streaming - this.stopStreaming(); - - // Load the node's configuration - this.matrixWidth = config.matrixSize.width; - this.matrixHeight = config.matrixSize.height; - - // Start the preset with saved parameters - this.startPreset(config.presetName, config.matrixSize.width, config.matrixSize.height); - - // Set the parameters after preset is created - if (this.currentPreset) { - Object.entries(config.parameters).forEach(([param, value]) => { - this.currentPreset.setParameter(param, value); - }); - } + loadNodeConfiguration(config, nodeIp) { + // Start the preset with saved parameters for this specific node + this.startPreset( + config.presetName, + config.matrixSize.width, + config.matrixSize.height, + nodeIp, + config.parameters + ); } broadcastToClients(message) { diff --git a/server/udp-discovery.js b/server/udp-discovery.js index 0c60eee..0fd56fc 100644 --- a/server/udp-discovery.js +++ b/server/udp-discovery.js @@ -157,15 +157,6 @@ class UdpDiscovery extends EventEmitter { ...node })); - // Add broadcast option - nodes.unshift({ - ip: 'broadcast', - status: 'broadcast', - address: '255.255.255.255', - port: this.port, - isBroadcast: true - }); - return nodes; }