upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
path: root/tests/helpers/serial.mjs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/helpers/serial.mjs')
-rw-r--r--tests/helpers/serial.mjs82
1 files changed, 82 insertions, 0 deletions
diff --git a/tests/helpers/serial.mjs b/tests/helpers/serial.mjs
new file mode 100644
index 0000000..306b552
--- /dev/null
+++ b/tests/helpers/serial.mjs
@@ -0,0 +1,82 @@
1import { SerialPort } from 'serialport';
2import { ReadlineParser } from '@serialport/parser-readline';
3import { execSync } from 'child_process';
4
5const DEFAULT_BAUD = 115200;
6const BOOT_TIMEOUT = 30000;
7
8export async function execSerial(portPath, command, timeoutMs = 5000) {
9 return new Promise((resolve, reject) => {
10 const port = new SerialPort({ path: portPath, baudRate: DEFAULT_BAUD });
11 const parser = port.pipe(new ReadlineParser());
12 const lines = [];
13 let resolved = false;
14
15 const timer = setTimeout(() => {
16 if (!resolved) { resolved = true; port.close(); resolve(lines.join('\n')); }
17 }, timeoutMs);
18
19 parser.on('data', (line) => {
20 lines.push(line);
21 if (line.includes('___END___') && !resolved) {
22 resolved = true;
23 clearTimeout(timer);
24 port.close();
25 resolve(lines.join('\n'));
26 }
27 });
28
29 port.on('open', () => {
30 port.write(command + '\n');
31 });
32
33 port.on('error', (err) => {
34 if (!resolved) { resolved = true; clearTimeout(timer); reject(err); }
35 });
36 });
37}
38
39export async function waitForBoot(portPath, timeoutMs = BOOT_TIMEOUT) {
40 return new Promise((resolve, reject) => {
41 const port = new SerialPort({ path: portPath, baudRate: DEFAULT_BAUD });
42 const parser = port.pipe(new ReadlineParser());
43 const timer = setTimeout(() => {
44 port.close();
45 reject(new Error('Boot timeout'));
46 }, timeoutMs);
47
48 parser.on('data', (line) => {
49 if (line.includes('TollGate services started') || line.includes('WiFi AP+STA started')) {
50 clearTimeout(timer);
51 setTimeout(() => { port.close(); resolve(true); }, 500);
52 }
53 });
54
55 port.on('error', (err) => {
56 clearTimeout(timer);
57 reject(err);
58 });
59 });
60}
61
62export async function readSerial(portPath, durationMs = 3000) {
63 return new Promise((resolve, reject) => {
64 const port = new SerialPort({ path: portPath, baudRate: DEFAULT_BAUD });
65 const parser = port.pipe(new ReadlineParser());
66 const lines = [];
67
68 const timer = setTimeout(() => {
69 port.close();
70 resolve(lines.join('\n'));
71 }, durationMs);
72
73 parser.on('data', (line) => lines.push(line));
74 port.on('error', (err) => { clearTimeout(timer); reject(err); });
75 });
76}
77
78export function resetDevice(portPath) {
79 try {
80 execSync(`python3 -m esptool --port ${portPath} run 2>/dev/null`, { timeout: 5000 });
81 } catch {}
82}