From e2bd28b85e30e250c13981af55dcedca4b4c173b Mon Sep 17 00:00:00 2001 From: Kevin Andersen Date: Tue, 12 Feb 2019 10:10:21 -0500 Subject: [PATCH] Cleaned up documentation (WIP). Added Output subcommand enum for use throughout extension --- src/extensions/scratch3_boost/index.js | 60 +++++++++++++++++++------- 1 file changed, 44 insertions(+), 16 deletions(-) diff --git a/src/extensions/scratch3_boost/index.js b/src/extensions/scratch3_boost/index.js index c5bffa5b7..5875f6c3c 100644 --- a/src/extensions/scratch3_boost/index.js +++ b/src/extensions/scratch3_boost/index.js @@ -9,6 +9,11 @@ const MathUtil = require('../../util/math-util'); const RateLimiter = require('../../util/rateLimiter.js'); const log = require('../../util/log'); +/** + * The LEGO Wireless Protocol documentation used to create this extension can be found at: + * https://lego.github.io/lego-ble-wireless-protocol-docs/index.html + */ + /** * Icon svg to be displayed at the left edge of each extension block, encoded as a data URI. * @type {string} @@ -41,7 +46,7 @@ const BLESendInterval = 100; const BLESendRateMax = 20; /** - * Enum for Boost sensor and output types. + * Enum for Boost sensor and actuator types. * @readonly * @enum {number} */ @@ -56,7 +61,7 @@ const BoostIO = { }; /** - * Enum for ids for various output commands on the Boost. + * Enum for ids for various output command feedback types on the Boost. * @readonly * @enum {number} */ @@ -110,13 +115,34 @@ const BoostMessage = { PORT_VALUE_COMBINED: 0x46, PORT_INPUT_FORMAT: 0x47, PORT_INPUT_FORMAT_COMBINED: 0x48, - WRITE_DIRECT_MODE_DATA: 0x51, OUTPUT: 0x81, PORT_OUTPUT_COMMAND_FEEDBACK: 0x82 } /** - * Enum for Attached IO Message Lengths + * Enum for Motor Subcommands (for 0x81) + * @readonly + * @enum {number} + */ + +const BoostOutputSubCommand = { + START_POWER_PAIR: 0x02, + SET_ACC_TIME: 0x05, + SET_DEC_TIME: 0x06, + START_SPEED: 0x07, + START_SPEED_PAIR: 0x08, + START_SPEED_FOR_TIME: 0x09, + START_SPEED_FOR_TIME_PAIR: 0x0A, + START_SPEED_FOR_DEGREES: 0x0B, + START_SPEED_FOR_DEGREES_PAIR: 0x0C, + GO_TO_ABS_POSITION: 0x0D, + GO_TO_ABS_POSITION_PAIR: 0x0E, + PRESET_ENCODER: 0x14, + WRITE_DIRECT_MODE_DATA: 0x51, +} + +/** + * Enum for when Boost IO's are attached/detached * @readonly * @enum {number} */ @@ -155,7 +181,7 @@ function number2int32array(number) { } /** - * Manage power, direction, and timers for one Boost motor. + * Manage power, direction, position, and timers for one Boost motor. */ class BoostMotor { /** @@ -360,7 +386,7 @@ class BoostMotor { if (this._power === 0) return; const cmd = this._parent.generateOutputCommand( this._index, - BoostMessage.WRITE_DIRECT_MODE_DATA, + BoostOutputSubCommand.WRITE_DIRECT_MODE_DATA, 0x00, [this._power * this._direction] // power in range 0-100 ); @@ -398,8 +424,9 @@ class BoostMotor { number2int32array(degrees).concat( [ this._power * this._direction, // power in range 0-100 - 0xff, - 0x00,0x03]) + 0xff, // max speed + 0x00, + 0x03]) ); this._status = BoostOutputCommandFeedback.BUFFER_EMPTY_COMMAND_IN_PROGRESS; @@ -612,7 +639,7 @@ class Boost { const cmd = this.generateOutputCommand( this._ports.indexOf(BoostIO.LED), - BoostMessage.WRITE_DIRECT_MODE_DATA, + BoostOutputSubCommand.WRITE_DIRECT_MODE_DATA, BoostMode.LED, rgb ); @@ -642,7 +669,7 @@ class Boost { stopLED () { const cmd = this.generateOutputCommand( this._ports.indexOf(BoostIO.LED), - BoostMessage.WRITE_DIRECT_MODE_DATA, + BoostOutputSubCommand.WRITE_DIRECT_MODE_DATA, BoostUnit.LED, [0, 0, 0] ); @@ -748,18 +775,18 @@ class Boost { * This sends a command to the Boost to actuate the specified outputs. * * @param {number} portID - the port (Connect ID) to send a command to. - * @param {number} commandID - the id of the byte command. + * @param {number} subCommandID - the id of the byte command. * @param {number} mode - the mode * @param {array} values - the list of values to write to the command. * @return {array} - a generated output command. */ - generateOutputCommand (portID, subCommandID = BoostMessage.WRITE_DIRECT_MODE_DATA, mode=null, values = null) { + generateOutputCommand (portID, subCommandID = BoostOutputSubCommand.WRITE_DIRECT_MODE_DATA, mode=null, values = null) { let command = [0x00, BoostMessage.OUTPUT]; if (values) { command = command.concat( portID ).concat( - 0x11 // Execute immediately + 0x11 // Execute immediately TODO: Use enum! ); if(subCommandID) { @@ -793,7 +820,7 @@ class Boost { generateInputCommand (portID, mode, delta, enableNotifications) { var command = [ 0x00, // Hub ID - 0x41, // Message Type (Port Input Format Setup (Single)) + 0x41, // Message Type (Port Input Format Setup (Single)) TODO: Use enum portID, mode, ].concat(number2int32array(delta)).concat([ @@ -851,14 +878,15 @@ class Boost { switch (event) { case BoostIOEvent.ATTACHED: - //case BoostIOEvent.ATTACHED_VIRTUAL: this._registerSensorOrMotor(portID, typeId) break; case BoostIOEvent.DETACHED: this._clearPort(portID); break; + case BoostIOEvent.ATTACHED_VIRTUAL: default: - console.log("No I/O Event case found!") + // Ignore + //console.log("No I/O Event case found!") } break; case BoostMessage.PORT_VALUE: