Moved Scratch3BoostBlocks-functions around so that they are properly grouped, i.e. motors, tilt, color, etc

This commit is contained in:
Kevin Andersen 2019-03-21 14:50:39 -04:00
parent 256758122d
commit 601c9d230f

View file

@ -943,7 +943,6 @@ class Boost {
break;
}
case BoostMessage.PORT_FEEDBACK: {
// TODO: If extension will receive feedback from multiple ports simultaneously, this case will need to handle it.
const feedback = data[4];
const motor = this.motor(portID);
if (motor) {
@ -1758,96 +1757,6 @@ class Scratch3BoostBlocks {
});
}
/**
* Set the LED's hue.
* @param {object} args - the block's arguments.
* @property {number} HUE - the hue to set, in the range [0,100].
* @return {Promise} - a Promise that resolves after some delay.
*/
setLightHue (args) {
// Convert from [0,100] to [0,360]
let inputHue = Cast.toNumber(args.HUE);
inputHue = MathUtil.wrapClamp(inputHue, 0, 100);
const hue = inputHue * 360 / 100;
const rgbObject = color.hsvToRgb({h: hue, s: 1, v: 1});
const rgbDecimal = color.rgbToDecimal(rgbObject);
this._peripheral._led = inputHue;
this._peripheral.setLED(rgbDecimal);
return new Promise(resolve => {
window.setTimeout(() => {
resolve();
}, BoostBLE.sendInterval);
});
}
/**
* Change the LED's hue by a give number.
* @param {object} args - the block's arguments.
* @property {number} HUE - the hue to set, in the range [0,100].
*/
changeLightHueBy (args) {
// TODO: Clean up this block and its opcode
const n = {};
n.HUE = Cast.toNumber(args.HUE) + this._peripheral._led;
this.setLightHue(n);
}
/**
* Test whether the tilt sensor is currently tilted.
* @param {object} args - the block's arguments.
* @property {TiltDirection} TILT_DIRECTION_ANY - the tilt direction to test (up, down, left, right, or any).
* @return {boolean} - true if the tilt sensor is tilted past a threshold in the specified direction.
*/
whenTilted (args) {
return this._isTilted(args.TILT_DIRECTION_ANY);
}
/**
* Test whether the tilt sensor is currently tilted.
* @param {object} args - the block's arguments.
* @property {Color} COLOR - the color to test.
* @return {boolean} - true if the tilt sensor is tilted past a threshold in the specified direction.
*/
whenColor (args) {
return this._isColor(args.COLOR);
}
/**
* @return {number} - the vision sensor's color value. Indexed LEGO brick colors.
*/
getColor () {
// To get a string representation, lookup the key of the BoostColor-enum value
return Object.keys(BoostColor).find(key => BoostColor[key] === this._peripheral.color)
.toLowerCase();
}
/**
* Test whether the vision sensor is detecting a certain color.
* @param {number} args - the color to test.
* @return {boolean} - true when the color sensor senses the specified color.
* @private
*/
_isColor (args) {
switch (args) {
case BoostColorLabel.ANY:
if (Object.keys(BoostColor).find(key => BoostColor[key])
.toLowerCase() !== this.getColor()) {
if (this.getColor() === this._peripheral.oldColor) {
return false;
}
this._peripheral.oldColor = this.getColor();
return true;
}
break;
default:
return this.getColor() === color;
}
}
/**
* @param {object} args - the block's arguments.
* @return {number} - returns the motor's position.
@ -1878,6 +1787,53 @@ class Scratch3BoostBlocks {
return 0;
}
/**
* Call a callback for each motor indexed by the provided motor ID.
* @param {MotorID} motorID - the ID specifier.
* @param {Function} callback - the function to call with the numeric motor index for each motor.
* @private
*/
_forEachMotor (motorID, callback) {
let motors;
switch (motorID) {
case BoostMotorLabel.A:
motors = [BoostPort.A];
break;
case BoostMotorLabel.B:
motors = [BoostPort.B];
break;
case BoostMotorLabel.C:
motors = [BoostPort.C];
break;
case BoostMotorLabel.D:
motors = [BoostPort.D];
break;
case BoostMotorLabel.AB:
motors = [BoostPort.A, BoostPort.B];
break;
case BoostMotorLabel.ALL:
motors = [BoostPort.A, BoostPort.B, BoostPort.C, BoostPort.D];
break;
default:
log.warn(`Invalid motor ID: ${motorID}`);
motors = [];
break;
}
for (const index of motors) {
callback(index);
}
}
/**
* Test whether the tilt sensor is currently tilted.
* @param {object} args - the block's arguments.
* @property {TiltDirection} TILT_DIRECTION_ANY - the tilt direction to test (up, down, left, right, or any).
* @return {boolean} - true if the tilt sensor is tilted past a threshold in the specified direction.
*/
whenTilted (args) {
return this._isTilted(args.TILT_DIRECTION_ANY);
}
/**
* Test whether the tilt sensor is currently tilted.
* @param {object} args - the block's arguments.
@ -1936,41 +1892,72 @@ class Scratch3BoostBlocks {
}
/**
* Call a callback for each motor indexed by the provided motor ID.
* @param {MotorID} motorID - the ID specifier.
* @param {Function} callback - the function to call with the numeric motor index for each motor.
* Test whether the tilt sensor is currently tilted.
* @param {object} args - the block's arguments.
* @property {Color} COLOR - the color to test.
* @return {boolean} - true if the tilt sensor is tilted past a threshold in the specified direction.
*/
whenColor (args) {
return this._isColor(args.COLOR);
}
/**
* @return {number} - the vision sensor's color value. Indexed LEGO brick colors.
*/
getColor () {
// To get a string representation, lookup the key of the BoostColor-enum value
return Object.keys(BoostColor).find(key => BoostColor[key] === this._peripheral.color)
.toLowerCase();
}
/**
* Test whether the vision sensor is detecting a certain color.
* @param {number} args - the color to test.
* @return {boolean} - true when the color sensor senses the specified color.
* @private
*/
_forEachMotor (motorID, callback) {
let motors;
switch (motorID) {
case BoostMotorLabel.A:
motors = [BoostPort.A];
break;
case BoostMotorLabel.B:
motors = [BoostPort.B];
break;
case BoostMotorLabel.C:
motors = [BoostPort.C];
break;
case BoostMotorLabel.D:
motors = [BoostPort.D];
break;
case BoostMotorLabel.AB:
motors = [BoostPort.A, BoostPort.B];
break;
case BoostMotorLabel.ALL:
motors = [BoostPort.A, BoostPort.B, BoostPort.C, BoostPort.D];
_isColor (args) {
switch (args) {
case BoostColorLabel.ANY:
if (Object.keys(BoostColor).find(key => BoostColor[key])
.toLowerCase() !== this.getColor()) {
if (this.getColor() === this._peripheral.oldColor) {
return false;
}
this._peripheral.oldColor = this.getColor();
return true;
}
break;
default:
log.warn(`Invalid motor ID: ${motorID}`);
motors = [];
break;
}
for (const index of motors) {
callback(index);
return this.getColor() === color;
}
}
/**
* Set the LED's hue.
* @param {object} args - the block's arguments.
* @property {number} HUE - the hue to set, in the range [0,100].
* @return {Promise} - a Promise that resolves after some delay.
*/
setLightHue (args) {
// Convert from [0,100] to [0,360]
let inputHue = Cast.toNumber(args.HUE);
inputHue = MathUtil.wrapClamp(inputHue, 0, 100);
const hue = inputHue * 360 / 100;
const rgbObject = color.hsvToRgb({h: hue, s: 1, v: 1});
const rgbDecimal = color.rgbToDecimal(rgbObject);
this._peripheral._led = inputHue;
this._peripheral.setLED(rgbDecimal);
return new Promise(resolve => {
window.setTimeout(() => {
resolve();
}, BoostBLE.sendInterval);
});
}
}
module.exports = Scratch3BoostBlocks;