|
20 | 20 | * SOFTWARE. |
21 | 21 | */ |
22 | 22 |
|
23 | | -const EventEmitter = require("events"); |
24 | | -const DAPjs = require("../../"); |
| 23 | +const DAPjs = require('../../'); |
25 | 24 |
|
26 | | -const inputEmitter = new EventEmitter(); |
27 | | -process.stdin.setRawMode(true); |
28 | | -process.stdin.setEncoding("utf8"); |
29 | | -process.stdin.on("readable", () => { |
30 | | - let input; |
31 | | - while (input = process.stdin.read()) { |
32 | | - if (input !== null) { |
33 | | - inputEmitter.emit("input", input); |
| 25 | +// Handle single character input from the user |
| 26 | +const readHandler = (inputHandler, stream = process.stdin) => { |
| 27 | + return new Promise(resolve => { |
| 28 | + stream.setRawMode(true); |
| 29 | + stream.setEncoding('utf8'); |
| 30 | + |
| 31 | + const onResolve = result => { |
| 32 | + stream.off('readable', read); |
| 33 | + stream.setRawMode(false); |
| 34 | + resolve(result); |
| 35 | + } |
| 36 | + |
| 37 | + const read = () => { |
| 38 | + let input; |
| 39 | + while (input = stream.read()) { |
| 40 | + inputHandler(input, onResolve); |
| 41 | + } |
34 | 42 | } |
| 43 | + |
| 44 | + stream.on('readable', read); |
| 45 | + }); |
| 46 | +} |
| 47 | + |
| 48 | +// Select a device from the list |
| 49 | +const selectDevice = async (devices) => { |
| 50 | + if (devices.length === 0) { |
| 51 | + throw new Error('No devices found'); |
35 | 52 | } |
36 | | -}); |
| 53 | + |
| 54 | + console.log('Select a device to listen to serial output:'); |
| 55 | + devices.forEach((device, index) => { |
| 56 | + console.log(`${index + 1}: ${device.name}`); |
| 57 | + }); |
| 58 | + |
| 59 | + const device = await readHandler((input, resolve) => { |
| 60 | + if (input === '\u0003') { |
| 61 | + process.exit(); |
| 62 | + } else if (input !== null) { |
| 63 | + let index = parseInt(input); |
| 64 | + if (index <= devices.length) { |
| 65 | + resolve(devices[index - 1]); |
| 66 | + } |
| 67 | + } |
| 68 | + }); |
| 69 | + |
| 70 | + return device; |
| 71 | +} |
37 | 72 |
|
38 | 73 | // Listen to serial output from the device |
39 | | -function listen(transport) { |
| 74 | +const listen = async transport => { |
40 | 75 | const target = new DAPjs.DAPLink(transport); |
41 | 76 |
|
| 77 | + await target.connect(); |
| 78 | + const baud = await target.getSerialBaudrate(); |
| 79 | + console.log(`Listening at ${baud} baud...`); |
| 80 | + |
42 | 81 | target.on(DAPjs.DAPLink.EVENT_SERIAL_DATA, data => { |
43 | 82 | process.stdout.write(data); |
44 | 83 | }); |
| 84 | + target.startSerialRead(); |
45 | 85 |
|
46 | | - return target.connect() |
47 | | - .then(() => { |
48 | | - return target.getSerialBaudrate(); |
49 | | - }) |
50 | | - .then(baud => { |
51 | | - target.startSerialRead(); |
52 | | - console.log(`Listening at ${baud} baud...`); |
53 | | - |
54 | | - inputEmitter.addListener("input", input => { |
55 | | - if (input === "\u0003") { |
56 | | - process.stdin.setRawMode(false); |
57 | | - target.stopSerialRead() |
58 | | - |
59 | | - return target.disconnect() |
60 | | - .then(() => { |
61 | | - process.exit(); |
62 | | - }) |
63 | | - } |
64 | | - |
65 | | - if (input !== null) { |
66 | | - target.serialWrite(input); |
67 | | - } |
68 | | - }); |
| 86 | + await readHandler((input, resolve) => { |
| 87 | + if (input === '\u0003') { |
| 88 | + resolve(); |
| 89 | + } else if (input !== null) { |
| 90 | + target.serialWrite(input); |
| 91 | + } |
69 | 92 | }); |
| 93 | + |
| 94 | + target.stopSerialRead(); |
| 95 | + await target.disconnect(); |
70 | 96 | } |
71 | 97 |
|
72 | 98 | module.exports = { |
73 | | - inputEmitter: inputEmitter, |
74 | | - listen: listen |
| 99 | + DAPLINK_VENDOR: 0xD28, |
| 100 | + selectDevice, |
| 101 | + listen |
75 | 102 | }; |
0 commit comments