Skip to content

Commit 2389afd

Browse files
author
Alberto Iannaccone
committed
open/close serial monitor
1 parent ba0f0d8 commit 2389afd

File tree

2 files changed

+46
-12
lines changed

2 files changed

+46
-12
lines changed

src/reader-writer.js

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export default class ReaderWriter {
1111
};
1212
this.messageSubject.subscribe(this.updateDevicesList.bind(this));
1313
this.openingSerial = null;
14+
this.closingSerial = null;
1415
}
1516

1617
initSocket(socket) {
@@ -63,26 +64,49 @@ export default class ReaderWriter {
6364
let checkOpen = null;
6465
this.openingSerial = new Promise((resolve, reject) => {
6566
checkOpen = message => {
66-
let data = null;
67-
try {
68-
data = JSON.parse(message);
69-
}
70-
catch (SyntaxError) {
71-
return;
72-
}
73-
if (data.Cmd === 'Open') {
67+
if (message.Cmd === 'Open') {
7468
return resolve();
7569
}
76-
if (data.Cmd === 'OpenFail') {
70+
if (message.Cmd === 'OpenFail') {
7771
return reject(new Error('Failed to open serial'));
7872
}
7973
};
80-
this.messageSubject.subscribe(checkOpen);
74+
this.openSubscription = this.messageSubject.subscribe(checkOpen);
8175
}).finally(() => {
76+
this.openSubscription.unsubscribe();
8277
this.openingSerial = null;
8378
});
8479
this.socket.emit('command', `open ${port} 9600 timed`);
8580
return this.openingSerial;
8681
}
8782

83+
closeSerialMonitor(port) {
84+
if (this.closingSerial) {
85+
return this.closingSerial;
86+
}
87+
const serialPort = this.devicesList.serial.find(p => p.Name === port);
88+
if (!serialPort) {
89+
return Promise.reject(new Error('No board found'));
90+
}
91+
if (!serialPort.IsOpen) {
92+
return Promise.resolve();
93+
}
94+
let checkClosed = null;
95+
this.closingSerial = new Promise((resolve, reject) => {
96+
checkClosed = message => {
97+
if (message.Cmd === 'Close') {
98+
return resolve();
99+
}
100+
if (message.Cmd === 'CloseFail') {
101+
return reject(new Error('Failed to close serial'));
102+
}
103+
};
104+
this.closeSubscription = this.messageSubject.subscribe(checkClosed);
105+
}).finally(() => {
106+
this.closeSubscription.unsubscribe();
107+
this.closingSerial = null;
108+
});
109+
this.socket.emit('command', `close ${port}`);
110+
return this.closingSerial;
111+
}
88112
}

test/app.jsx

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,16 @@ import React from 'react';
22
import Daemon from '../src';
33
import { WS_STATUS_CONNECTED, AGENT_STATUS_FOUND } from '../src/socket-daemon';
44

5+
const handleOpen = (e, port) => {
6+
e.preventDefault();
7+
Daemon.readerWriter.openSerialMonitor(port);
8+
};
9+
10+
const handleClose = (e, port) => {
11+
e.preventDefault();
12+
Daemon.readerWriter.closeSerialMonitor(port);
13+
};
14+
515
class App extends React.Component {
616
constructor() {
717
super();
@@ -53,8 +63,8 @@ class App extends React.Component {
5363
}
5464

5565
render() {
56-
const listSerialDevices = this.state.serialDevices.map(device => <li>{device.Name}</li>);
57-
const listNetworkDevices = this.state.networkDevices.map(device => <li>{device.Name}</li>);
66+
const listSerialDevices = this.state.serialDevices.map((device, i) => (<li key={i}>{device.Name} - IsOpen: {device.IsOpen ? 'true' : 'false'} - <a href="#" onClick={(e) => handleOpen(e, device.Name)}>open</a> - <a href="#" onClick={(e) => handleClose(e, device.Name)}>close</a></li>));
67+
const listNetworkDevices = this.state.networkDevices.map((device, i) => <li key={i}>{device.Name}</li>);
5868

5969
return (
6070
<div>

0 commit comments

Comments
 (0)