diff --git a/src/extensions/scratch3_microbit/index.js b/src/extensions/scratch3_microbit/index.js index b5775350c..ae131a431 100644 --- a/src/extensions/scratch3_microbit/index.js +++ b/src/extensions/scratch3_microbit/index.js @@ -111,20 +111,22 @@ class MicroBit { /** * @param {string} text - the text to display. + * @return {Promise} - a Promise that resolves when writing to device. */ displayText (text) { const output = new Uint8Array(text.length); for (let i = 0; i < text.length; i++) { output[i] = text.charCodeAt(i); } - this._writeSessionData(BLECommand.CMD_DISPLAY_TEXT, output); + return this._writeSessionData(BLECommand.CMD_DISPLAY_TEXT, output); } /** * @param {Uint8Array} matrix - the matrix to display. + * @return {Promise} - a Promise that resolves when writing to device. */ displayMatrix (matrix) { - this._writeSessionData(BLECommand.CMD_DISPLAY_LED, matrix); + return this._writeSessionData(BLECommand.CMD_DISPLAY_LED, matrix); } /** @@ -212,6 +214,7 @@ class MicroBit { * Write a message to the device BLE session. * @param {number} command - the BLE command hex. * @param {Uint8Array} message - the message to write. + * @return {Promise} - a Promise that resolves when writing to device. * @private */ _writeSessionData (command, message) { @@ -220,8 +223,8 @@ class MicroBit { for (let i = 0; i < message.length; i++) { output[i + 1] = message[i]; } - const b64enc = Base64Util.uint8ArrayToBase64(output); - this._ble.write(BLEUUID.service, BLEUUID.txChar, b64enc, 'base64'); + const data = Base64Util.uint8ArrayToBase64(output); + return this._ble.write(BLEUUID.service, BLEUUID.txChar, data, 'base64'); } } @@ -494,17 +497,18 @@ class Scratch3MicroBitBlocks { /** * Display text on the 5x5 LED matrix. * @param {object} args - the block's arguments. + * @return {Promise} - a Promise that resolves when writing to device. * Note the limit is 19 characters */ displayText (args) { const text = String(args.TEXT).substring(0, 19); - this._device.displayText(text); - return; + return this._device.displayText(text); } /** * Display a predefined symbol on the 5x5 LED matrix. * @param {object} args - the block's arguments. + * @return {Promise} - a Promise that resolves when writing to device. */ displaySymbol (args) { const hex = symbols2hex[args.SYMBOL]; @@ -514,8 +518,7 @@ class Scratch3MicroBitBlocks { this._device.ledMatrixState[2] = (hex >> 10) & 0x1F; this._device.ledMatrixState[3] = (hex >> 5) & 0x1F; this._device.ledMatrixState[4] = hex & 0x1F; - this._device.displayMatrix(this._device.ledMatrixState); - return; + return this._device.displayMatrix(this._device.ledMatrixState); } /** diff --git a/src/io/bleSession.js b/src/io/bleSession.js index af4f67b92..75eafe7e1 100644 --- a/src/io/bleSession.js +++ b/src/io/bleSession.js @@ -18,6 +18,7 @@ class BLESession extends JSONRPCWebSocket { this._socketPromise = new Promise((resolve, reject) => { this._ws.onopen = resolve; this._ws.onerror = this._sendError(); // TODO: socket error? + // TODO: generally handle socket disconnects as errors }); this._availablePeripherals = {}; @@ -37,18 +38,14 @@ class BLESession extends JSONRPCWebSocket { requestDevice () { // TODO: add timeout for 'no devices yet found' ? if (this._ws.readyState === 1) { + // TODO: what if discover doesn't initiate? this.sendRemoteRequest('discover', this._deviceOptions) - .catch(e => { - // TODO: what if discover doesn't initiate? - this._sendError(e); - }); + .catch(e => this._sendError(e)); } else { // Try again to connect to the websocket + // TODO: what if discover doesn't initiate? this._socketPromise(this.sendRemoteRequest('discover', this._deviceOptions)) - .catch(e => { - // TODO: what if discover doesn't initiate? - this._sendError(e); - }); + .catch(e => this._sendError(e)); } } @@ -64,7 +61,7 @@ class BLESession extends JSONRPCWebSocket { this._connectCallback(); }) .catch(e => { - // TODO: what if the peripheral loses power? + // TODO: what if the peripheral loses power? (web socket closes?) // TODO: what if tries to connect to an unknown peripheral id? this._sendError(e); }); @@ -77,8 +74,7 @@ class BLESession extends JSONRPCWebSocket { * @return {object} - optional return value. */ didReceiveCall (method, params) { - // TODO: does didReceiveCall receive any errors? - // TODO: Add peripheral 'undiscover' handling + // TODO: Add peripheral 'undiscover' handling with timeout? switch (method) { case 'didDiscoverPeripheral': this._availablePeripherals[params.peripheralId] = params; diff --git a/src/util/jsonrpc-web-socket.js b/src/util/jsonrpc-web-socket.js index 22310d337..edfdf9373 100644 --- a/src/util/jsonrpc-web-socket.js +++ b/src/util/jsonrpc-web-socket.js @@ -27,6 +27,10 @@ class JSONRPCWebSocket extends JSONRPC { _onSocketMessage (e) { const json = JSON.parse(e.data); + if (json.method !== 'characteristicDidChange') { + console.log('received message: '); + console.log(json); + } this._handleMessage(json); }