Skip to content

Commit 62ada65

Browse files
authored
Merge pull request #262 from smalruby/rikutons/gh-249-adding-microbit-more
Add MicrobitMore extension
2 parents af350d5 + 624a54b commit 62ada65

File tree

10 files changed

+513
-1
lines changed

10 files changed

+513
-1
lines changed

LEGAL

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,3 +53,11 @@ opal/opal-parser.min.js
5353

5454
These files are licensed under the MIT License
5555
(see https://github.com/opal/opal/blob/master/LICENSE ).
56+
57+
src/lib/libraries/extensions/microbit_more/microbitMore.png
58+
src/lib/libraries/extensions/microbit_more/microbitMore-illustration.svg
59+
src/lib/libraries/extensions/microbit_more/microbitMore-small.svg
60+
61+
These files are licensed under the MIT License
62+
(see https://github.com/yokobond/scratch-microbit-more/blob/master/LICENSE ).
63+

package-lock.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/lib/libraries/extensions/index.jsx

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@ import microbitInsetIconURL from './microbit/microbit-small.svg';
2424
import microbitConnectionIconURL from './microbit/microbit-illustration.svg';
2525
import microbitConnectionSmallIconURL from './microbit/microbit-small.svg';
2626

27+
import microbitMoreIconURL from './microbitMore/microbitMore.png';
28+
import microbitMoreInsetIconURL from './microbitMore/microbitMore-small.svg';
29+
import microbitMoreConnectionIconURL from './microbitMore/microbitMore-illustration.svg';
30+
import microbitMoreConnectionSmallIconURL from './microbitMore/microbitMore-small.svg';
31+
2732
import ev3IconURL from './ev3/ev3.png';
2833
import ev3InsetIconURL from './ev3/ev3-small.svg';
2934
import ev3ConnectionIconURL from './ev3/ev3-hub-illustration.svg';
@@ -206,6 +211,36 @@ export default [
206211
),
207212
helpLink: 'https://scratch.mit.edu/microbit'
208213
},
214+
{
215+
name: 'micro:bit MORE',
216+
extensionId: 'microbitMore',
217+
collaborator: 'Yengawa Lab',
218+
iconURL: microbitMoreIconURL,
219+
insetIconURL: microbitMoreInsetIconURL,
220+
description: (
221+
<FormattedMessage
222+
defaultMessage="Connect your projects with the world."
223+
description="Description for the 'micro:bit' extension"
224+
id="gui.extension.microbit.description"
225+
/>
226+
),
227+
featured: true,
228+
disabled: false,
229+
bluetoothRequired: true,
230+
internetConnectionRequired: false,
231+
launchPeripheralConnectionFlow: true,
232+
useAutoScan: false,
233+
connectionIconURL: microbitMoreConnectionIconURL,
234+
connectionSmallIconURL: microbitMoreConnectionSmallIconURL,
235+
connectingMessage: (
236+
<FormattedMessage
237+
defaultMessage="Connecting"
238+
description="Message to help people connect to their micro:bit."
239+
id="gui.extension.microbit.connectingMessage"
240+
/>
241+
),
242+
helpLink: 'https://lab.yengawa.com/project/scratch-microbit-more/'
243+
},
209244
{
210245
name: 'LEGO MINDSTORMS EV3',
211246
extensionId: 'ev3',

src/lib/libraries/extensions/microbitMore/microbitMore-illustration.svg

Lines changed: 1 addition & 0 deletions
Loading

src/lib/libraries/extensions/microbitMore/microbitMore-small.svg

Lines changed: 1 addition & 0 deletions
Loading
32.7 KB
Loading

src/lib/ruby-generator/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import Text2SpeechBlocks from './text2speech.js';
2323
import TranslateBlocks from './translate.js';
2424
import MakeyMakeyBlocks from './makeymakey.js';
2525
import MicrobitBlocks from './microbit.js';
26+
import MicrobitMoreBlocks from './microbit_more.js';
2627
import BoostBlocks from './boost.js';
2728
import EV3Blocks from './ev3.js';
2829
import WeDo2Blocks from './wedo2.js';
@@ -453,6 +454,7 @@ Text2SpeechBlocks(RubyGenerator);
453454
TranslateBlocks(RubyGenerator);
454455
MakeyMakeyBlocks(RubyGenerator);
455456
MicrobitBlocks(RubyGenerator);
457+
MicrobitMoreBlocks(RubyGenerator);
456458
BoostBlocks(RubyGenerator);
457459
EV3Blocks(RubyGenerator);
458460
WeDo2Blocks(RubyGenerator);
Lines changed: 247 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,247 @@
1+
/**
2+
* Define Ruby code generator for micro:bit MORE Blocks
3+
* @param {RubyGenerator} Generator The RubyGenerator
4+
* @return {RubyGenerator} same as param.
5+
*/
6+
export default function (Generator) {
7+
Generator.microbitMore_whenButtonPressed = function (block) {
8+
block.isStatement = true;
9+
const btn = Generator.valueToCode(block, 'BTN', Generator.ORDER_NONE) || null;
10+
return `${Generator.spriteName()}.when(:mbit_more_button_pressed, ${btn}) do\n`;
11+
};
12+
13+
Generator.microbitMore_isButtonPressed = function (block) {
14+
const btn = Generator.valueToCode(block, 'BTN', Generator.ORDER_NONE) || null;
15+
return `mbit_more.button_pressed?(${btn})\n`;
16+
};
17+
18+
Generator.microbitMore_whenGesture = function (block) {
19+
block.isStatement = true;
20+
const gesture = Generator.valueToCode(block, 'GESTURE', Generator.ORDER_NONE) || null;
21+
return `${Generator.spriteName()}.when(:mbit_more_gesture, ${gesture}) do\n`;
22+
};
23+
24+
Generator.microbitMore_displaySymbol = function (block) {
25+
let matrix = Generator.valueToCode(block, 'MATRIX', Generator.ORDER_NONE) || null;
26+
matrix = Generator.prefixLines(matrix, Generator.INDENT);
27+
return `mbit_more.display(\n${matrix}\n)\n`;
28+
};
29+
30+
Generator.microbitMore_displayText = function (block) {
31+
const text = Generator.valueToCode(block, 'TEXT', Generator.ORDER_NONE) || null;
32+
return `mbit_more.display_text(${text})\n`;
33+
};
34+
35+
Generator.microbitMore_displayClear = function () {
36+
return `mbit_more.clear_display\n`;
37+
};
38+
39+
Generator.microbitMore_whenTilted = function (block) {
40+
block.isStatement = true;
41+
const direction = Generator.valueToCode(block, 'DIRECTION', Generator.ORDER_NONE) || null;
42+
return `${Generator.spriteName()}.when(:mbit_more_tilted, ${direction}) do\n`;
43+
};
44+
45+
Generator.microbitMore_isTilted = function (block) {
46+
const direction = Generator.valueToCode(block, 'DIRECTION', Generator.ORDER_NONE) || null;
47+
return [`mbit_more.tilted?(${direction})`, Generator.ORDER_ATOMIC];
48+
};
49+
50+
Generator.microbitMore_getTiltAngle = function (block) {
51+
const direction = Generator.valueToCode(block, 'DIRECTION', Generator.ORDER_NONE) || null;
52+
return [`mbit_more.tilt_angle(${direction})`, Generator.ORDER_ATOMIC];
53+
};
54+
55+
Generator.microbitMore_whenPinConnected = function (block) {
56+
block.isStatement = true;
57+
const pin = Generator.valueToCode(block, 'PIN', Generator.ORDER_NONE) || null;
58+
return `${Generator.spriteName()}.when(:mbit_more_pin_connected, ${pin}) do\n`;
59+
};
60+
61+
Generator.microbitMore_isPinConnected = function (block) {
62+
const pin = Generator.valueToCode(block, 'PIN', Generator.ORDER_NONE) || null;
63+
return `mbit_more.pin_connected?(${pin})\n`;
64+
};
65+
66+
Generator.microbitMore_getLightLevel = function () {
67+
return `mbit_more.light_level\n`;
68+
};
69+
70+
Generator.microbitMore_getTemperature = function () {
71+
return `mbit_more.temperature\n`;
72+
};
73+
74+
Generator.microbitMore_getCompassHeading = function () {
75+
return `mbit_more.compass_heading\n`;
76+
};
77+
78+
Generator.microbitMore_getPitch = function () {
79+
return `mbit_more.pitch\n`;
80+
};
81+
82+
Generator.microbitMore_getRoll = function () {
83+
return `mbit_more.roll\n`;
84+
};
85+
86+
Generator.microbitMore_getMagneticForce = function (block) {
87+
const axis = Generator.valueToCode(block, 'AXIS', Generator.ORDER_NONE) || null;
88+
return `mbit_more.get_magnetic_force(${axis})\n`;
89+
};
90+
91+
Generator.microbitMore_getAcceleration = function (block) {
92+
const axis = Generator.valueToCode(block, 'AXIS', Generator.ORDER_NONE) || null;
93+
return `mbit_more.get_acceleration(${axis})\n`;
94+
};
95+
96+
Generator.microbitMore_getAnalogValue = function (block) {
97+
const pin = Generator.valueToCode(block, 'PIN', Generator.ORDER_NONE) || null;
98+
return `mbit_more.get_analog_value(${pin})\n`;
99+
};
100+
101+
Generator.microbitMore_getDigitalValue = function (block) {
102+
const pin = Generator.valueToCode(block, 'PIN', Generator.ORDER_NONE) || null;
103+
return `mbit_more.get_digital_value(${pin})\n`;
104+
};
105+
106+
Generator.microbitMore_setPinMode = function (block) {
107+
const pin = Generator.valueToCode(block, 'PIN', Generator.ORDER_NONE) || null;
108+
const mode = Generator.quote_(Generator.getFieldValue(block, 'MODE')) || null;
109+
return `mbit_more.set_pin_mode(${pin}, ${mode})\n`;
110+
};
111+
112+
Generator.microbitMore_setOutput = function (block) {
113+
const pin = Generator.valueToCode(block, 'PIN', Generator.ORDER_NONE) || null;
114+
const level = Generator.valueToCode(block, 'LEVEL', Generator.ORDER_NONE) || null;
115+
return `mbit_more.set_output(${pin}, ${level})\n`;
116+
};
117+
118+
Generator.microbitMore_setPWM = function (block) {
119+
const pin = Generator.valueToCode(block, 'PIN', Generator.ORDER_NONE) || null;
120+
const level = Generator.valueToCode(block, 'LEVEL', Generator.ORDER_NONE) || null;
121+
return `mbit_more.set_pwm(${pin}, ${level})\n`;
122+
};
123+
124+
Generator.microbitMore_setServo = function (block) {
125+
const pin = Generator.valueToCode(block, 'PIN', Generator.ORDER_NONE) || null;
126+
const angle = Generator.valueToCode(block, 'ANGLE', Generator.ORDER_NONE) || null;
127+
const range = Generator.valueToCode(block, 'RANGE', Generator.ORDER_NONE) || 2000;
128+
const center = Generator.valueToCode(block, 'CENTER', Generator.ORDER_NONE) || 1500;
129+
return `mbit_more.set_servo(${pin}, ${angle}, ${range}, ${center})\n`;
130+
};
131+
132+
Generator.microbitMore_setPinEventType = function (block) {
133+
const pin = Generator.valueToCode(block, 'PIN', Generator.ORDER_NONE) || null;
134+
const eventType = Generator.getFieldValue(block, 'EVENT_TYPE') || null;
135+
return `mbit_more.set_pin_event_type(${pin}, ${eventType})\n`;
136+
};
137+
138+
Generator.microbitMore_whenPinEvent = function (block) {
139+
block.isStatement = true;
140+
const pin = Generator.valueToCode(block, 'PIN', Generator.ORDER_NONE) || null;
141+
const event = Generator.getFieldValue(block, 'EVENT') || null;
142+
return `${Generator.spriteName()}.when(:mbit_more_pin_event, ${pin}, ${event}) do\n`;
143+
};
144+
145+
Generator.microbitMore_getPinEventTimestamp = function (block) {
146+
const pin = Generator.valueToCode(block, 'PIN', Generator.ORDER_NONE) || null;
147+
const event = Generator.getFieldValue(block, 'EVENT') || null;
148+
return `mbit_more.get_pin_event_timestamp(${pin}, ${event})\n`;
149+
};
150+
151+
Generator.microbitMore_getSharedData = function (block) {
152+
const index = Generator.valueToCode(block, 'INDEX', Generator.ORDER_NONE) || null;
153+
return `mbit_more.get_shared_data(${index})\n`;
154+
};
155+
156+
Generator.microbitMore_setSharedData = function (block) {
157+
const index = Generator.valueToCode(block, 'INDEX', Generator.ORDER_NONE) || null;
158+
const value = Generator.valueToCode(block, 'VALUE', Generator.ORDER_NONE) || null;
159+
return `mbit_more.set_shared_data(${index}, ${value})\n`;
160+
};
161+
162+
Generator.microbitMore_whenConnectionChanged = function (block) {
163+
block.isStatement = true;
164+
const state = Generator.getFieldValue(block, 'STATE') || null;
165+
return `${Generator.spriteName()}.when(:mbit_more_connection_changed, ${state}) do\n`;
166+
};
167+
168+
Generator.microbitMore_menu_buttons = function (block) {
169+
const buttons = Generator.quote_(Generator.getFieldValue(block, 'buttons') || 'A');
170+
return [buttons, Generator.ORDER_ATOMIC];
171+
};
172+
173+
Generator.microbitMore_menu_gestures = function (block) {
174+
const gestures = Generator.quote_(Generator.getFieldValue(block, 'gestures') || 'moved');
175+
return [gestures, Generator.ORDER_ATOMIC];
176+
};
177+
178+
Generator.microbitMore_menu_tiltDirectionAny = function (block) {
179+
const tiltDirectionAny = Generator.quote_(Generator.getFieldValue(block, 'tiltDirectionAny') || 'any');
180+
return [tiltDirectionAny, Generator.ORDER_ATOMIC];
181+
};
182+
183+
Generator.microbitMore_menu_tiltDirection = function (block) {
184+
const tiltDirection = Generator.quote_(Generator.getFieldValue(block, 'tiltDirection') || 'front');
185+
return [tiltDirection, Generator.ORDER_ATOMIC];
186+
};
187+
188+
Generator.microbitMore_menu_touchPins = function (block) {
189+
const touchPins = Generator.getFieldValue(block, 'touchPins') || 0;
190+
return [touchPins, Generator.ORDER_ATOMIC];
191+
};
192+
193+
Generator.microbitMore_menu_gpio = function (block) {
194+
const gpio = Generator.getFieldValue(block, 'gpio') || 0;
195+
return [gpio, Generator.ORDER_ATOMIC];
196+
};
197+
198+
Generator.microbitMore_menu_axis = function (block) {
199+
const axis = Generator.quote_(Generator.getFieldValue(block, 'axis') || 'absolute');
200+
return [axis, Generator.ORDER_ATOMIC];
201+
};
202+
203+
Generator.microbitMore_menu_analogIn = function (block) {
204+
const analogIn = Generator.getFieldValue(block, 'analogIn') || 0;
205+
return [analogIn, Generator.ORDER_ATOMIC];
206+
};
207+
208+
Generator.microbitMore_menu_pinMode = function (block) {
209+
const pinMode = Generator.quote_(Generator.getFieldValue(block, 'pinMode') || 'pullUp');
210+
return [pinMode, Generator.ORDER_ATOMIC];
211+
};
212+
213+
Generator.microbitMore_menu_digitalValue = function (block) {
214+
const digitalValue = Generator.getFieldValue(block, 'digitalValue') || 0;
215+
return [digitalValue, Generator.ORDER_ATOMIC];
216+
};
217+
218+
Generator.microbitMore_menu_pinEventTypeMenu = function (block) {
219+
const pinEventTypeMenu = Generator.getFieldValue(block, 'pinEventTypeMenu') || 0;
220+
return [pinEventTypeMenu, Generator.ORDER_ATOMIC];
221+
};
222+
223+
Generator.microbitMore_menu_pinEventTimestampMenu = function (block) {
224+
const pinEventTimestampMenu = Generator.getFieldValue(block, 'pinEventTimestampMenu') || 5;
225+
return [pinEventTimestampMenu, Generator.ORDER_ATOMIC];
226+
};
227+
228+
Generator.microbitMore_menu_sharedDataIndex = function (block) {
229+
const sharedDataIndex = Generator.quote_(Generator.getFieldValue(block, 'sharedDataIndex') || 'absolute');
230+
return [sharedDataIndex, Generator.ORDER_ATOMIC];
231+
};
232+
233+
Generator.microbitMore_menu_connectionStateMenu = function (block) {
234+
const connectionStateMenu =
235+
Generator.quote_(Generator.getFieldValue(block, 'connectionStateMenu') || 'connected');
236+
return [connectionStateMenu, Generator.ORDER_ATOMIC];
237+
};
238+
239+
Generator.matrix = function (block) {
240+
let matrix = Generator.getFieldValue(block, 'MATRIX') || '0000000000000000000000000';
241+
matrix = matrix.replace(/0/g, '.');
242+
matrix = matrix.match(/.{5}/g).map(s => Generator.quote_(s));
243+
return [matrix.join(',\n'), Generator.ORDER_ATOMIC];
244+
};
245+
246+
return Generator;
247+
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import MyBlocksConverter from './my-blocks';
2121
import MusicConverter from './music';
2222
import PenConverter from './pen';
2323
import MicroBitConverter from './microbit';
24+
import MicroBitMoreConverter from './microbit_more';
2425
import EV3Converter from './ev3';
2526
import Wedo2Converter from './wedo2';
2627
import GdxForConverter from './gdx_for';
@@ -80,6 +81,7 @@ class RubyToBlocksConverter {
8081
MusicConverter,
8182
PenConverter,
8283
MicroBitConverter,
84+
MicroBitMoreConverter,
8385
EV3Converter,
8486
Wedo2Converter,
8587
GdxForConverter,

0 commit comments

Comments
 (0)