56 lines
1.4 KiB
JavaScript
56 lines
1.4 KiB
JavaScript
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 <device-ip> [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)`);
|
|
|