dreamstack/devices/panel-preview/test-hub.js

97 lines
3.1 KiB
JavaScript
Raw Normal View History

#!/usr/bin/env node
/**
* Test script simulates a hub sending signals to the relay bridge.
*
* Usage:
* 1. Start relay: node relay-bridge.js
* 2. Open browser: http://localhost:9876/index.html?ws=ws://localhost:9201
* 3. Run this: node test-hub.js
*
* This will:
* 1. Push IR JSON (from app.ir.json) via UDP
* 2. Send signal updates every 250ms
* 3. Listen for panel events (action/touch)
*/
const dgram = require('dgram');
const fs = require('fs');
const path = require('path');
const UDP_PORT = 9200;
const client = dgram.createSocket('udp4');
// ─── Push IR JSON ───
const irPath = path.join(__dirname, 'app.ir.json');
if (fs.existsSync(irPath)) {
const json = fs.readFileSync(irPath, 'utf8');
const data = Buffer.from(json);
// Build IR push frame: [D5][7A][40][00][len:u16LE][json...]
const header = Buffer.alloc(6);
header[0] = 0xD5; // magic
header[1] = 0x7A; // magic
header[2] = 0x40; // DS_UDP_IR_PUSH
header[3] = 0x00; // reserved
header.writeUInt16LE(data.length, 4);
const frame = Buffer.concat([header, data]);
client.send(frame, 0, frame.length, UDP_PORT, '127.0.0.1', () => {
console.log(`[Hub] IR pushed (${data.length} bytes)`);
});
} else {
console.log('[Hub] No app.ir.json found, skipping IR push');
}
// ─── Send periodic signal updates ───
let tick = 0;
setInterval(() => {
tick++;
// Signal 6 (ticks) — increment every second
if (tick % 4 === 0) {
const sigFrame = Buffer.alloc(7);
sigFrame[0] = 0x20; // DS_NOW_SIG
sigFrame.writeUInt16LE(6, 1); // signal_id = 6
sigFrame.writeInt32LE(Math.floor(tick / 4), 3); // value = seconds
client.send(sigFrame, 0, 7, UDP_PORT, '127.0.0.1');
}
// Signal 2 (score) — increment every 10 ticks
if (tick % 40 === 0) {
const sigFrame = Buffer.alloc(7);
sigFrame[0] = 0x20;
sigFrame.writeUInt16LE(2, 1); // signal_id = 2 (score)
sigFrame.writeInt32LE(Math.floor(tick / 40), 3);
client.send(sigFrame, 0, 7, UDP_PORT, '127.0.0.1');
console.log(`[Hub] Score → ${Math.floor(tick / 40)}`);
}
// Batch update: signals 0,1 (head position) every 250ms
if (tick % 1 === 0) {
const batchFrame = Buffer.alloc(3 + 2 * 6); // 2 entries
batchFrame[0] = 0x21; // DS_NOW_SIG_BATCH
batchFrame[1] = 2; // count
batchFrame[2] = tick & 0xFF; // seq
// Signal 0 (headX)
batchFrame.writeUInt16LE(0, 3);
batchFrame.writeInt32LE(4 + (tick % 8), 5);
// Signal 1 (headY)
batchFrame.writeUInt16LE(1, 9);
batchFrame.writeInt32LE(4, 11);
client.send(batchFrame, 0, batchFrame.length, UDP_PORT, '127.0.0.1');
}
}, 250);
// ─── Listen for events from panel/browser ───
const listener = dgram.createSocket('udp4');
// Note: relay bridge sends events back to the source address,
// so we'd need to be listening on the same port. For testing,
// the relay bridge console logs will show events.
console.log('[Hub] Sending signals every 250ms...');
console.log('[Hub] Press Ctrl+C to stop');