Skip to content
85 changes: 85 additions & 0 deletions src/lib/ruby-generator/ev3.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
/**
* Define Ruby code generator for LEGO_EV3 Blocks
* @param {RubyGenerator} Generator The RubyGenerator
* @return {RubyGenerator} same as param.
*/
export default function (Generator) {
const Ev3SensorMenu = ['1', '2', '3', '4'];
const Ev3MotorMenu = ['A', 'B', 'C', 'D'];

Generator.ev3_menu_sensorPorts = function (block) {
const index = Generator.getFieldValue(block, 'sensorPorts') || 0;
const port = Generator.quote_(Ev3SensorMenu[index]);
return [port, Generator.ORDER_ATOMIC];
};

Generator.ev3_whenButtonPressed = function (block) {
block.isStatement = true;
const port = Generator.valueToCode(block, 'PORT', Generator.ORDER_NONE) || null;
return `${Generator.spriteName()}.when(:ev3_button_pressed, ${port}) do\n`;
};

Generator.ev3_menu_motorPorts = function (block) {
const index = Generator.getFieldValue(block, 'motorPorts') || 0;
const port = Generator.quote_(Ev3MotorMenu[index]);
return [port, Generator.ORDER_ATOMIC];
};

Generator.ev3_motorSetPower = function (block) {
const port = Generator.valueToCode(block, 'PORT', Generator.ORDER_NONE) || null;
const power = Generator.valueToCode(block, 'POWER', Generator.ORDER_NONE) || null;
return `ev3_motor_set_power(${port}, ${power})\n`;
};

Generator.ev3_motorTurnClockwise = function (block) {
const port = Generator.valueToCode(block, 'PORT', Generator.ORDER_NONE) || null;
const time = Generator.valueToCode(block, 'TIME', Generator.ORDER_NONE) || null;
return `ev3_motor_turn_this_way_for(${port}, ${time})\n`;
};

Generator.ev3_motorTurnCounterClockwise = function (block) {
const port = Generator.valueToCode(block, 'PORT', Generator.ORDER_NONE) || null;
const time = Generator.valueToCode(block, 'TIME', Generator.ORDER_NONE) || null;
return `ev3_motor_turn_that_way_for(${port}, ${time})\n`;
};

Generator.ev3_getMotorPosition = function (block) {
const order = Generator.ORDER_FUNCTION_CALL;
const port = Generator.valueToCode(block, 'PORT', Generator.ORDER_NONE) || null;
return [`ev3_motor_position(${port})`, order];
};

Generator.ev3_whenDistanceLessThan = function (block) {
block.isStatement = true;
const distance = Generator.valueToCode(block, 'DISTANCE', Generator.ORDER_NONE) || null;
return `${Generator.spriteName()}.when(:ev3_distance_gt, ${distance}) do\n`;
};

Generator.ev3_whenBrightnessLessThan = function (block) {
block.isStatement = true;
const distance = Generator.valueToCode(block, 'DISTANCE', Generator.ORDER_NONE) || null;
return `${Generator.spriteName()}.when(:ev3_brightness_gt, ${distance}) do\n`;
};

Generator.ev3_buttonPressed = function (block) {
const order = Generator.ORDER_FUNCTION_CALL;
const port = Generator.valueToCode(block, 'PORT', order) || null;
return [`ev3_button_pressed?(${port})`, order];
};

Generator.ev3_getDistance = function () {
return ['ev3_distance', Generator.ORDER_ATOMIC];
};

Generator.ev3_getBrightness = function () {
return ['ev3_brightness', Generator.ORDER_ATOMIC];
};

Generator.ev3_beep = function (block) {
const note = Generator.valueToCode(block, 'NOTE', Generator.ORDER_NONE) || null;
const time = Generator.valueToCode(block, 'TIME', Generator.ORDER_NONE) || null;
return `ev3_beep_note(${note}, ${time})\n`;
};

return Generator;
}
2 changes: 2 additions & 0 deletions src/lib/ruby-generator/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import TranslateBlocks from './translate.js';
import MakeyMakeyBlocks from './makeymakey.js';
import MicrobitBlocks from './microbit.js';
import BoostBlocks from './boost.js';
import EV3Blocks from './ev3.js'

const SCALAR_TYPE = '';
const LIST_TYPE = 'list';
Expand Down Expand Up @@ -450,5 +451,6 @@ TranslateBlocks(RubyGenerator);
MakeyMakeyBlocks(RubyGenerator);
MicrobitBlocks(RubyGenerator);
BoostBlocks(RubyGenerator);
EV3Blocks(RubyGenerator);

export default RubyGenerator;
34 changes: 34 additions & 0 deletions src/lib/ruby-to-blocks-converter/ev3.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
/* global Opal */
import _ from 'lodash';

const RotationStyle = [
'left-right',
'don\'t rotate',
'all around'
];

const Ev3MotorMenu = ['A', 'B', 'C', 'D'];

/**
* EV3 converter
*/
const EV3Converter = {
// eslint-disable-next-line no-unused-vars
onSend: function (receiver, name, args, rubyBlockArgs, rubyBlock) {
let block;
if ((this._isSelf(receiver) || receiver === Opal.nil) && !rubyBlock) {
switch (name) {
case 'ev3_beep_note':
if (args.length === 2 && this._isNumberOrBlock(args[0]) && this._isNumberOrBlock(args[1])) {
block = this._createBlock('ev3_beep', 'statement');
this._addNoteInput(block, 'NOTE', args[0], 60);
this._addNumberInput(block, 'TIME', 'math_number', args[1], 0.5);
}
break;
}
}
return block;
}
};

export default EV3Converter;
20 changes: 19 additions & 1 deletion src/lib/ruby-to-blocks-converter/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import OperatorsConverter from './operators';
import VariablesConverter from './variables';
import MyBlocksConverter from './my-blocks';
import MusicConverter from './music';
import EV3Converter from './ev3';

/**
* Class for a block converter that translates ruby code into the blocks.
Expand All @@ -35,7 +36,8 @@ class RubyToBlocksConverter {
OperatorsConverter,
VariablesConverter,
MyBlocksConverter,
MusicConverter
MusicConverter,
EV3Converter
];
this.reset();
}
Expand Down Expand Up @@ -462,6 +464,22 @@ class RubyToBlocksConverter {
this._addInput(block, name, this._createNumberBlock(opcode, inputValue), shadowBlock);
}

_addNoteInput (block, name, inputValue, shadowValue) {
let shadowBlock;
let opcode = 'note';
if (!this._isNumber(inputValue)) {
shadowBlock = this._createNoteBlock(opcode, shadowValue);
}
this._addInput(block, name, this._createNoteBlock(opcode, inputValue), shadowBlock);
}

_createNoteBlock (opcode, value) {
if (this._isNumber(value) || value === '') {
return this._createFieldBlock(opcode, 'NOTE', value.toString());
}
return value;
}

_addTextInput (block, name, inputValue, shadowValue) {
let shadowBlock;
if (!this._isString(inputValue)) {
Expand Down