diff --git a/src/extensions/scratch3_wedo2/index.js b/src/extensions/scratch3_wedo2/index.js index 0fc01e2c304..a158269e5fc 100644 --- a/src/extensions/scratch3_wedo2/index.js +++ b/src/extensions/scratch3_wedo2/index.js @@ -460,9 +460,8 @@ class WeDo2 { // TODO: rename scan? startDeviceScan () { this._ble = new BLESession(this._runtime, { - filters: [ - {services: [UUID.DEVICE_SERVICE, UUID.IO_SERVICE]} - ] + filters: [{services: [UUID.DEVICE_SERVICE]}], + optionalServices: [UUID.IO_SERVICE] }, this._onConnect); } @@ -517,6 +516,10 @@ class WeDo2 { }) .then(() => { // register for attached io notifications + // TODO: make backwards compatible with 'read': + // - try 'startNotifications' + // - then try 'read' with 'startNotifications' flag + // - then catch OSX and Windows errors this._ble.startNotifications(UUID.DEVICE_SERVICE, UUID.ATTACHED_IO, this._onMessage); }); } @@ -626,6 +629,10 @@ class WeDo2 { this._send(UUID.INPUT_COMMAND, Base64Util.uint8ArrayToBase64(cmd)) .then(() => { + // TODO: make backwards compatible with 'read': + // - try 'startNotifications' + // - then try 'read' with 'startNotifications' flag + // - then catch OSX and Windows errors this._ble.startNotifications(UUID.IO_SERVICE, UUID.INPUT_VALUES, this._onMessage); }); } diff --git a/src/io/bleSession.js b/src/io/bleSession.js index d2d053121a9..b44c314f70f 100644 --- a/src/io/bleSession.js +++ b/src/io/bleSession.js @@ -1,5 +1,5 @@ const JSONRPCWebSocket = require('../util/jsonrpc-web-socket'); -const log = require('../util/log'); +// const log = require('../util/log'); const ScratchLinkWebSocket = 'wss://device-manager.scratch.mit.edu:20110/scratch/ble'; class BLESession extends JSONRPCWebSocket { @@ -115,17 +115,7 @@ class BLESession extends JSONRPCWebSocket { characteristicId }; this._characteristicDidChangeCallback = onCharacteristicChanged; - return this.sendRemoteRequest('startNotifications', params) - .catch(() => { - // backwards compatibility: try read - this.read(serviceId, characteristicId, true, onCharacteristicChanged) - .catch(e => { - // if read not allowed, send error - if (e.data !== 'Reading is not permitted.') { // OSX error TODO: Windows error? - this._sendError(e); - } - }); - }); + return this.sendRemoteRequest('startNotifications', params); } /** @@ -145,7 +135,12 @@ class BLESession extends JSONRPCWebSocket { params.startNotifications = true; } this._characteristicDidChangeCallback = onCharacteristicChanged; - return this.sendRemoteRequest('read', params); + return this.sendRemoteRequest('read', params) + .catch(e => { + if (e.data !== 'Reading is not permitted.') { // TODO: move this error check to extension + this._sendError(e); + } + }); } /** @@ -171,9 +166,9 @@ class BLESession extends JSONRPCWebSocket { }); } - _sendError (e) { + _sendError (/* e */) { this._connected = false; - log.error(`BLESession error: ${JSON.stringify(e)}`); + // log.error(`BLESession error: ${JSON.stringify(e)}`); this._runtime.emit(this._runtime.constructor.PERIPHERAL_ERROR); }