97 lines
3.1 KiB
JavaScript
97 lines
3.1 KiB
JavaScript
|
|
#!/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');
|