const dgram = require('dgram'); const host = process.argv[2]; const port = parseInt(process.argv[3] || '4210', 10); const pixels = parseInt(process.argv[4] || '64', 10); const speed = parseFloat(process.argv[5] || '0.5'); // cycles per second if (!host) { console.error('Usage: node fade-green-blue.js [port] [pixels] [speed-hz]'); process.exit(1); } const socket = dgram.createSocket('udp4'); const intervalMs = 50; let tick = 0; const isBroadcast = host === '255.255.255.255' || host.endsWith('.255'); function generateFrame() { const timeSeconds = (tick * intervalMs) / 1000; const phase = timeSeconds * speed * Math.PI * 2; const blend = (Math.sin(phase) + 1) * 0.5; // 0..1 const green = Math.round(255 * (1 - blend)); const blue = Math.round(255 * blend); let payload = 'RAW:'; const gHex = green.toString(16).padStart(2, '0'); const bHex = blue.toString(16).padStart(2, '0'); for (let i = 0; i < pixels; i++) { payload += '00'; payload += gHex; payload += bHex; } return payload; } function sendFrame() { const payload = generateFrame(); const message = Buffer.from(payload, 'utf8'); socket.send(message, port, host); tick += 1; } setInterval(sendFrame, intervalMs); if (isBroadcast) { socket.bind(() => { socket.setBroadcast(true); }); } console.log(`Streaming green/blue fade to ${host}:${port} with ${pixels} pixels (speed=${speed}Hz)`);