Skip to content

Commit 5376ffd

Browse files
author
Daisuke Baba
committed
Improve peripheral connection strategy
1 parent a50b7c6 commit 5376ffd

File tree

1 file changed

+27
-17
lines changed

1 file changed

+27
-17
lines changed

src/generic-ble.js

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -277,27 +277,36 @@ export default function(RED) {
277277
this.emit('disconnected');
278278
return Promise.resolve();
279279
}
280+
let connecting = (peripheral.state === 'connecting');
280281
switch (peripheral.state) {
281282
case 'disconnected': {
282283
this.emit('disconnected');
283-
peripheral.once('disconnect', () => {
284-
this.emit('disconnected');
285-
});
286-
peripheral._disconnectedHandlerSet = true;
287-
peripheral.once('connect', () => {
288-
peripheral.discoverAllServicesAndCharacteristics(
289-
(err, services) => {
290-
if (err) {
291-
this.log(`<discoverAllServicesAndCharacteristics> error:${err.message}`);
292-
return;
293-
}
294-
this.emit('connected');
295-
this.characteristics = services.reduce((prev, curr) => {
296-
return prev.concat(curr.characteristics);
297-
}, []).map((c) => toCharacteristic(c));
284+
if (!peripheral._disconnectedHandlerSet) {
285+
peripheral._disconnectedHandlerSet = true;
286+
peripheral.once('disconnect', () => {
287+
this.emit('disconnected');
288+
peripheral._disconnectedHandlerSet = false;
298289
});
299-
});
290+
}
291+
if (!peripheral._connectHandlerSet) {
292+
peripheral._connectHandlerSet = true;
293+
peripheral.once('connect', () => {
294+
peripheral._connectHandlerSet = false;
295+
peripheral.discoverAllServicesAndCharacteristics(
296+
(err, services) => {
297+
if (err) {
298+
this.log(`<discoverAllServicesAndCharacteristics> error:${err.message}`);
299+
return;
300+
}
301+
this.emit('connected');
302+
this.characteristics = services.reduce((prev, curr) => {
303+
return prev.concat(curr.characteristics);
304+
}, []).map((c) => toCharacteristic(c));
305+
});
306+
});
307+
}
300308
peripheral.connect(); // peripheral.state => connecting
309+
connecting = true;
301310
break;
302311
}
303312
case 'connected': {
@@ -310,6 +319,7 @@ export default function(RED) {
310319
peripheral._disconnectedHandlerSet = true;
311320
peripheral.once('disconnect', () => {
312321
this.emit('disconnected');
322+
peripheral._disconnectedHandlerSet = false;
313323
});
314324
}
315325
this.emit('connected');
@@ -319,7 +329,7 @@ export default function(RED) {
319329
break;
320330
}
321331
}
322-
if (peripheral.state === 'connecting') {
332+
if (connecting) {
323333
return new Promise((resolve) => {
324334
let retry = 0;
325335
let connectedHandler = () => {

0 commit comments

Comments
 (0)