Skip to content

Commit ae304fc

Browse files
committed
Smalrubot S1 ruby -> block.
1 parent 201ed94 commit ae304fc

File tree

3 files changed

+417
-0
lines changed

3 files changed

+417
-0
lines changed

src/lib/ruby-to-blocks-converter/index.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import EV3Converter from './ev3';
2424
import Wedo2Converter from './wedo2';
2525
import GdxForConverter from './gdx_for';
2626
import MeshConverter from './mesh';
27+
import SmalrubotS1Converter from './smalrubot_s1';
2728

2829
/* eslint-disable no-invalid-this */
2930
const ColorRegexp = /^#[0-9a-fA-F]{6}$/;
@@ -68,6 +69,7 @@ class RubyToBlocksConverter {
6869
Wedo2Converter,
6970
GdxForConverter,
7071
MeshConverter,
72+
SmalrubotS1Converter,
7173

7274
MotionConverter,
7375
LooksConverter,
@@ -359,6 +361,10 @@ class RubyToBlocksConverter {
359361
return _.isNumber(value) || (value && (value.type === 'int' || value.type === 'float'));
360362
}
361363

364+
_isTrue (value) {
365+
return value === true || (value && value.type === 'true');
366+
}
367+
362368
_isFalse (value) {
363369
return value === false || (value && value.type === 'false');
364370
}
@@ -781,6 +787,15 @@ class RubyToBlocksConverter {
781787
return block;
782788
}
783789

790+
_changeRubyExpressionBlock (block, opcode, blockType) {
791+
this._changeBlock(block, opcode, blockType);
792+
793+
delete this._context.blocks[block.inputs.EXPRESSION.block];
794+
delete block.inputs.EXPRESSION;
795+
796+
return block;
797+
}
798+
784799
_changeToBooleanArgument (varName) {
785800
varName = varName.toString();
786801
const variable = this._context.localVariables[varName];
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
/* global Opal */
2+
import _ from 'lodash';
3+
4+
const SmalrubotS1 = 'smalrubot_s1';
5+
6+
const ACTIONS = [
7+
'forward',
8+
'backward',
9+
'left',
10+
'right',
11+
'stop'
12+
];
13+
14+
const POSITIONS = [
15+
'left',
16+
'right'
17+
];
18+
19+
const SENSOR_POSITIONS = [
20+
'left',
21+
'right',
22+
'touch'
23+
];
24+
25+
/**
26+
* Smalrubot S1 extension converter
27+
*/
28+
const SmalrubotS1Converter = {
29+
// eslint-disable-next-line no-unused-vars
30+
onSend: function (receiver, name, args, rubyBlockArgs, rubyBlock, node) {
31+
let block;
32+
if (this._isSelf(receiver) || receiver === Opal.nil) {
33+
if (name === SmalrubotS1 && args.length === 0) {
34+
block = this._createRubyExpressionBlock(SmalrubotS1, node);
35+
}
36+
} else if (this._equalRubyExpression(receiver, SmalrubotS1)) {
37+
switch (name) {
38+
case 'action':
39+
if (args.length === 1 && this._isString(args[0]) && ACTIONS.includes(args[0].toString())) {
40+
block = this._changeRubyExpressionBlock(
41+
receiver, 'smalrubotS1_action', 'statement'
42+
);
43+
this._addField(block, 'ACTION', args[0]);
44+
} else if (args.length === 2 &&
45+
this._isString(args[0]) && ACTIONS.includes(args[0].toString()) &&
46+
this._isNumberOrBlock(args[1])) {
47+
block = this._changeRubyExpressionBlock(
48+
receiver, 'smalrubotS1_actionAndStopAfter', 'statement'
49+
);
50+
this._addField(block, 'ACTION', args[0]);
51+
this._addNumberInput(block, 'SECS', 'math_number', args[1], 0.5);
52+
}
53+
break;
54+
case 'bend_arm':
55+
if (args.length === 2 &&
56+
this._isNumberOrBlock(args[0]) &&
57+
this._isNumberOrBlock(args[1])) {
58+
block = this._changeRubyExpressionBlock(
59+
receiver, 'smalrubotS1_bendArm', 'statement'
60+
);
61+
this._addNumberInput(block, 'DEGREE', 'math_number', args[0], 90);
62+
this._addNumberInput(block, 'SECS', 'math_number', args[1], 1);
63+
}
64+
break;
65+
case 'sensor_value':
66+
if (args.length === 1 &&
67+
this._isString(args[0]) && SENSOR_POSITIONS.includes(args[0].toString())) {
68+
block = this._changeRubyExpressionBlock(
69+
receiver, 'smalrubotS1_getSensorValue', 'value'
70+
);
71+
this._addField(block, 'POSITION', args[0]);
72+
}
73+
break;
74+
case 'led':
75+
if (args.length === 2 &&
76+
this._isString(args[0]) && POSITIONS.includes(args[0].toString()) &&
77+
(this._isTrue(args[1]) || this._isFalse(args[1]))) {
78+
let opcode = 'smalrubotS1_turnLedOn';
79+
if (this._isFalse(args[1])) {
80+
opcode = 'smalrubotS1_turnLedOff';
81+
}
82+
block = this._changeRubyExpressionBlock(
83+
receiver, opcode, 'statement'
84+
);
85+
this._addField(block, 'POSITION', args[0]);
86+
}
87+
break;
88+
case 'get_motor_speed':
89+
if (args.length === 1 &&
90+
this._isString(args[0]) && POSITIONS.includes(args[0].toString())) {
91+
block = this._changeRubyExpressionBlock(
92+
receiver, 'smalrubotS1_getMotorSpeed', 'value'
93+
);
94+
this._addField(block, 'POSITION', args[0]);
95+
}
96+
break;
97+
case 'set_motor_speed':
98+
if (args.length === 2 &&
99+
this._isString(args[0]) && POSITIONS.includes(args[0].toString()) &&
100+
this._isNumberOrBlock(args[1])) {
101+
block = this._changeRubyExpressionBlock(
102+
receiver, 'smalrubotS1_setMotorSpeed', 'statement'
103+
);
104+
this._addField(block, 'POSITION', args[0]);
105+
this._addNumberInput(block, 'SPEED', 'math_number', args[1], 100);
106+
}
107+
break;
108+
}
109+
}
110+
return block;
111+
}
112+
};
113+
114+
export default SmalrubotS1Converter;

0 commit comments

Comments
 (0)