初始化提交

This commit is contained in:
王立帮
2024-07-19 10:16:00 +08:00
parent 4c7b571f20
commit 4a2d56dcc4
7084 changed files with 741212 additions and 63 deletions

View File

@@ -0,0 +1,3 @@
node_modules
build
origin

View File

@@ -0,0 +1,653 @@
import * as Blockly from 'blockly/core';
const ACTUATOR_HUE = 100//'#b574c2';
export const microbit_music_play_built_in = {
init: function () {
this.jsonInit({
"colour": ACTUATOR_HUE,
"nextStatement": null,
"previousStatement": null,
"inputsInline": true,
"helpUrl": "https://microbit-micropython.readthedocs.io/en/latest/music.html#built-in-melodies",
"message0": Blockly.Msg.MIXLY_MICROBIT_Play_built_in_melody,
"args0": [{
"name": "melody",
"options": [["DADADADUM", "DADADADUM"], ["ENTERTAINER", "ENTERTAINER"], ["PRELUDE", "PRELUDE"], ["ODE", "ODE"], ["NYAN", "NYAN"], ["RINGTONE", "RINGTONE"], ["FUNK", "FUNK"], ["BLUES", "BLUES"], ["BIRTHDAY", "BIRTHDAY"], ["WEDDING", "WEDDING"], ["FUNERAL", "FUNERAL"], ["PUNCHLINE", "PUNCHLINE"], ["PYTHON", "PYTHON"], ["BADDY", "BADDY"], ["CHASE", "CHASE"], ["BA_DING", "BA_DING"], ["WAWAWAWAA", "WAWAWAWAA"], ["JUMP_UP", "JUMP_UP"], ["JUMP_DOWN", "JUMP_DOWN"], ["POWER_UP", "POWER_UP"], ["POWER_DOWN", "POWER_DOWN"]],
"type": "field_dropdown"
}, {
// "check" : "Number",
"type": "input_value",
"name": "PIN"
}, {
"type": "input_dummy"
}, {
"checked": true,
"type": "field_checkbox",
"name": "wait"
}, {
"type": "input_dummy"
}, {
"checked": false,
"type": "field_checkbox",
"name": "loop"
}
]
});
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_Play_built_in_melody1);
}
};
export const microbit_music_play_built_in_easy = {
init: function () {
this.jsonInit({
"colour": ACTUATOR_HUE,
"nextStatement": null,
"previousStatement": null,
"inputsInline": true,
"helpUrl": "https://microbit-micropython.readthedocs.io/en/latest/music.html#built-in-melodies",
"tooltip": "Play one of the built-in melodies. Indicate if you need to wait before continuing or continuously loop the melody.",
"message0": Blockly.Msg.MIXLY_MICROBIT_Play_built_in_melody_easy,
"args0": [{
"name": "melody",
"options": [["DADADADUM", "DADADADUM"], ["ENTERTAINER", "ENTERTAINER"], ["PRELUDE", "PRELUDE"], ["ODE", "ODE"], ["NYAN", "NYAN"], ["RINGTONE", "RINGTONE"], ["FUNK", "FUNK"], ["BLUES", "BLUES"], ["BIRTHDAY", "BIRTHDAY"], ["WEDDING", "WEDDING"], ["FUNERAL", "FUNERAL"], ["PUNCHLINE", "PUNCHLINE"], ["PYTHON", "PYTHON"], ["BADDY", "BADDY"], ["CHASE", "CHASE"], ["BA_DING", "BA_DING"], ["WAWAWAWAA", "WAWAWAWAA"], ["JUMP_UP", "JUMP_UP"], ["JUMP_DOWN", "JUMP_DOWN"], ["POWER_UP", "POWER_UP"], ["POWER_DOWN", "POWER_DOWN"]],
"type": "field_dropdown"
}, {
// "check" : "Number",
"type": "input_value",
"name": "PIN"
}, {
"type": "input_dummy"
}
]
});
}
};
export const microbit_music_pitch_delay = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendValueInput("PIN", Number)
.appendField(Blockly.Msg.MIXLY_TONE)
.appendField(Blockly.Msg.MIXLY_PIN)
.setCheck(Number);
this.appendValueInput('pitch')
.setCheck(Number)
//.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_FREQUENCY);
this.appendValueInput('duration')
.setCheck(Number)
//.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_DURATION);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_MILLIS)
.appendField(Blockly.Msg.MIXLY_MICROBIT_WAIT);
this.appendDummyInput("")
.appendField(new Blockly.FieldCheckbox(true), 'wait');
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_BLOCKGROUP_TONE2);
}
};
export const microbit_music_pitch = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendValueInput("PIN", Number)
.appendField(Blockly.Msg.MIXLY_TONE)
.appendField(Blockly.Msg.MIXLY_PIN)
.setCheck(Number);
this.appendValueInput('pitch')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_FREQUENCY);
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_BLOCKGROUP_TONE);
}
};
export const microbit_music_play_list_of_notes = {
init: function () {
this.jsonInit({
"colour": ACTUATOR_HUE,
"nextStatement": null,
"previousStatement": null,
"inputsInline": true,
"helpUrl": "https://microbit-micropython.readthedocs.io/en/latest/music.html#musical-notation",
"message0": Blockly.Msg.MIXLY_MICROBIT_Play_notes,
"args0": [{
"check": "List",
"type": "input_value",
"name": "notes"
}, {
"type": "input_value",
"name": "PIN"
}, {
"checked": true,
"type": "field_checkbox",
"name": "wait"
}, {
"type": "input_dummy"
}, {
"checked": false,
"type": "field_checkbox",
"name": "loop"
}
]
});
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_Play_notes1);
}
};
export const microbit_music_play_list_of_notes_easy = {
init: function () {
this.jsonInit({
"colour": ACTUATOR_HUE,
"nextStatement": null,
"previousStatement": null,
"inputsInline": true,
"helpUrl": "https://microbit-micropython.readthedocs.io/en/latest/music.html#musical-notation",
"tooltip": "Play a list of notes expressed in the special music language. Indicate if you need to wait before continuing or continuously loop the melody.",
"message0": Blockly.Msg.MIXLY_MICROBIT_Play_notes,
"args0": [{
"check": "List",
"type": "input_value",
"name": "notes"
}, {
"type": "input_value",
"name": "PIN"
}, {
"type": "input_dummy"
}, {
"type": "input_dummy"
}, {
"type": "input_dummy"
}
]
});
}
};
export const microbit_music_reset = {
init: function () {
this.jsonInit({
"colour": ACTUATOR_HUE,
"nextStatement": null,
"previousStatement": null,
"helpUrl": "https://microbit-micropython.readthedocs.io/en/latest/music.html#music.reset",
"message0": Blockly.Msg.MIXLY_MICROBIT_Reset_music
});
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_Reset_music);
}
};
//
export const microbit_music_stop = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendValueInput("PIN")
.appendField(Blockly.Msg.MIXLY_NOTONE)
.appendField(Blockly.Msg.MIXLY_PIN);
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_NOTONE);
}
};
export const microbit_music_get_tempo = {
init: function () {
this.jsonInit({
"colour": ACTUATOR_HUE,
"output": "Array",
"helpUrl": "https://microbit-micropython.readthedocs.io/en/latest/music.html#music.get_tempo",
"message0": Blockly.Msg.MIXLY_MICROBIT_Get_current_tempo
});
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_Get_current_tempo);
}
};
export const tone_set_tempo = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendValueInput('TICKS')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_SET_TEMPO)
.appendField(Blockly.Msg.MICROBIT_ACTUATOR_ticks);
this.appendValueInput('BPM')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_SPEED);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_JS_SET_TEMPO1);
}
}
export const speech_say = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendValueInput('VAR')
.setCheck(String)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_MICROBIT_PY_ACTUATOR_SPEECH_SAY, 'say'], [Blockly.Msg.MIXLY_MICROBIT_PY_ACTUATOR_SPEECH_SING, 'sing'], [Blockly.Msg.MIXLY_MICROBIT_PY_ACTUATOR_SPEECH_PRENOUNCE,
'pronounce']]), "MODE");
this.appendValueInput('pitch')
.setCheck(Number)
.appendField(Blockly.Msg.MICROBIT_SPEECH_pitch);
this.appendValueInput('speed')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_SPEED);
this.appendValueInput('mouth')
.setCheck(Number)
.appendField(Blockly.Msg.MICROBIT_SPEECH_mouth);
this.appendValueInput('throat')
.setCheck(Number)
.appendField(Blockly.Msg.MICROBIT_SPEECH_throat);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setInputsInline(true);
var thisBlock = this;
this.setTooltip(function () {
var mode = thisBlock.getFieldValue('MODE');
var mode0 = Blockly.Msg.MIXLY_MICROBIT_PY_ACTUATOR_SPEECH;
var mode1 = Blockly.Msg.MIXLY_MICROBIT_TYPE_STRING
var TOOLTIPS = {
'say': Blockly.Msg.MIXLY_MICROBIT_PY_ACTUATOR_SPEECH_SAY,
'sing': Blockly.Msg.MIXLY_MICROBIT_PY_ACTUATOR_SPEECH_SING,
'pronounce': Blockly.Msg.MIXLY_MICROBIT_PY_ACTUATOR_SPEECH_PRENOUNCE
};
return mode0 + TOOLTIPS[mode] + mode1;
});
}
};
// export const speech_sing = {
// init: function () {
// this.setColour(ACTUATOR_HUE);
// this.appendValueInput('VAR')
// .setCheck(String)
// .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_ACTUATOR_SPEECH_SING);
// this.appendValueInput('pitch')
// .setCheck(Number)
// .appendField(Blockly.Msg.MICROBIT_SPEECH_pitch);
// this.appendValueInput('speed')
// .setCheck(Number)
// .appendField(Blockly.Msg.MIXLY_SPEED);
// this.appendValueInput('mouth')
// .setCheck(Number)
// .appendField(Blockly.Msg.MICROBIT_SPEECH_mouth);
// this.appendValueInput('throat')
// .setCheck(Number)
// .appendField(Blockly.Msg.MICROBIT_SPEECH_throat);
// this.setPreviousStatement(true);
// this.setNextStatement(true);
// this.setInputsInline(true);
// }
// };
// export const speech_prenounce = {
// init: function () {
// this.setColour(ACTUATOR_HUE);
// this.appendValueInput('VAR')
// .setCheck(String)
// .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_ACTUATOR_SPEECH_PRENOUNCE);
// this.appendValueInput('pitch')
// .setCheck(Number)
// .appendField(Blockly.Msg.MICROBIT_SPEECH_pitch);
// this.appendValueInput('speed')
// .setCheck(Number)
// .appendField(Blockly.Msg.MIXLY_SPEED);
// this.appendValueInput('mouth')
// .setCheck(Number)
// .appendField(Blockly.Msg.MICROBIT_SPEECH_mouth);
// this.appendValueInput('throat')
// .setCheck(Number)
// .appendField(Blockly.Msg.MICROBIT_SPEECH_throat);
// this.setPreviousStatement(true);
// this.setNextStatement(true);
// this.setInputsInline(true);
// }
// };
export const speech_say_easy = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendValueInput('VAR')
.setCheck(String)
.appendField(Blockly.Msg.MIXLY_MICROBIT_PY_ACTUATOR_SPEECH_SAY);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setInputsInline(true);
}
};
export const speech_sing_easy = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendValueInput('VAR')
.setCheck(String)
.appendField(Blockly.Msg.MIXLY_MICROBIT_PY_ACTUATOR_SPEECH_SING);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setInputsInline(true);
}
};
export const speech_pronounce_easy = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendValueInput('VAR')
.setCheck(String)
.appendField(Blockly.Msg.MIXLY_MICROBIT_PY_ACTUATOR_SPEECH_PRENOUNCE);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setInputsInline(true);
}
};
export const speech_translate = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendValueInput('VAR')
.setCheck(String)
.appendField(Blockly.Msg.MICROBIT_SPEECH_translation);
this.setOutput(true, String);
this.setTooltip(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_MAKE + Blockly.Msg.MIXLY_MICROBIT_TYPE_STRING + Blockly.Msg.MICROBIT_SPEECH_translation);
}
};
export const servo_move = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendValueInput("PIN", Number)
.appendField(Blockly.Msg.MIXLY_SERVO)
.appendField(Blockly.Msg.MIXLY_PIN)
.setCheck(Number);
this.appendValueInput("DEGREE", Number)
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_DEGREE_0_180);
// this.appendValueInput("DELAY_TIME", Number)
// .setCheck(Number)
// .setAlign(Blockly.inputs.Align.RIGHT)
// .appendField(Blockly.Msg.MIXLY_DELAY+'('+Blockly.Msg.MIXLY_MILLIS+')');
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_BLOCKGROUP_SERVO_MOVE);
}
};
export const bit_motor_control = {
init: function () {
this.appendValueInput("speed")
.setCheck(null)
.appendField(Blockly.Msg.MIXLY_MOTOR)
.appendField(new Blockly.FieldDropdown([["M1", "1"], ["M2", "2"], ["M3", "3"], ["M4", "4"]]), "Motor")
.appendField(Blockly.Msg.MIXLY_SPEED);
this.appendDummyInput()
.appendField(new Blockly.FieldDropdown([["Forward", "1*"], ["Reverse", "-1*"]]), "mode");
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setColour(ACTUATOR_HUE);
this.setTooltip("");
this.setHelpUrl("");
}
};
//RGB
export const display_rgb_init = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_RGB)
this.appendValueInput("PIN", Number)
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_PIN);
this.appendValueInput("LEDCOUNT")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_RGB_COUNT);
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.MIXLY_RGB_PIN_COUNT);
}
};
export const display_rgb = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_RGB)
// this.appendValueInput("PIN", Number)
// .setCheck(Number)
// .setAlign(Blockly.inputs.Align.RIGHT)
// .appendField(Blockly.Msg.MIXLY_PIN);
this.appendValueInput("_LED_")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_RGB_NUM);
this.appendValueInput("RVALUE")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_RGB_R);
this.appendValueInput("GVALUE")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_RGB_G);
this.appendValueInput("BVALUE")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_RGB_B);
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip('');
this.setTooltip(Blockly.Msg.MIXLY_RGB_NUM_R_G_B);
}
};
export const display_rgb2 = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_RGB)
// this.appendValueInput("PIN", Number)
// .setCheck(Number)
// .setAlign(Blockly.inputs.Align.RIGHT)
// .appendField(Blockly.Msg.MIXLY_PIN);
this.appendValueInput("_LED_")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_RGB_NUM);
this.appendDummyInput("")
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(new Blockly.FieldColour("#ff0000"), "RGB_LED_COLOR");
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
}
};
export const display_rgb_show = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_RGB)
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_ESP32_RGB_WRITE)
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip('');
this.setTooltip(Blockly.Msg.MIXLY_ESP32_MUSIC_WRI);
}
};
export const MP3_INIT = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_SETUP + ' ' + Blockly.Msg.QJ00X_MP3);
this.appendValueInput("RX")
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("TX#");
this.appendValueInput("TX")
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("RX#");
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip();
this.setHelpUrl();
}
};
//MP3播放控制
var MP3_CONTROL_TYPE = [
[Blockly.Msg.MIXLY_MP3_PLAY, "play"],
[Blockly.Msg.MIXLY_MP3_PAUSE, "pause"],
[Blockly.Msg.MIXLY_MP3_NEXT, "next_track"],
[Blockly.Msg.MIXLY_MP3_PREV, "prev_track"],
[Blockly.Msg.MIXLY_MP3_VOL_UP, "inc_vol"],
[Blockly.Msg.MIXLY_MP3_VOL_DOWN, "dec_vol"]
];
//MP3模块
export const MP3_CONTROL = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.QJ00X_MP3);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_STAT)
.appendField(new Blockly.FieldDropdown(MP3_CONTROL_TYPE), "CONTROL_TYPE");
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip();
this.setHelpUrl();
}
};
//MP3循环模式
var MP3_LOOP_MODE_OPTIONS = [
[Blockly.Msg.MIXLY_MP3_LOOP_ALL, "0"],
[Blockly.Msg.MIXLY_MP3_LOOP_FOLDER, "1"],
[Blockly.Msg.MIXLY_MP3_LOOP_ONE, "2"],
[Blockly.Msg.MIXLY_MP3_LOOP_RAM, "3"]
];
//MP3模块循环模式
export const MP3_LOOP_MODE = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.QJ00X_MP3);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_MP3_LOOP_MODE)
.appendField(Blockly.Msg.MIXLY_STAT)
.appendField(new Blockly.FieldDropdown(MP3_LOOP_MODE_OPTIONS), "LOOP_MODE");
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip();
this.setHelpUrl();
}
};
//MP3 设置EQ
var MP3_EQ_MODE_OPTIONS = [
[Blockly.Msg.MIXLY_MP3_EQ_NORMAL, "0"],
[Blockly.Msg.MIXLY_MP3_EQ_POP, "1"],
[Blockly.Msg.MIXLY_MP3_EQ_ROCK, "2"],
[Blockly.Msg.MIXLY_MP3_EQ_JAZZ, "3"],
[Blockly.Msg.MIXLY_MP3_EQ_CLASSIC, "4"],
[Blockly.Msg.MIXLY_MP3_EQ_BASS, "5"]
];
//MP3模块EQ模式
export const MP3_EQ_MODE = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.QJ00X_MP3);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_MP3_EQ_MODE)
.appendField(Blockly.Msg.MIXLY_STAT)
.appendField(new Blockly.FieldDropdown(MP3_EQ_MODE_OPTIONS), "EQ_MODE");
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip();
this.setHelpUrl();
}
};
//MP3模块设置音量
export const MP3_VOL = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.QJ00X_MP3);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_MP3_VOL);
this.appendValueInput("vol", Number)
.appendField(Blockly.Msg.MIXLY_STAT)
.setCheck(Number);
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip();
this.setHelpUrl();
}
};
//MP3模块播放第N首
export const MP3_PLAY_NUM = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.QJ00X_MP3);
this.appendValueInput("NUM", Number)
.appendField(Blockly.Msg.MIXLY_MP3_PLAY_NUM)
.setCheck(Number);
this.appendDummyInput("")
.appendField("首");
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip();
this.setHelpUrl();
}
};
export const MP3_PLAY_FOLDER = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.QJ00X_MP3);
this.appendValueInput("FOLDER", Number)
.appendField(Blockly.Msg.DFPLAYER_MINI_FOLDER)
.setCheck(Number);
this.appendValueInput("NUM", Number)
.appendField(Blockly.Msg.MIXLY_MP3_PLAY_NUM)
.setCheck(Number);
this.appendDummyInput("")
.appendField("首");
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip();
this.setHelpUrl();
}
};

View File

@@ -0,0 +1,306 @@
import * as Blockly from 'blockly/core';
import { Profile } from 'mixly';
const COMMUNICATE_HUE = 140; //'#3288dd';
export const radio_ons = {
init: function () {
this.setColour(225);
this.appendDummyInput()
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_MICROBIT_PY_COMMUNICATE_ON, 'on'], [Blockly.Msg.MIXLY_MICROBIT_PY_COMMUNICATE_OFF, 'off'], [Blockly.Msg.HTML_RESET, 'reset']]), "type")
.appendField(Blockly.Msg.MIXLY_MICROBIT_PY_COMMUNICATE_WIFI);
this.setInputsInline(true);
this.setOutput(false);
this.setPreviousStatement(true);
this.setNextStatement(true);
var thisBlock = this;
this.setTooltip(function () {
var mode = thisBlock.getFieldValue('type');
var mode0 = Blockly.Msg.MIXLY_MICROBIT_PY_COMMUNICATE_WIFI;
var TOOLTIPS = {
'on': Blockly.Msg.MIXLY_MICROBIT_PY_COMMUNICATE_ON,
'off': Blockly.Msg.MIXLY_MICROBIT_PY_COMMUNICATE_OFF,
'reset': Blockly.Blockly.Msg.HTML_RESET
};
return TOOLTIPS[mode] + mode0;
});
}
};
export const microbit_radio_on = {
init: function () {
this.jsonInit({
"colour": 225,
"nextStatement": null,
"previousStatement": null,
"helpUrl": "https://microbit-micropython.readthedocs.io/en/latest/radio.html#radio.on",
"tooltip": "Turn on the radio. This needs to be explicitly called since the radio draws power and takes up memory that you may otherwise need.",
"message0": Blockly.Msg.MIXLY_MICROBIT_Switch_on_radio
});
}
};
export const microbit_radio_off = {
init: function () {
this.jsonInit({
"colour": 225,
"nextStatement": null,
"previousStatement": null,
"helpUrl": "https://microbit-micropython.readthedocs.io/en/latest/radio.html#radio.off",
"tooltip": "Turn off the radio, thus saving power and memory.",
"message0": Blockly.Msg.MIXLY_MICROBIT_Switch_off_radio
});
}
};
export const microbit_radio_config = {
init: function () {
this.jsonInit({
"colour": 225,
"nextStatement": null,
"previousStatement": null,
"helpUrl": "https://microbit-micropython.readthedocs.io/en/latest/radio.html#radio.config",
"tooltip": Blockly.Msg.MIXLY_MICROBIT_Configure_radio1,
"message0": Blockly.Msg.MIXLY_MICROBIT_Configure_radio,
"args0": [{
"min": 4,
"value": 32,
"type": "input_value",
"max": 251,
"name": "length"
}, {
"type": "input_dummy"
}, {
"min": 1,
"value": 3,
"type": "input_value",
"max": 32,
"name": "queue"
}, {
"type": "input_dummy"
}, {
"min": 0,
"value": 7,
"type": "input_value",
"max": 100,
"name": "channel"
}, {
"type": "input_dummy"
}, {
"name": "power",
"type": "input_value"
}, {
"type": "input_dummy"
}, {
"name": "address",
"type": "input_value"
}, {
"type": "input_dummy"
}, {
"name": "group",
"type": "input_value"
}, {
"type": "input_dummy"
}, {
"name": "data_rate",
"type": "input_value"
}
]
});
}
};
export const microbit_radio_reset = {
init: function () {
this.jsonInit({
"colour": 225,
"nextStatement": null,
"previousStatement": null,
"helpUrl": "https://microbit-micropython.readthedocs.io/en/latest/radio.html#radio.reset",
"tooltip": "Reset the radio to default settings.",
"message0": Blockly.Msg.MIXLY_MICROBIT_Reset_radio
});
}
};
export const microbit_radio_send_string = {
init: function () {
this.jsonInit({
"colour": 225,
"nextStatement": null,
"previousStatement": null,
"helpUrl": "https://microbit-micropython.readthedocs.io/en/latest/radio.html#radio.send",
"tooltip": "Broadcast a text message.",
"message0": Blockly.Msg.MIXLY_MICROBIT_Send_message,
"args0": [{
"check": "String",
"type": "input_value",
"name": "message"
}
]
});
}
};
export const radio_send_string = {
init: function () {
this.setColour(225);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_RADIO_SEND);
this.appendDummyInput()
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_MICROBIT_MSG, 'send'],
[Blockly.Msg.MIXLY_MICROBIT_MSG_BYTE, 'send_bytes']]), "type")
this.appendValueInput('data')
// .setCheck(String)
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_Send_message1);
}
}
export const microbit_radio_receive = {
init: function () {
this.jsonInit({
"colour": 225,
"output": "String",
"helpUrl": "https://microbit-micropython.readthedocs.io/en/latest/radio.html#radio.receive",
"tooltip": Blockly.Msg.MIXLY_MICROBIT_Receive_message,
"message0": Blockly.Msg.MIXLY_MICROBIT_Receive_message
});
}
};
export const radio_receive_string = {
init: function () {
this.setColour(225);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_Receive_message);
this.appendDummyInput()
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_MICROBIT_MSG, 'receive'],
[Blockly.Msg.MIXLY_MICROBIT_MSG_BYTE, 'receive_bytes'],
[Blockly.Msg.MIXLY_MICROBIT_MSG_FULL, 'receive_full']]), "type")
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_Receive_message);
}
}
export const i2c_init = {
init: function () {
this.setColour(COMMUNICATE_HUE);
this.appendValueInput("RX", Number)
//.appendField(Blockly.Msg.MIXLY_SETUP)
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_I2C_SETUP)
.appendField("sda")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendValueInput("TX", Number)
.appendField("scl")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendValueInput('freq')
.setCheck(Number)
.appendField("频率")
.setAlign(Blockly.inputs.Align.RIGHT);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
}
};
export const i2c_read = {
init: function () {
this.setColour(COMMUNICATE_HUE);
this.appendValueInput('address')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_I2C_READ_ADDRESS);
this.appendValueInput('data')
.setCheck(Number)
.appendField(Blockly.Msg.LANG_MATH_BYTE);
this.appendDummyInput()
.appendField(Blockly.Msg.CONTROLS_REPEAT_TITLE_REPEAT)
.appendField(new Blockly.FieldCheckbox(false), "is_repeated");
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_JS_I2C_READ);
}
}
export const i2c_write = {
init: function () {
this.setColour(COMMUNICATE_HUE);
this.appendValueInput('address')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_I2C_WRITE_ADDRESS);
this.appendValueInput('data')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_I2C_VALUE);
this.appendDummyInput()
.appendField(Blockly.Msg.CONTROLS_REPEAT_TITLE_REPEAT)
.appendField(new Blockly.FieldCheckbox(false), "is_repeated");
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_JS_I2C_WRITE);
}
}
export const spi_init = {
init: function () {
this.jsonInit({
"colour": COMMUNICATE_HUE,
"nextStatement": null,
"previousStatement": null,
"message0": Blockly.Msg.MIXLY_MICROBIT_SPI_INIT,
"args0": [{
"value": 1000000,
"type": "field_number",
"name": "freq"
}, {
"type": "input_dummy"
}, {
"value": 8,
"type": "field_number",
"name": "bits"
}, {
"type": "input_dummy"
}, {
"value": 0,
"type": "field_number",
"name": "mode"
}, {
"type": "input_dummy"
}, {
"name": "mosi",
"options": Profile.default.digital,
"type": "field_dropdown"
}, {
"name": "miso",
"options": Profile.default.digital,
"type": "field_dropdown"
}, {
"name": "sck",
"options": Profile.default.digital,
"type": "field_dropdown"
}
]
});
this.setFieldValue("15", "mosi")
this.setFieldValue("14", "miso")
this.setFieldValue("13", "sck")
}
};
export const spi_write = {
init: function () {
this.setColour(COMMUNICATE_HUE);
this.appendValueInput('data')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_SPI_WRITE);
this.setOutput(true, Number);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_JS_SPI_WRITE);
}
}

View File

@@ -0,0 +1,759 @@
import * as Blockly from 'blockly/core';
const DISPLAY_HUE = 180; //'#cc6688' //180;
// Blockly.FieldColour.COLOURS = ['#f00', '#e00', '#d00', '#c00', '#b00', '#a00',
// '#800', '#600', '#400', '#000'];
// Blockly.FieldColour.COLUMNS = 5;
// var IMG = [["HEART", "HEART"], ["HEART_SMALL", "HEART_SMALL"], ["HAPPY", "HAPPY"], ["SMILE", "SMILE"], ["SAD", "SAD"], ["CONFUSED", "CONFUSED"], ["ANGRY", "ANGRY"], ["ASLEEP", "ASLEEP"], ["SURPRISED", "SURPRISED"], ["SILLY", "SILLY"], ["FABULOUS", "FABULOUS"], ["MEH", "MEH"], ["YES", "YES"], ["NO", "NO"], ["CLOCK12", "CLOCK12"], ["CLOCK11", "CLOCK11"], ["CLOCK10", "CLOCK10"], ["CLOCK9", "CLOCK9"], ["CLOCK8", "CLOCK8"], ["CLOCK7", "CLOCK7"], ["CLOCK6", "CLOCK6"], ["CLOCK5", "CLOCK5"], ["CLOCK4", "CLOCK4"], ["CLOCK3", "CLOCK3"], ["CLOCK2", "CLOCK2"], ["CLOCK1", "CLOCK1"], ["ARROW_N", "ARROW_N"], ["ARROW_NE", "ARROW_NE"], ["ARROW_E", "ARROW_E"], ["ARROW_SE", "ARROW_SE"], ["ARROW_S", "ARROW_S"], ["ARROW_SW", "ARROW_SW"], ["ARROW_W", "ARROW_W"], ["ARROW_NW", "ARROW_NW"], ["TRIANGLE", "TRIANGLE"], ["TRIANGLE_LEFT", "TRIANGLE_LEFT"], ["CHESSBOARD", "CHESSBOARD"], ["DIAMOND", "DIAMOND"], ["DIAMOND_SMALL", "DIAMOND_SMALL"], ["SQUARE", "SQUARE"], ["SQUARE_SMALL", "SQUARE_SMALL"], ["RABBIT", "RABBIT"], ["COW", "COW"], ["MUSIC_CROTCHET", "MUSIC_CROTCHET"], ["MUSIC_QUAVER", "MUSIC_QUAVER"], ["MUSIC_QUAVERS", "MUSIC_QUAVERS"], ["PITCHFORK", "PITCHFORK"], ["XMAS", "XMAS"], ["PACMAN", "PACMAN"], ["TARGET", "TARGET"], ["TSHIRT", "TSHIRT"], ["ROLLERSKATE", "ROLLERSKATE"], ["DUCK", "DUCK"], ["HOUSE", "HOUSE"], ["TORTOISE", "TORTOISE"], ["BUTTERFLY", "BUTTERFLY"], ["STICKFIGURE", "STICKFIGURE"], ["GHOST", "GHOST"], ["SWORD", "SWORD"], ["GIRAFFE", "GIRAFFE"], ["SKULL", "SKULL"], ["UMBRELLA", "UMBRELLA"], ["SNAKE", "SNAKE"], ["ALL_CLOCKS", "ALL_CLOCKS"], ["ALL_ARROWS", "ALL_ARROWS"]];
export const microbit_display_clear = {
init: function () {
this.jsonInit({
"colour": DISPLAY_HUE,
"nextStatement": null,
"previousStatement": null,
"helpUrl": "https://microbit-micropython.readthedocs.io/en/latest/display.html#microbit.display.clear",
"message0": Blockly.Msg.MIXLY_MICROBIT_Clear_display
});
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_Clear_display);
}
};
export const monitor_get_pixel = {
init: function () {
this.setColour(DISPLAY_HUE);
this.appendValueInput('x')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_GET)
.appendField(Blockly.Msg.MIXLY_BRIGHTNESS)
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_MONITOR_GET_POINT_X);
this.appendValueInput('y')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_MONITOR_PLOT_POINT_Y);
this.setInputsInline(true);
this.setOutput(true, Number);
this.setTooltip(Blockly.Msg.MIXLY_BRIGHTNESS1);
}
};
export const monitor_bright_point = {
init: function () {
this.setColour(DISPLAY_HUE);
this.appendValueInput('x')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_MONITOR_SET_BRIGHTNESS)
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_MONITOR_GET_POINT_X);
this.appendValueInput('y')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_MONITOR_PLOT_POINT_Y);
this.appendValueInput('brightness')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_BRIGHTNESS);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_BRIGHTNESS2);
}
};
export const monitor_show_image_or_string = {
init: function () {
this.setColour(DISPLAY_HUE);
this.appendValueInput('data')
.setCheck([String, "microbit_image"])
.appendField(Blockly.Msg.MIXLY_MICROBIT_SHOW_IMAGE_OR_STRING);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_SHOW_IMAGE_OR_STRING);
}
};
export const monitor_scroll_string = {
init: function () {
this.setColour(DISPLAY_HUE);
this.appendValueInput('data')
.setCheck(String)
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_MONITOR_SCROLL_STRING);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
}
};
export const monitor_scroll_string_with_delay = {
init: function () {
this.setColour(DISPLAY_HUE);
this.appendValueInput('data')
.setCheck(String)
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_MONITOR_SCROLL_STRING);
this.appendValueInput('delay')
.setCheck(null)
.appendField(Blockly.Msg.MIXLY_DELAY);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MILLIS);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
}
};
export const microbit_display_show_image = {
init: function () {
this.setColour(DISPLAY_HUE);
this.appendValueInput('PIN', String)
.setCheck("microbit_image")
.appendField(Blockly.Msg.OLED_BITMAP);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.OLED_BITMAP);
}
};
export const microbit_display_show_default_image = {
init: function () {
this.jsonInit({
"colour": DISPLAY_HUE,
"InputsInline": true,
"nextStatement": null,
"previousStatement": null,
"helpUrl": "https://microbit-micropython.readthedocs.io/en/latest/display.html#microbit.display.show",
"tooltip": "Show the referenced image on the display.",
"message0": Blockly.Msg.OLED_BITMAP,
"args0": [{
"name": "image",
"options": [["HEART", "HEART"], ["HEART_SMALL", "HEART_SMALL"], ["HAPPY", "HAPPY"], ["SMILE", "SMILE"], ["SAD", "SAD"], ["CONFUSED", "CONFUSED"], ["ANGRY", "ANGRY"], ["ASLEEP", "ASLEEP"], ["SURPRISED", "SURPRISED"], ["SILLY", "SILLY"], ["FABULOUS", "FABULOUS"], ["MEH", "MEH"], ["YES", "YES"], ["NO", "NO"], ["CLOCK12", "CLOCK12"], ["CLOCK11", "CLOCK11"], ["CLOCK10", "CLOCK10"], ["CLOCK9", "CLOCK9"], ["CLOCK8", "CLOCK8"], ["CLOCK7", "CLOCK7"], ["CLOCK6", "CLOCK6"], ["CLOCK5", "CLOCK5"], ["CLOCK4", "CLOCK4"], ["CLOCK3", "CLOCK3"], ["CLOCK2", "CLOCK2"], ["CLOCK1", "CLOCK1"], ["ARROW_N", "ARROW_N"], ["ARROW_NE", "ARROW_NE"], ["ARROW_E", "ARROW_E"], ["ARROW_SE", "ARROW_SE"], ["ARROW_S", "ARROW_S"], ["ARROW_SW", "ARROW_SW"], ["ARROW_W", "ARROW_W"], ["ARROW_NW", "ARROW_NW"], ["TRIANGLE", "TRIANGLE"], ["TRIANGLE_LEFT", "TRIANGLE_LEFT"], ["CHESSBOARD", "CHESSBOARD"], ["DIAMOND", "DIAMOND"], ["DIAMOND_SMALL", "DIAMOND_SMALL"], ["SQUARE", "SQUARE"], ["SQUARE_SMALL", "SQUARE_SMALL"], ["RABBIT", "RABBIT"], ["COW", "COW"], ["MUSIC_CROTCHET", "MUSIC_CROTCHET"], ["MUSIC_QUAVER", "MUSIC_QUAVER"], ["MUSIC_QUAVERS", "MUSIC_QUAVERS"], ["PITCHFORK", "PITCHFORK"], ["XMAS", "XMAS"], ["PACMAN", "PACMAN"], ["TARGET", "TARGET"], ["TSHIRT", "TSHIRT"], ["ROLLERSKATE", "ROLLERSKATE"], ["DUCK", "DUCK"], ["HOUSE", "HOUSE"], ["TORTOISE", "TORTOISE"], ["BUTTERFLY", "BUTTERFLY"], ["STICKFIGURE", "STICKFIGURE"], ["GHOST", "GHOST"], ["SWORD", "SWORD"], ["GIRAFFE", "GIRAFFE"], ["SKULL", "SKULL"], ["UMBRELLA", "UMBRELLA"], ["SNAKE", "SNAKE"], ["ALL_CLOCKS", "ALL_CLOCKS"], ["ALL_ARROWS", "ALL_ARROWS"]],
"type": "field_dropdown"
}
]
});
}
};
export const microbit_display_show_animation = {
init: function () {
this.jsonInit({
"colour": DISPLAY_HUE,
"inputsInline": true,
"nextStatement": null,
"previousStatement": null,
"helpUrl": "https://microbit-micropython.readthedocs.io/en/latest/display.html#microbit.display.show",
"message0": Blockly.Msg.MIXLY_MICROBIT_Animate_images_or_string,
"args0": [{
"check": [String, "List"],
"type": "input_value",
"name": "images"
}, {
"type": "input_value",
"name": "delay"
}, {
"type": "input_dummy"
}, {
"checked": true,
"type": "field_checkbox",
"name": "wait"
}, {
"type": "input_dummy"
}, {
"checked": false,
"type": "field_checkbox",
"name": "loop"
}, {
"type": "input_dummy"
}, {
"checked": false,
"type": "field_checkbox",
"name": "clear"
}
]
});
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_JS_MONITOR_SHOW_delay + Blockly.Msg.MIXLY_MICROBIT_Animate_images1);
}
};
export const microbit_display_scroll_string_animation = {
init: function () {
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_MONITOR_SCROLL_STRING);
this.jsonInit({
"colour": DISPLAY_HUE,
"inputsInline": true,
"nextStatement": null,
"previousStatement": null,
"helpUrl": "https://microbit-micropython.readthedocs.io/en/latest/display.html#microbit.display.show",
"tooltip": "Display the list of images as an animation with a certain delay between each frame. Indicate if you need to wait before continuing, continuously loop the animation and clear the display when finished.",
"message0": Blockly.Msg.MIXLY_MICROBIT_SHOW_STRING,
"args0": [{
"check": String,
"type": "input_value",
"name": "images"
}, {
"type": "input_value",
"name": "delay"
}, {
"type": "input_dummy"
}, {
"checked": true,
"type": "field_checkbox",
"name": "wait"
}, {
"type": "input_dummy"
}, {
"checked": false,
"type": "field_checkbox",
"name": "loop"
}, {
"type": "input_dummy"
}, {
"checked": false,
"type": "field_checkbox",
"name": "clear"
}
]
});
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_JS_MONITOR_SCROLL_STRING);
}
};
export const microbit_display_scroll = {
init: function () {
this.jsonInit({
"colour": DISPLAY_HUE,
"nextStatement": null,
"previousStatement": null,
"helpUrl": "https://microbit-micropython.readthedocs.io/en/latest/display.html#microbit.display.scroll",
"tooltip": "Scroll the referenced text across the display.",
"message0": Blockly.Msg.MIXLY_MICROBIT_Scroll_message,
"args0": [{
"check": "String",
"type": "input_value",
"name": "message"
}
]
});
}
};
export const microbit_display_on = {
init: function () {
this.setColour(DISPLAY_HUE);
this.appendDummyInput()
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_MICROBIT_Turn_on_display, 'on'], [Blockly.Msg.MIXLY_MICROBIT_Turn_off_display, 'off']]), 'on_off')
.appendField(Blockly.Msg.MIXLY_MICROBIT_monitor);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setInputsInline(true);
var thisBlock = this;
this.setTooltip(function () {
var mode = thisBlock.getFieldValue('on_off');
var mode0 = Blockly.Msg.MIXLY_MICROBIT_monitor;
var TOOLTIPS = {
'on': Blockly.Msg.MIXLY_MICROBIT_Turn_on_display,
'off': Blockly.Msg.MIXLY_MICROBIT_Turn_off_display
};
return TOOLTIPS[mode] + mode0;
});
}
};
export const microbit_display_off = {
init: function () {
this.jsonInit({
"colour": DISPLAY_HUE,
"nextStatement": null,
"previousStatement": null,
"helpUrl": "https://microbit-micropython.readthedocs.io/en/latest/display.html#microbit.display.off",
"tooltip": "Turn off the display.",
"message0": Blockly.Msg.MIXLY_MICROBIT_Turn_off_display
});
}
};
export const microbit_display_is_on = {
init: function () {
this.jsonInit({
"colour": DISPLAY_HUE,
"output": "Boolean",
"helpUrl": "https://microbit-micropython.readthedocs.io/en/latest/display.html#microbit.display.is_on",
"message0": Blockly.Msg.MIXLY_MICROBIT_Display_is_on
});
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_Display_is_on1);
}
};
export const microbit_image_builtins = {
init: function () {
this.jsonInit({
"colour": DISPLAY_HUE,
"args0": [{
"name": "image",
"options": [["HEART", "HEART"], ["HEART_SMALL", "HEART_SMALL"], ["HAPPY", "HAPPY"], ["SMILE", "SMILE"], ["SAD", "SAD"], ["CONFUSED", "CONFUSED"], ["ANGRY", "ANGRY"], ["ASLEEP", "ASLEEP"], ["SURPRISED", "SURPRISED"], ["SILLY", "SILLY"], ["FABULOUS", "FABULOUS"], ["MEH", "MEH"], ["YES", "YES"], ["NO", "NO"], ["CLOCK12", "CLOCK12"], ["CLOCK11", "CLOCK11"], ["CLOCK10", "CLOCK10"], ["CLOCK9", "CLOCK9"], ["CLOCK8", "CLOCK8"], ["CLOCK7", "CLOCK7"], ["CLOCK6", "CLOCK6"], ["CLOCK5", "CLOCK5"], ["CLOCK4", "CLOCK4"], ["CLOCK3", "CLOCK3"], ["CLOCK2", "CLOCK2"], ["CLOCK1", "CLOCK1"], ["ARROW_N", "ARROW_N"], ["ARROW_NE", "ARROW_NE"], ["ARROW_E", "ARROW_E"], ["ARROW_SE", "ARROW_SE"], ["ARROW_S", "ARROW_S"], ["ARROW_SW", "ARROW_SW"], ["ARROW_W", "ARROW_W"], ["ARROW_NW", "ARROW_NW"], ["TRIANGLE", "TRIANGLE"], ["TRIANGLE_LEFT", "TRIANGLE_LEFT"], ["CHESSBOARD", "CHESSBOARD"], ["DIAMOND", "DIAMOND"], ["DIAMOND_SMALL", "DIAMOND_SMALL"], ["SQUARE", "SQUARE"], ["SQUARE_SMALL", "SQUARE_SMALL"], ["RABBIT", "RABBIT"], ["COW", "COW"], ["MUSIC_CROTCHET", "MUSIC_CROTCHET"], ["MUSIC_QUAVER", "MUSIC_QUAVER"], ["MUSIC_QUAVERS", "MUSIC_QUAVERS"], ["PITCHFORK", "PITCHFORK"], ["XMAS", "XMAS"], ["PACMAN", "PACMAN"], ["TARGET", "TARGET"], ["TSHIRT", "TSHIRT"], ["ROLLERSKATE", "ROLLERSKATE"], ["DUCK", "DUCK"], ["HOUSE", "HOUSE"], ["TORTOISE", "TORTOISE"], ["BUTTERFLY", "BUTTERFLY"], ["STICKFIGURE", "STICKFIGURE"], ["GHOST", "GHOST"], ["SWORD", "SWORD"], ["GIRAFFE", "GIRAFFE"], ["SKULL", "SKULL"], ["UMBRELLA", "UMBRELLA"], ["SNAKE", "SNAKE"], ["ALL_CLOCKS", "ALL_CLOCKS"], ["ALL_ARROWS", "ALL_ARROWS"]],
"type": "field_dropdown"
}
],
"output": ["microbit_image", "List"],
"helpUrl": "https://microbit-micropython.readthedocs.io/en/latest/image.html#attributes",
"tooltip": Blockly.Msg.MIXLY_MICROBIT_Built_in_image1,
"message0": Blockly.Msg.MIXLY_MICROBIT_Built_in_image
});
}
};
export const microbit_image_copy = {
init: function () {
this.jsonInit({
"colour": DISPLAY_HUE,
"args0": [{
"check": ["microbit_image", "List", String],
"type": "input_value",
"name": "image"
}
],
"output": "microbit_image",
"helpUrl": "https://microbit-micropython.readthedocs.io/en/latest/image.html#microbit.Image.copy",
"message0": Blockly.Msg.MIXLY_MICROBIT_Copy_image
});
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_Copy_image1);
}
};
export const microbit_image_invert = {
init: function () {
this.jsonInit({
"colour": DISPLAY_HUE,
"args0": [{
"check": ["microbit_image", "List", String],
"type": "input_value",
"name": "image"
}
],
"output": "microbit_image",
"helpUrl": "https://microbit-micropython.readthedocs.io/en/latest/image.html#microbit.Image.invert",
"message0": Blockly.Msg.MIXLY_MICROBIT_Invert_image
});
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_Invert_image1);
}
};
export const microbit_image_create = {
init: function () {
this.jsonInit({
"colour": DISPLAY_HUE,
"args0": [{
"type": "input_dummy"
}, {
"colour": "#000000",
"type": "field_colour",
"name": "00"
}, {
"colour": "#000000",
"type": "field_colour",
"name": "01"
}, {
"colour": "#000000",
"type": "field_colour",
"name": "02"
}, {
"colour": "#000000",
"type": "field_colour",
"name": "03"
}, {
"colour": "#000000",
"type": "field_colour",
"name": "04"
}, {
"type": "input_dummy"
}, {
"colour": "#000000",
"type": "field_colour",
"name": "10"
}, {
"colour": "#000000",
"type": "field_colour",
"name": "11"
}, {
"colour": "#000000",
"type": "field_colour",
"name": "12"
}, {
"colour": "#000000",
"type": "field_colour",
"name": "13"
}, {
"colour": "#000000",
"type": "field_colour",
"name": "14"
}, {
"type": "input_dummy"
}, {
"colour": "#000000",
"type": "field_colour",
"name": "20"
}, {
"colour": "#000000",
"type": "field_colour",
"name": "21"
}, {
"colour": "#000000",
"type": "field_colour",
"name": "22"
}, {
"colour": "#000000",
"type": "field_colour",
"name": "23"
}, {
"colour": "#000000",
"type": "field_colour",
"name": "24"
}, {
"type": "input_dummy"
}, {
"colour": "#000000",
"type": "field_colour",
"name": "30"
}, {
"colour": "#000000",
"type": "field_colour",
"name": "31"
}, {
"colour": "#000000",
"type": "field_colour",
"name": "32"
}, {
"colour": "#000000",
"type": "field_colour",
"name": "33"
}, {
"colour": "#000000",
"type": "field_colour",
"name": "34"
}, {
"type": "input_dummy"
}, {
"colour": "#000000",
"type": "field_colour",
"name": "40"
}, {
"colour": "#000000",
"type": "field_colour",
"name": "41"
}, {
"colour": "#000000",
"type": "field_colour",
"name": "42"
}, {
"colour": "#000000",
"type": "field_colour",
"name": "43"
}, {
"colour": "#000000",
"type": "field_colour",
"name": "44"
}
],
"output": "microbit_image",
"helpUrl": "https://microbit-micropython.readthedocs.io/en/latest/image.html#microbit.Image",
"message0": Blockly.Msg.MIXLY_MICROBIT_Create_image
});
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_Create_image1);
}
};
export const image_shift = {
init: function () {
var OPERATORS = [
[Blockly.Msg.MIXLY_UP, 'up'],
[Blockly.Msg.MIXLY_DOWN, 'down'],
[Blockly.Msg.MIXLY_LEFT, 'left'],
[Blockly.Msg.MIXLY_RIGHT, 'right'],
];
//this.setHelpUrl(Blockly.Msg.MATH_TRIG_HELPURL);
this.setColour(DISPLAY_HUE);
this.setOutput(true, "microbit_image");
this.setInputsInline(true);
this.appendValueInput('img')
.appendField(Blockly.Msg.DISPLAY_IMAGE_LET)
.setCheck(["microbit_image", "List", String]);
this.appendDummyInput('')
.appendField(Blockly.Msg.DISPLAY_IMAGE_LET2)
.appendField(new Blockly.FieldDropdown(OPERATORS), 'OP');
this.appendValueInput('val')
.appendField(Blockly.Msg.DISPLAY_IMAGE_SHIFT)
.setCheck(Number);
this.appendDummyInput('')
.appendField(Blockly.Msg.DISPLAY_IMAGE_UNIT)
var thisBlock = this;
this.setTooltip(function () {
var mode = thisBlock.getFieldValue('OP');
var mode0 = Blockly.Msg.DISPLAY_IMAGE_LET;
var mode1 = Blockly.Msg.DISPLAY_IMAGE_LET2;
var mode2 = Blockly.Msg.DISPLAY_IMAGE_LET3;
var TOOLTIPS = {
'up': Blockly.Msg.MIXLY_UP,
'down': Blockly.Msg.MIXLY_DOWN,
'left': Blockly.Msg.MIXLY_LEFT,
'right': Blockly.Msg.MIXLY_RIGHT
};
return mode0 + mode1 + TOOLTIPS[mode] + mode2;
});
}
};
export const image_arithmetic = {
init: function () {
var OPERATORS = [
[Blockly.Msg.MICROBIT_DISPLAY_UNION, '+'],
[Blockly.Msg.MICROBIT_DISPLAY_MINUS, '-']
];
//this.setHelpUrl(Blockly.Msg.MATH_ARITHMETIC_HELPURL);
this.setColour(DISPLAY_HUE);
this.setOutput(true, "microbit_image");
this.appendValueInput('A')
// .setCheck(["microbit_image", "List", String])
.appendField(Blockly.Msg.MICROBIT_DISPLAY_MERGE_SHAPE);
this.appendValueInput('B')
// .setCheck(["microbit_image", "List", String])
.appendField(new Blockly.FieldDropdown(OPERATORS), 'OP');
this.setInputsInline(true);
var thisBlock = this;
this.setTooltip(function () {
var mode = thisBlock.getFieldValue('OP');
var TOOLTIPS = {
'+': Blockly.Msg.MIXLY_MICROBIT_image_add,
'-': Blockly.Msg.MIXLY_MICROBIT_image_reduce
};
return TOOLTIPS[mode];
});
}
};
// export const microbit_display_scroll_string = {
// init : function () {
// this.jsonInit({
// "colour" : DISPLAY_HUE,
// "inputsInline": true,
// "nextStatement" : null,
// "previousStatement" : null,
// "helpUrl" : "https://microbit-micropython.readthedocs.io/en/latest/display.html#microbit.display.show",
// "tooltip" : "Display the list of images as an animation with a certain delay between each frame. Indicate if you need to wait before continuing, continuously loop the animation and clear the display when finished.",
// "message0" : Blockly.Msg.MIXLY_MICROBIT_Scroll_string,
// "args0" : [{
// "check" : String,
// "type" : "input_value",
// "name" : "images"
// }, {
// "type" : "input_value",
// "name" : "delay"
// }, {
// "type" : "input_dummy"
// }, {
// "checked" : true,
// "type" : "field_checkbox",
// "name" : "wait"
// }, {
// "type" : "input_dummy"
// }, {
// "checked" : false,
// "type" : "field_checkbox",
// "name" : "loop"
// }, {
// "type" : "input_dummy"
// }, {
// "checked" : false,
// "type" : "field_checkbox",
// "name" : "clear"
// }
// ]
// });
// }
// };
export const group_lcd_print = {
init: function () {
this.setColour(DISPLAY_HUE);
this.appendValueInput("TEXT", String)
.setCheck([String, Number])
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_DF_LCD)
.appendField('mylcd')
//.appendField(new Blockly.FieldTextInput('mylcd'), 'VAR')
.appendField(Blockly.Msg.MIXLY_LCD_PRINT1);
this.appendValueInput("TEXT2", String)
.setCheck([String, Number])
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_LCD_PRINT2);
/*
this.appendValueInput("TEXT3", String)
.setCheck([String,Number])
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_LCD_PRINT3);
this.appendValueInput("TEXT4", String)
.setCheck([String,Number])
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_LCD_PRINT4);
*/
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.MIXLY_LCD_PRINT4_TOOLTIP);
}
};
export const group_lcd_init = {
init: function () {
this.setColour(DISPLAY_HUE);
this.appendValueInput('device')
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_SETUP)
.appendField(Blockly.Msg.MIXLY_DF_LCD)
.appendField('1602')
.appendField('mylcd')
.appendField(Blockly.Msg.MIXLY_LCD_ADDRESS);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_SETUP + Blockly.Msg.MIXLY_DF_LCD + Blockly.Msg.MIXLY_LCD_ADDRESS);
}
};
export const group_lcd_print2 = {
init: function () {
this.setColour(DISPLAY_HUE);
this.appendValueInput("row", Number)
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_DF_LCD)
.appendField('mylcd')
.appendField(Blockly.Msg.MIXLY_LCD_ROW);
this.appendValueInput("column", Number)
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_LCD_COLUMN);
this.appendValueInput("TEXT", String)
.setCheck([String, Number])
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_LCD_PRINT);
this.setPreviousStatement(true, null);
this.setInputsInline(true);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.MIXLY_LCD_PRINT3_TOOLTIP);
}
};
export const group_lcd_power = {
init: function () {
this.setColour(DISPLAY_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_DF_LCD)
.appendField('mylcd')
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_ON, "on()"], [Blockly.Msg.MIXLY_OFF, "off()"], [Blockly.Msg.MIXLY_LCD_STAT_CLEAR, "clear()"], [Blockly.Msg.MIXLY_LCD_NOBACKLIGHT, "backlight(False)"], [Blockly.Msg.MIXLY_LCD_BACKLIGHT, "backlight(True)"]]), "STAT");
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
var thisBlock = this;
this.setTooltip(function () {
var mode = thisBlock.getFieldValue('STAT');
var mode0 = Blockly.Msg.LISTS_SET_INDEX_SET;
var mode1 = Blockly.Msg.MIXLY_DF_LCD;
var TOOLTIPS = {
'on()': Blockly.Msg.MIXLY_ON,
'off()': Blockly.Msg.MIXLY_OFF,
'clear()': Blockly.Msg.MIXLY_LCD_STAT_CLEAR,
'backlight(off)': Blockly.Msg.MIXLY_LCD_NOBACKLIGHT,
'backlight(on)': Blockly.Msg.MIXLY_LCD_BACKLIGHT
};
return mode0 + mode1 + TOOLTIPS[mode];
});
}
};
export const lp2i_u8g_draw_4strings = {
init: function () {
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_DF_LCD + " OLED " + Blockly.Msg.OLEDDISPLAY);
//.appendField(new Blockly.FieldImage(Blockly.pathToBlockly + 'blocks/display-oled-128x64-i2c/display-oled-128x64-i2c.jpg', Blockly.Arduino.imageSize, Blockly.Arduino.imageSize));
this.appendValueInput("Text_line1", 'String')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("(128*64) " + Blockly.Msg.line1);
this.appendValueInput("Text_line2", 'String')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.line2);
this.appendValueInput("Text_line3", 'String')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.line3);
this.appendValueInput("Text_line4", 'String')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.line4);
this.setInputsInline(false);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setColour(DISPLAY_HUE);
this.setTooltip(Blockly.Msg.MIXLY_DF_LCD + Blockly.Msg.OLEDDISPLAY + Blockly.Msg.MIXLY_MICROBIT_TYPE_STRING);
}
};
export const display_image_size = {
init: function () {
var OPERATORS = [
[Blockly.Msg.MIXLY_HEIGHT, 'height'],
[Blockly.Msg.MIXLY_WIDTH, 'width']
];
this.setColour(DISPLAY_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET + Blockly.Msg.MIXLY_MICROBIT_IMAGE);
this.appendValueInput('VAR')
.setCheck("microbit_image")
// .appendField(Blockly.Msg.blockpy_USE_LIST);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(OPERATORS), 'OP');
this.setInputsInline(true);
this.setOutput(true);
var thisBlock = this;
this.setTooltip(function () {
var mode = thisBlock.getFieldValue('OP');
var mode0 = Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET;
var mode1 = Blockly.Msg.MIXLY_MICROBIT_IMAGE
var TOOLTIPS = {
'height': Blockly.Msg.MIXLY_HEIGHT,
'width': Blockly.Msg.MIXLY_WIDTH,
};
return mode0 + mode1 + TOOLTIPS[mode];
});
}
};
export const display_fill = {
init: function () {
this.setColour(DISPLAY_HUE);
this.appendValueInput('SUB');
this.appendDummyInput()
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_LCD_STAT_CLEAR, "0"],
[Blockly.Msg.MIXLY_HANDBIT_DISLPAY_OLED_FILL, "1"]
]), "key");
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
var thisBlock = this;
this.setTooltip(function () {
var mode = thisBlock.getFieldValue('key');
var TOOLTIPS = {
'0': Blockly.Msg.MIXLY_LCD_STAT_CLEAR,
'1': Blockly.Msg.MIXLY_HANDBIT_DISLPAY_OLED_FILL
};
return Blockly.Msg.MIXLY_DF_LCD + TOOLTIPS[mode];
});
}
};

View File

@@ -0,0 +1,274 @@
import * as Blockly from 'blockly/core';
const FACTORY_HUE = "#777777"; //65;
export const factory_from_import = {
init: function () {
this.setColour(FACTORY_HUE);
this.appendDummyInput("")
.appendField("from ")
.appendField(new Blockly.FieldTextInput('microbit'), 'path')
.appendField(" import ")
.appendField(new Blockly.FieldTextInput('*'), 'module');
this.setPreviousStatement(true);
this.setNextStatement(true);
}
};
export const factory_import = {
init: function () {
this.setColour(FACTORY_HUE);
this.appendDummyInput("")
.appendField("import ")
.appendField(new Blockly.FieldTextInput('module'), 'module');
this.setPreviousStatement(true);
this.setNextStatement(true);
}
};
export const factory_function_noreturn = {
init: function () {
//console.log('init');
this.setColour(FACTORY_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldTextInput('my_function'), 'NAME');
this.itemCount_ = 1;
this.arguments_ = ['x'];//add
this.updateShape_();
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setMutator(new Blockly.icons.MutatorIcon(['factory_create_with_item'], this));
},
mutationToDom: function () {
//console.log('mutationToDom');
var container = document.createElement('mutation');
container.setAttribute('items', this.itemCount_);
//add
for (var i = 0; i < this.arguments_.length; i++) {
var parameter = document.createElement('arg');
parameter.setAttribute('name', this.arguments_[i]);
container.appendChild(parameter);
}
return container;
},
domToMutation: function (xmlElement) {
//console.log('domToMutation');
this.arguments_ = [];//add
//add
for (var i = 0; xmlElement.childNodes[i]; i++) {
let childNode = xmlElement.childNodes[i]
if (childNode.nodeName.toLowerCase() == 'arg') {
this.arguments_.push(childNode.getAttribute('name'));
}
}
this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10);
this.updateShape_();
},
decompose: function (workspace) {
//console.log('decompose');
var containerBlock =
workspace.newBlock('factory_create_with_container');
containerBlock.initSvg();
var connection = containerBlock.getInput('STACK')
.connection;
for (var i = 0; i < this.itemCount_; i++) {
var itemBlock = workspace.newBlock('factory_create_with_item');
itemBlock.initSvg();
itemBlock.setFieldValue(this.arguments_[i], 'NAME');//add
connection.connect(itemBlock.previousConnection);
connection = itemBlock.nextConnection;
}
return containerBlock;
},
compose: function (containerBlock) {
//console.log('compose');
this.arguments_ = [];//add
var itemBlock = containerBlock.getInputTargetBlock('STACK');
// Count number of inputs.
var connections = [];
var i = 0;
while (itemBlock) {
this.arguments_.push(itemBlock.getFieldValue('NAME'));//add
connections[i] = itemBlock.valueConnection_;
itemBlock = itemBlock.nextConnection &&
itemBlock.nextConnection.targetBlock();
i++;
}
this.itemCount_ = i;
this.updateShape_();
// Reconnect any child blocks.
for (var i = 0; i < this.itemCount_; i++) {
if (connections[i]) {
this.getInput('ADD' + i)
.connection.connect(connections[i]);
}
}
},
saveConnections: function (containerBlock) {
//console.log('saveConnections');
var itemBlock = containerBlock.getInputTargetBlock('STACK');
var i = 0;
while (itemBlock) {
var input = this.getInput('ADD' + i);
itemBlock.valueConnection_ = input && input.connection.targetConnection;
i++;
itemBlock = itemBlock.nextConnection &&
itemBlock.nextConnection.targetBlock();
}
},
updateShape_: function () {
//console.log('updateShape_');
// Delete everything.
if (this.getInput('EMPTY')) {
this.removeInput('EMPTY');
} else {
var i = 0;
while (this.getInput('ADD' + i)) {
this.removeInput('ADD' + i);
i++;
}
}
// Rebuild block.
for (var i = 0; i < this.itemCount_; i++) {
this.appendValueInput('ADD' + i)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(this.arguments_[i]);
}
}
};
export const factory_create_with_container = {
init: function () {
this.setColour(FACTORY_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_PARAMS);
this.appendStatementInput('STACK');
this.contextMenu = false;
}
};
export const factory_create_with_item = {
init: function () {
this.setColour(FACTORY_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE + ':')
.appendField(new Blockly.FieldTextInput('x'), 'NAME');
this.setPreviousStatement(true);
this.setNextStatement(true);
this.contextMenu = false;
}
};
export const factory_function_return = {
init: function () {
this.setColour(FACTORY_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldTextInput('my_function'), 'NAME');
this.itemCount_ = 1;
this.arguments_ = ['x'];//add
this.updateShape_();
this.setOutput(true);
this.setMutator(new Blockly.icons.MutatorIcon(['factory_create_with_item'], this));
},
mutationToDom: factory_function_noreturn.mutationToDom,
domToMutation: factory_function_noreturn.domToMutation,
decompose: factory_function_noreturn.decompose,
compose: factory_function_noreturn.compose,
saveConnections: factory_function_noreturn.saveConnections,
updateShape_: factory_function_noreturn.updateShape_
};
export const factory_declare = {
init: function () {
this.setColour(FACTORY_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldTextInput('test'), 'NAME')
.appendField("=")
.appendField(new Blockly.FieldTextInput('Test'), 'TYPE')
.appendField("()");
this.setPreviousStatement(true);
this.setNextStatement(true);
}
}
export const factory_callMethod_noreturn = {
init: function () {
this.setColour(FACTORY_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldTextInput('test'), 'NAME')
.appendField('.')
.appendField(new Blockly.FieldTextInput('callMethod'), 'METHOD');
this.itemCount_ = 1;
this.arguments_ = ['x'];//add
this.updateShape_();
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setMutator(new Blockly.icons.MutatorIcon(['factory_create_with_item'], this));
},
mutationToDom: factory_function_noreturn.mutationToDom,
domToMutation: factory_function_noreturn.domToMutation,
decompose: factory_function_noreturn.decompose,
compose: factory_function_noreturn.compose,
saveConnections: factory_function_noreturn.saveConnections,
updateShape_: factory_function_noreturn.updateShape_
};
export const factory_callMethod_return = {
init: function () {
this.setColour(FACTORY_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldTextInput('test'), 'NAME')
.appendField('.')
.appendField(new Blockly.FieldTextInput('callMethod'), 'METHOD');
this.itemCount_ = 1;
this.arguments_ = ['x'];//add
this.updateShape_();
this.setOutput(true);
this.setMutator(new Blockly.icons.MutatorIcon(['factory_create_with_item'], this));
},
mutationToDom: factory_function_noreturn.mutationToDom,
domToMutation: factory_function_noreturn.domToMutation,
decompose: factory_function_noreturn.decompose,
compose: factory_function_noreturn.compose,
saveConnections: factory_function_noreturn.saveConnections,
updateShape_: factory_function_noreturn.updateShape_
};
export const factory_block = {
init: function () {
this.setColour(FACTORY_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldTextInput('display.scroll("Hello World!")'), 'VALUE');
this.setPreviousStatement(true);
this.setNextStatement(true);
}
};
export const factory_block_return = {
init: function () {
this.setColour(FACTORY_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldTextInput('test'), 'VALUE');
this.setOutput(true);
}
};
export const factory_block_with_textarea = {
init: function () {
this.setColour(FACTORY_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldMultilineInput('display.scroll("Hello World!")\ndisplay.scroll("Hello Mixly!")'), 'VALUE');
this.setPreviousStatement(true);
this.setNextStatement(true);
}
};
export const factory_block_return_with_textarea = {
init: function () {
this.setColour(FACTORY_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldMultilineInput('Hello\nMixly'), 'VALUE');
this.setOutput(true);
}
};

View File

@@ -0,0 +1,104 @@
import * as Blockly from 'blockly/core';
const BASE_HUE = 20; //'#ae3838';//40;
export const inout_highlow = {
init: function () {
this.setColour(BASE_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_HIGH, "HIGH"], [Blockly.Msg.MIXLY_LOW, "LOW"]]), 'BOOL')
this.setOutput(true, Boolean);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_INOUT_HIGHLOW);
}
};
export const inout_digital_read = {
init: function () {
this.setColour(BASE_HUE);
this.appendValueInput("PIN", Number)
.appendField(Blockly.Msg.MIXLY_DIGITALREAD_PIN)
.setCheck(Number);
this.setInputsInline(true);
this.setOutput(true, [Boolean, Number]);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_INOUT_DIGITAL_READ);
}
};
export const inout_analog_write = {
init: function () {
this.setColour(BASE_HUE);
this.appendValueInput("PIN", Number)
.appendField(Blockly.Msg.MIXLY_ANALOGWRITE_PIN)
.setCheck(Number);
this.appendValueInput("NUM", Number)
.appendField(Blockly.Msg.MIXLY_VALUE2)
.setCheck(Number);
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_INOUT_ANALOG_WRITE_PY);
}
};
export const inout_analog_write_set = {
init: function () {
this.setColour(BASE_HUE);
this.appendValueInput("PIN", Number)
.appendField(Blockly.Msg.MIXLY_ANALOGWRITE_PIN)
.setCheck(Number);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_PERIOD_MIL)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_mSecond, "period"],
[Blockly.Msg.MIXLY_uSecond, "period_microseconds"]
]), "key");
this.appendValueInput("NUM", Number)
.appendField(Blockly.Msg.MIXLY_STAT)
.setCheck(Number);
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_INOUT_ANALOG_WRITE_SET);
}
};
export const inout_analog_read = {
init: function () {
this.setColour(BASE_HUE);
this.appendValueInput("PIN", Number)
.appendField(Blockly.Msg.MIXLY_ANALOGREAD_PIN)
.setCheck(Number);
this.setInputsInline(true);
this.setOutput(true, Number);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_INOUT_ANALOG_READ);
}
};
export const sensor_pin_pressed = {
init: function () {
this.setColour(BASE_HUE);
this.appendValueInput('pin')
.appendField(Blockly.Msg.MIXLY_PIN);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_IS_TOUCHED);
this.setOutput(true, Boolean);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_sensor_pin_pressed);
}
};
export const inout_digital_write = {
init: function () {
this.setColour(BASE_HUE);
this.appendValueInput("PIN", Number)
.appendField(Blockly.Msg.MIXLY_DIGITALWRITE_PIN)
.setCheck(Number);
this.appendValueInput("STAT")
.appendField(Blockly.Msg.MIXLY_STAT)
.setCheck([Number, Boolean]);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.LANG_INOUT_DIGITAL_WRITE_TOOLTIP);
}
};

View File

@@ -0,0 +1,28 @@
const pins = {};
pins['microbit'] = {
description: "microbit_python",
// digital: [["P0", "DigitalPin.P0"], ["P1", "DigitalPin.P1"], ["P2", "DigitalPin.P2"], ["P3", "DigitalPin.P3"], ["P4", "DigitalPin.P4"], ["P5", "DigitalPin.P5"], ["P6", "DigitalPin.P6"], ["P7", "DigitalPin.P7"], ["P8", "DigitalPin.P8"], ["P9", "DigitalPin.P9"], ["P10", "DigitalPin.P10"], ["P11", "DigitalPin.P11"], ["P12", "DigitalPin.P12"], ["P13", "DigitalPin.P13"], ["P14", "DigitalPin.P14"], ["P15", "DigitalPin.P15"], ["P16", "DigitalPin.P16"], ["P17", "DigitalPin.P17"], ["P18", "DigitalPin.P18"], ["P19", "DigitalPin.P19"], ["P20", "DigitalPin.P20"]],
digital: [["P0", "0"], ["P1", "1"], ["P2", "2"], ["P3", "3"], ["P4", "4"], ["P5", "5"], ["P6", "6"], ["P7", "7"], ["P8", "8"], ["P9", "9"], ["P10", "10"], ["P11", "11"], ["P12", "12"], ["P13", "13"], ["P14", "14"], ["P15", "15"], ["P16", "16"], ["P19", "19"], ["P20", "20"]],
//pwm: [["P0", "AnalogPin.P0"], ["P1", "AnalogPin.P1"], ["P2", "AnalogPin.P2"], ["P3", "AnalogPin.P3"], ["P4", "AnalogPin.P4"], ["P5", "AnalogPin.P5"], ["P6", "AnalogPin.P6"], ["P7", "AnalogPin.P7"], ["P8", "AnalogPin.P8"], ["P9", "AnalogPin.P9"], ["P10", "AnalogPin.P10"], ["P11", "AnalogPin.P11"], ["P12", "AnalogPin.P12"], ["P13", "AnalogPin.P13"], ["P14", "AnalogPin.P14"], ["P15", "AnalogPin.P15"], ["P16", "AnalogPin.P16"], ["P19", "AnalogPin.P19"], ["P20", "AnalogPin.P20"]],
pwm: [["P0", "0"], ["P1", "1"], ["P2", "2"], ["P3", "3"], ["P4", "4"], ["P5", "5"], ["P6", "6"], ["P7", "7"], ["P8", "8"], ["P9", "9"], ["P10", "10"], ["P11", "11"], ["P12", "12"], ["P13", "13"], ["P14", "14"], ["P15", "15"], ["P16", "16"], ["P19", "19"], ["P20", "20"]],
analog: [["P0", "0"], ["P1", "1"], ["P2", "2"], ["P3", "3"], ["P4", "4"], ["P10", "10"]],
interrupt: [["P0", "0"], ["P1", "1"], ["P2", "2"]],
button: [["A", "button_a"], ["B", "button_b"]],
axis: [["0", "0"], ["1", "1"], ["2", "2"], ["3", "3"], ["4", "4"]],
brightness: [["0", "0"], ["1", "1"], ["2", "2"], ["3", "3"], ["4", "4"], ["5", "5"], ["6", "6"], ["7", "7"], ["8", "8"], ["9", "9"]],
builtinimg: [["HEART", "Image.HEART"], ["HEART_SMALL", "Image.HEART_SMALL"], ["HAPPY", "Image.HAPPY"], ["SMILE", "Image.SMILE"], ["SAD", "Image.SAD"], ["CONFUSED", "Image.CONFUSED"], ["ANGRY", "Image.ANGRY"], ["ASLEEP", "Image.ASLEEP"], ["SURPRISED", "Image.SURPRISED"], ["SILLY", "Image.SILLY"], ["FABULOUS", "Image.FABULOUS"], ["MEH", "Image.MEH"], ["YES", "Image.YES"], ["NO", "Image.NO"], ["CLOCK12", "Image.CLOCK12"], ["CLOCK11", "Image.CLOCK11"], ["CLOCK10", "Image.CLOCK10"], ["CLOCK9", "Image.CLOCK9"], ["CLOCK8", "Image.CLOCK8"], ["CLOCK7", "Image.CLOCK7"], ["CLOCK6", "Image.CLOCK6"], ["CLOCK5", "Image.CLOCK5"], ["CLOCK4", "Image.CLOCK4"], ["CLOCK3", "Image.CLOCK3"], ["CLOCK2", "Image.CLOCK2"], ["CLOCK1", "Image.CLOCK1"], ["ARROW_N", "Image.ARROW_N"], ["ARROW_NE", "Image.ARROW_NE"], ["ARROW_E", "Image.ARROW_E"], ["ARROW_SE", "Image.ARROW_SE"], ["ARROW_S", "Image.ARROW_S"], ["ARROW_SW", "Image.ARROW_SW"], ["ARROW_W", "Image.ARROW_W"], ["ARROW_NW", "Image.ARROW_NW"], ["TRIANGLE", "Image.TRIANGLE"], ["TRIANGLE_LEFT", "Image.TRIANGLE_LEFT"], ["CHESSBOARD", "Image.CHESSBOARD"], ["DIAMOND", "Image.DIAMOND"], ["DIAMOND_SMALL", "Image.DIAMOND_SMALL"], ["SQUARE", "Image.SQUARE"], ["SQUARE_SMALL", "Image.SQUARE_SMALL"], ["RABBIT", "Image.RABBIT"], ["COW", "Image.COW"], ["MUSIC_CROTCHET", "Image.MUSIC_CROTCHET"], ["MUSIC_QUAVER", "Image.MUSIC_QUAVER"], ["MUSIC_QUAVERS", "Image.MUSIC_QUAVERS"], ["PITCHFORK", "Image.PITCHFORK"], ["XMAS", "Image.XMAS"], ["PACMAN", "Image.PACMAN"], ["TARGET", "Image.TARGET"], ["TSHIRT", "Image.TSHIRT"], ["ROLLERSKATE", "Image.ROLLERSKATE"], ["DUCK", "Image.DUCK"], ["HOUSE", "Image.HOUSE"], ["TORTOISE", "Image.TORTOISE"], ["BUTTERFLY", "Image.BUTTERFLY"], ["STICKFIGURE", "Image.STICKFIGURE"], ["GHOST", "Image.GHOST"], ["SWORD", "Image.SWORD"], ["GIRAFFE", "Image.GIRAFFE"], ["SKULL", "Image.SKULL"], ["UMBRELLA", "Image.UMBRELLA"], ["SNAKE", "Image.SNAKE"], ["ALL_CLOCKS", "Image.ALL_CLOCKS"], ["ALL_ARROWS", "Image.ALL_ARROWS"]],
imglist: [["ALL_CLOCKS", "Image.ALL_CLOCKS"], ["ALL_ARROWS", "Image.ALL_ARROWS"]],
tone_notes: [
["NOTE_C3", "131"], ["NOTE_D3", "147"], ["NOTE_E3", "165"], ["NOTE_F3", "175"], ["NOTE_G3", "196"], ["NOTE_A3", "220"], ["NOTE_B3", "247"],
["NOTE_C4", "262"], ["NOTE_D4", "294"], ["NOTE_E4", "330"], ["NOTE_F4", "349"], ["NOTE_G4", "392"], ["NOTE_A4", "440"], ["NOTE_B4", "494"],
["NOTE_C5", "523"], ["NOTE_D5", "587"], ["NOTE_E5", "659"], ["NOTE_F5", "698"], ["NOTE_G5", "784"], ["NOTE_A5", "880"], ["NOTE_B5", "988"]
],
serial_pin: [["P0", "0"], ["P1", "1"], ["P2", "2"], ["P8", "8"], ["P12", "12"], ["P13", "13"], ["P14", "14"], ["P15", "15"], ["P16", "16"]],
radio_power: [['0', '0'], ['1', '1'], ['2', '2'], ['3', '3'], ['4', '4'], ['5', '5'], ['6', '6'], ['7', '7']],
radio_datarate: [["1Mbit", "RATE_1MBIT"], ["250Kbit", "RATE_250KBIT"], ["2Mbit", "RATE_2MBIT"]],
};
pins["BBC micro:bit"] = pins["microbit"];
export default pins;

View File

@@ -0,0 +1,121 @@
import * as Blockly from 'blockly/core';
import { Profile } from 'mixly';
const PINS_HUE = 230;
export const pins_digital = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.digital), 'PIN');
this.setOutput(true, Number);
}
};
export const pins_analog = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.analog), 'PIN');
this.setOutput(true, Number);
}
};
export const pins_button = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.button), 'PIN');
this.setOutput(true, Number);
}
};
export const pins_pwm = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.pwm), 'PIN');
this.setOutput(true, Number);
}
};
export const pins_interrupt = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.interrupt), 'PIN');
this.setOutput(true, Number);
}
};
export const pins_serial = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.serial_pin), 'PIN');
this.setOutput(true, Number);
}
};
export const pins_builtinimg = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.builtinimg), 'PIN');
this.setOutput(true, "microbit_image");
}
};
export const pins_imglist = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.imglist), 'PIN');
this.setOutput(true);
}
};
export const pins_axis = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.axis), 'PIN');
this.setOutput(true, Number);
}
};
export const pins_brightness = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.brightness), 'PIN');
this.setOutput(true, Number);
}
};
export const pins_tone_notes = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.tone_notes), 'PIN');
this.setOutput(true, Number);
}
};
export const pins_radio_power = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.radio_power), 'PIN');
this.setOutput(true, Number);
}
};
export const pins_radio_datarate = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.radio_datarate), 'PIN');
this.setOutput(true, Number);
}
};

View File

@@ -0,0 +1,672 @@
import * as Blockly from 'blockly/core';
import { Profile } from 'mixly';
const SENSOR_HUE = 40; //'#9e77c9'//40;
export const sensor_button_is_pressed = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendValueInput('btn')
.appendField(Blockly.Msg.MIXLY_BUTTON)
.setCheck(Number);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_IS_PRESSED);
this.setOutput(true, Boolean);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_SENOR_IS_PRESSED);
}
};
export const sensor_button_was_pressed = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendValueInput('btn')
.appendField(Blockly.Msg.MIXLY_BUTTON)
.setCheck(Number);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_WAS_PRESSED);
this.setOutput(true, Boolean);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_SENOR_WAS_PRESSED);
}
};
export const sensor_button_get_presses = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendValueInput('btn')
.appendField(Blockly.Msg.MIXLY_BUTTON)
.setCheck(Number);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_GET_PRESSES);
this.setOutput(true, Number);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN + Blockly.Msg.MIXLY_BUTTON + Blockly.Msg.MIXLY_GET_PRESSES);
}
};
export const sensor_current_gesture1 = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_MICROBIT_Current_gesture)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_MICROBIT_shake, "shake"], [Blockly.Msg.MIXLY_UP, "up"], [Blockly.Msg.MIXLY_DOWN, "down"], [Blockly.Msg.MIXLY_LEFT, "left"], [Blockly.Msg.MIXLY_RIGHT, "right"], [Blockly.Msg.MIXLY_MICROBIT_face_up, "face up"], [Blockly.Msg.MIXLY_MICROBIT_face_down, "face down"], [Blockly.Msg.MIXLY_MICROBIT_freefall, "freefall"], ["3g", "3g"], ["6g", "6g"], ["8g", "8g"]]), "gesture");
this.setOutput(true);
var thisBlock = this;
this.setTooltip(function () {
var mode = thisBlock.getFieldValue('gesture');
var mode0 = Blockly.Msg.MIXLY_MICROBIT_JS_CURRENT;
var mode1 = Blockly.Msg.MSG.catSensor;
var mode2 = Blockly.Msg.MIXLY_MICROBIT_JS_STATE;
var mode3 = Blockly.Msg.MIXLY_MICROBIT_PERFORMANCE
var TOOLTIPS = {
'shake': Blockly.Msg.MIXLY_MICROBIT_shake,
'up': Blockly.Msg.MIXLY_UP,
'down': Blockly.Msg.MIXLY_DOWN,
'left': Blockly.Msg.MIXLY_LEFT,
'right': Blockly.Msg.MIXLY_RIGHT,
'face up': Blockly.Msg.MIXLY_MICROBIT_face_up,
'face down': Blockly.Msg.MIXLY_MICROBIT_face_down,
'freefall': Blockly.Msg.MIXLY_MICROBIT_freefall,
'3g': '3g',
'6g': '6g',
'8g': '8g'
};
return mode0 + mode1 + mode2 + TOOLTIPS[mode] + mode3;
});
}
};
export const sensor_current_gesture2 = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_WAS_GESTURE)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_MICROBIT_shake, "shake"], [Blockly.Msg.MIXLY_UP, "up"], [Blockly.Msg.MIXLY_DOWN, "down"], [Blockly.Msg.MIXLY_LEFT, "left"], [Blockly.Msg.MIXLY_RIGHT, "right"], [Blockly.Msg.MIXLY_MICROBIT_face_up, "face up"], [Blockly.Msg.MIXLY_MICROBIT_face_down, "face down"], [Blockly.Msg.MIXLY_MICROBIT_freefall, "freefall"], ["3g", "3g"], ["6g", "6g"], ["8g", "8g"]]), "gesture");
this.setOutput(true);
var thisBlock = this;
this.setTooltip(function () {
var mode = thisBlock.getFieldValue('gesture');
var mode0 = Blockly.Msg.MIXLY_MICROBIT_JS_CURRENT;
var mode1 = Blockly.Msg.MSG.catSensor;
var mode2 = Blockly.Msg.MIXLY_MICROBIT_JS_STATE;
var mode3 = Blockly.Msg.MIXLY_MICROBIT_PERFORMANCE
var TOOLTIPS = {
'shake': Blockly.Msg.MIXLY_MICROBIT_shake,
'up': Blockly.Msg.MIXLY_UP,
'down': Blockly.Msg.MIXLY_DOWN,
'left': Blockly.Msg.MIXLY_LEFT,
'right': Blockly.Msg.MIXLY_RIGHT,
'face up': Blockly.Msg.MIXLY_MICROBIT_face_up,
'face down': Blockly.Msg.MIXLY_MICROBIT_face_down,
'freefall': Blockly.Msg.MIXLY_MICROBIT_freefall,
'3g': '3g',
'6g': '6g',
'8g': '8g'
};
return mode0 + mode1 + mode2 + TOOLTIPS[mode] + mode3;
});
}
};
export const controls_attachGestureInterrupt = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_CURRENT_GESTURE)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_MICROBIT_shake, "shake"], [Blockly.Msg.MIXLY_UP, "up"], [Blockly.Msg.MIXLY_DOWN, "down"], [Blockly.Msg.MIXLY_LEFT, "left"], [Blockly.Msg.MIXLY_RIGHT, "right"], [Blockly.Msg.MIXLY_MICROBIT_face_up, "face up"], [Blockly.Msg.MIXLY_MICROBIT_face_down, "face down"], [Blockly.Msg.MIXLY_MICROBIT_freefall, "freefall"], ["3g", "3g"], ["6g", "6g"], ["8g", "8g"]]), "gesture");
this.appendStatementInput('DO')
.appendField(Blockly.Msg.MIXLY_DO);
this.setPreviousStatement(true);
this.setNextStatement(true);
var thisBlock = this;
this.setTooltip(function () {
var mode = thisBlock.getFieldValue('gesture');
var mode0 = Blockly.Msg.MIXLY_MICROBIT_JS_CURRENT;
var mode1 = Blockly.Msg.MSG.catSensor;
var mode2 = Blockly.Msg.MIXLY_MICROBIT_JS_STATE;
var mode3 = Blockly.Msg.MIXLY_MICROBIT_PERFORMANCE
var TOOLTIPS = {
'shake': Blockly.Msg.MIXLY_MICROBIT_shake,
'up': Blockly.Msg.MIXLY_UP,
'down': Blockly.Msg.MIXLY_DOWN,
'left': Blockly.Msg.MIXLY_LEFT,
'right': Blockly.Msg.MIXLY_RIGHT,
'face up': Blockly.Msg.MIXLY_MICROBIT_face_up,
'face down': Blockly.Msg.MIXLY_MICROBIT_face_down,
'freefall': Blockly.Msg.MIXLY_MICROBIT_freefall,
'3g': '3g',
'6g': '6g',
'8g': '8g'
};
return mode0 + mode1 + mode2 + TOOLTIPS[mode] + mode3;
});
}
};
export const controls_GestureLists = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendDummyInput()
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_MICROBIT_shake, "shake"], [Blockly.Msg.MIXLY_UP, "up"], [Blockly.Msg.MIXLY_DOWN, "down"], [Blockly.Msg.MIXLY_LEFT, "left"], [Blockly.Msg.MIXLY_RIGHT, "right"], [Blockly.Msg.MIXLY_MICROBIT_face_up, "face up"], [Blockly.Msg.MIXLY_MICROBIT_face_down, "face down"], [Blockly.Msg.MIXLY_MICROBIT_freefall, "freefall"], ["3g", "3g"], ["6g", "6g"], ["8g", "8g"]]), "gesture");
this.setInputsInline(true);
this.setOutput(true);
var thisBlock = this;
this.setTooltip(function () {
var mode = thisBlock.getFieldValue('gesture');
var TOOLTIPS = {
'shake': Blockly.Msg.MIXLY_MICROBIT_shake,
'up': Blockly.Msg.MIXLY_UP,
'down': Blockly.Msg.MIXLY_DOWN,
'left': Blockly.Msg.MIXLY_LEFT,
'right': Blockly.Msg.MIXLY_RIGHT,
'face up': Blockly.Msg.MIXLY_MICROBIT_face_up,
'face down': Blockly.Msg.MIXLY_MICROBIT_face_down,
'freefall': Blockly.Msg.MIXLY_MICROBIT_freefall,
'3g': '3g',
'6g': '6g',
'8g': '8g'
};
return TOOLTIPS[mode];
});
}
};
export const controls_attachGestureInterrupt2 = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_WAS_GESTURE)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_MICROBIT_shake, "shake"], [Blockly.Msg.MIXLY_UP, "up"], [Blockly.Msg.MIXLY_DOWN, "down"], [Blockly.Msg.MIXLY_LEFT, "left"], [Blockly.Msg.MIXLY_RIGHT, "right"], [Blockly.Msg.MIXLY_MICROBIT_face_up, "face up"], [Blockly.Msg.MIXLY_MICROBIT_face_down, "face down"], [Blockly.Msg.MIXLY_MICROBIT_freefall, "freefall"], ["3g", "3g"], ["6g", "6g"], ["8g", "8g"]]), "gesture");
this.appendStatementInput('DO')
.appendField(Blockly.Msg.MIXLY_DO);
this.setPreviousStatement(true);
this.setNextStatement(true);
var thisBlock = this;
this.setTooltip(function () {
var mode = thisBlock.getFieldValue('gesture');
var mode0 = Blockly.Msg.CONTROLS_IF_MSG_IF;
var mode1 = Blockly.Msg.MSG.catSensor;
var mode2 = Blockly.Msg.MIXLY_MICROBIT_JS_WAS_GESTURE;
var mode3 = Blockly.Msg.MIXLY_MICROBIT_PERFORMANCE;
var TOOLTIPS = {
'shake': Blockly.Msg.MIXLY_MICROBIT_shake,
'up': Blockly.Msg.MIXLY_UP,
'down': Blockly.Msg.MIXLY_DOWN,
'left': Blockly.Msg.MIXLY_LEFT,
'right': Blockly.Msg.MIXLY_RIGHT,
'face up': Blockly.Msg.MIXLY_MICROBIT_face_up,
'face down': Blockly.Msg.MIXLY_MICROBIT_face_down,
'freefall': Blockly.Msg.MIXLY_MICROBIT_freefall,
'3g': '3g',
'6g': '6g',
'8g': '8g'
};
return mode0 + mode1 + mode2 + TOOLTIPS[mode] + mode3;
});
}
};
export const sensor_get_acceleration = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_ACCELERATION)
.appendField(new Blockly.FieldDropdown([
["x", "x"],
["y", "y"],
["z", "z"],
["(x,y,z)", "values"]
]), "key");
this.setOutput(true, Number);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_JS_ACCELERATION);
var thisBlock = this;
this.setTooltip(function () {
var mode = thisBlock.getFieldValue('key');
var mode0 = Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET;
var mode1 = Blockly.Msg.MIXLY_MICROBIT_Direction;
var mode2 = Blockly.Msg.MIXLY_MICROBIT_JS_ACCELERATION1;
var TOOLTIPS = {
'x': 'x',
'y': 'y',
'z': 'z',
'(x,y,z)': Blockly.Msg.MIXLY_MICROBIT_Shiliang_Direction,
};
return mode0 + TOOLTIPS[mode] + mode1 + mode2;
});
}
};
export const sensor_set_acceleration = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_SET_ACCELERATION)
.appendField(new Blockly.FieldDropdown([
["1g", "AcceleratorRange.OneG"],
["2g", "AcceleratorRange.TwoG"],
["4g", "AcceleratorRange.FourG"],
["8g", "AcceleratorRange.EightG"]
]), "key");
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_JS_SET_ACCELERATION);
}
};
export const sensor_get_gestures = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_GET)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_MICROBIT_JS_GET_GESTURE, 'all'],
[Blockly.Msg.MIXLY_MICROBIT_JS_CURRENT_GESTURE, 'current']
]), 'GES')
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_GESTURE);
this.setOutput(true, Number);
this.setInputsInline(true);
var thisBlock = this;
this.setTooltip(function () {
var mode = thisBlock.getFieldValue('GES');
var mode0 = Blockly.Msg.MIXLY_MICROBIT_JS_GET;
var mode1 = Blockly.Msg.MIXLY_MICROBIT_JS_GESTURE;
var TOOLTIPS = {
'all': Blockly.Msg.MIXLY_MICROBIT_JS_GET_GESTURE,
'current': Blockly.Msg.MIXLY_MICROBIT_JS_CURRENT_GESTURE
};
return mode0 + TOOLTIPS[mode] + mode1;
});
}
};
export const sensor_current_gesture = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_CURRENT_GESTURE)
this.setOutput(true, Number);
this.setInputsInline(true);
}
};
export const sensor_light_level = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_LIGHT_LEVEL)
this.setOutput(true, Number);
this.setInputsInline(true);
}
};
export const sensor_calibrate_compass = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_CALIBRATE_COMPASS)
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_JS_CALIBRATE_COMPASS);
}
};
export const sensor_is_compass_calibrated = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_IS_COMPASS_CALIBRATED)
this.setOutput(true, Number);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_JS_IS_COMPASS_CALIBRATED1);
}
};
export const sensor_compass_heading = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_BY_ANGLE)
this.setOutput(true, Number);
this.setInputsInline(true);
}
};
export const sensor_temperature = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_Board_temperature)
this.setOutput(true, Number);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_Board_temperature);
}
};
export const sensor_field_strength = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_GET_COMPASS)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_MICROBIT_JS_FIELD_STRENGTH, 'get_field_strength'],
[Blockly.Msg.MIXLY_MICROBIT_JS_BY_ANGLE, 'heading'],
["x", "get_x"],
["y", "get_y"],
["z", "get_z"]
]), 'compass');
this.setOutput(true, Number);
this.setInputsInline(true);
var thisBlock = this;
this.setTooltip(function () {
var mode = thisBlock.getFieldValue('compass');
var mode0 = Blockly.Msg.MIXLY_MICROBIT_JS_GET_COMPASS;
var TOOLTIPS = {
'strength': Blockly.Msg.MIXLY_MICROBIT_JS_FIELD_STRENGTH,
'heading': Blockly.Msg.MIXLY_MICROBIT_JS_BY_ANGLE
};
return mode0 + TOOLTIPS[mode];
});
}
};
export const sensor_rotation = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_ROTATION)
.appendField(new Blockly.FieldDropdown([
["pitch", "Rotation.Pitch"],
["roll", "Rotation.Roll"]
]), "key");
this.setOutput(true, Number);
this.setInputsInline(true);
}
};
export const sensor_magnetic = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_MAGETIC_FORCE)
.appendField(new Blockly.FieldDropdown([
["x", "Dimension.X"],
["y", "Dimension.Y"],
["z", "Dimension.Z"],
["strength", "Dimension.Strength"]
]), "key");
this.setOutput(true, Number);
this.setInputsInline(true);
}
};
export const sensor_distance_hrsc04 = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_CHAOSHENGBO)
.appendField("Trig")
.appendField(new Blockly.FieldDropdown([["P0", "0"], ["P1", "1"], ["P2", "2"], ["P3", "3"], ["P4", "4"], ["P5", "5"], ["P6", "6"], ["P7", "7"], ["P8", "8"], ["P9", "9"], ["P10", "10"], ["P11", "11"], ["P12", "12"], ["P13", "13"], ["P14", "14"], ["P15", "15"], ["P16", "16"], ["P19", "19"], ["P20", "20"]]), "Trig")
.appendField("Echo")
.appendField(new Blockly.FieldDropdown([["P0", "0"], ["P1", "1"], ["P2", "2"], ["P3", "3"], ["P4", "4"], ["P5", "5"], ["P6", "6"], ["P7", "7"], ["P8", "8"], ["P9", "9"], ["P10", "10"], ["P11", "11"], ["P12", "12"], ["P13", "13"], ["P14", "14"], ["P15", "15"], ["P16", "16"], ["P19", "19"], ["P20", "20"]]), "Echo");
this.setOutput(true, Number);
this.setInputsInline(true);
this.setTooltip("");
}
};
export const sensor_distance_hrsc04_ = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_CHAOSHENGBO)
.appendField("Trig")
.appendField(new Blockly.FieldDropdown([["P0", "0"], ["P1", "1"], ["P2", "2"], ["P3", "3"], ["P4", "4"], ["P5", "5"], ["P6", "6"], ["P7", "7"], ["P8", "8"], ["P9", "9"], ["P10", "10"], ["P11", "11"], ["P12", "12"], ["P13", "13"], ["P14", "14"], ["P15", "15"], ["P16", "16"], ["P19", "19"], ["P20", "20"]]), "Trig")
.appendField("Echo")
.appendField(new Blockly.FieldDropdown([["P0", "0"], ["P1", "1"], ["P2", "2"], ["P3", "3"], ["P4", "4"], ["P5", "5"], ["P6", "6"], ["P7", "7"], ["P8", "8"], ["P9", "9"], ["P10", "10"], ["P11", "11"], ["P12", "12"], ["P13", "13"], ["P14", "14"], ["P15", "15"], ["P16", "16"], ["P19", "19"], ["P20", "20"]]), "Echo");
this.setOutput(true, Number);
this.setInputsInline(true);
this.setTooltip();
}
};
export const DS1307_init = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_RTCINIT);
//this.appendDummyInput("").setAlign(Blockly.inputs.Align.RIGHT).appendField(new Blockly.FieldDropdown(RTCTypeList), 'RTCType');
this.appendDummyInput("")
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField('myRTC');
this.appendValueInput("SDA")
.appendField("SDA#")
.setCheck(Number);
this.appendValueInput("SCL")
.appendField("SCL#")
.setCheck(Number);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_RTCINIT);
},
//mutation有问题暂时弃用
/*mutationToDom: function() {
var container = document.createElement('mutation');
var RTCType = (this.getFieldValue('RTCType') == 'DS1302');
console.log('======change in mutationToDom==========')
console.log(RTCType);
container.setAttribute('RTCType', RTCType);
return container;
},
domToMutation: function(xmlElement) {
var type = (xmlElement.getAttribute('RTCType') == 'true');
console.log('======change in domToMutation==========')
console.log(type);
this.updateShape_(type);
},
updateShape_: function(type) {
// Add or remove reset pin.
console.log('======change in updateShape_==========')
console.log(type);
if (type) {
console.log('why not me?')
this.appendValueInput("RST")
.appendField("RST#")
.setCheck(Number);
} else{
/*if (this.childBlocks_.length > 0) {
if (this.childBlocks_[length-1].type == 'Number') {
this.childBlocks_[length-1].unplug();
break;
}
}
this.removeInput('RST');
}
}*/
};
var RTC_TIME_TYPE = [
[Blockly.Msg.MIXLY_YEAR, "Year"],
[Blockly.Msg.MIXLY_MONTH, "Month"],
[Blockly.Msg.MIXLY_DAY, "Day"],
[Blockly.Msg.MIXLY_HOUR, "Hour"],
[Blockly.Msg.MIXLY_MINUTE, "Minute"],
[Blockly.Msg.MIXLY_SECOND, "Second"],
[Blockly.Msg.MIXLY_WEEK, "Week"],
[Blockly.Msg.MIXLY_MIX1, "Mix1"],
[Blockly.Msg.MIXLY_MIX2, "Mix2"],
];
//传感器-实时时钟块_获取时间
export const RTC_get_time = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendDummyInput("")
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_RTCGETTIME);
this.appendDummyInput("")
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField('myRTC');
this.appendDummyInput("")
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(new Blockly.FieldDropdown(RTC_TIME_TYPE), "TIME_TYPE");
this.setInputsInline(true);
this.setOutput(true, Number);
var thisBlock = this;
this.setTooltip(function () {
var mode = thisBlock.getFieldValue('TIME_TYPE');
var mode0 = Blockly.Msg.MIXLY_RTCGETTIME;
var TOOLTIPS = {
'Year': Blockly.Msg.MIXLY_YEAR,
'Month': Blockly.Msg.MIXLY_MONTH,
'Day': Blockly.Msg.MIXLY_DAY,
'Hour': Blockly.Msg.MIXLY_HOUR,
'Minute': Blockly.Msg.MIXLY_MINUTE,
'Second': Blockly.Msg.MIXLY_SECOND,
'Week': Blockly.Msg.MIXLY_WEEK,
'Mix1': Blockly.Msg.MIXLY_MIX1,
'Mix2': Blockly.Msg.MIXLY_MIX2
};
return mode0 + TOOLTIPS[mode];
});
}
};
export const RTC_set_time = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendDummyInput("")
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_RTCSETTIME)
.appendField('myRTC');
this.appendValueInput("hour")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(" " + Blockly.Msg.MIXLY_HOUR);
this.appendValueInput("minute")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(" " + Blockly.Msg.MIXLY_MINUTE);
this.appendValueInput("second")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(" " + Blockly.Msg.MIXLY_SECOND);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(false);
this.setTooltip(Blockly.Msg.MIXLY_RTCSETTIME + Blockly.Msg.MIXLY_MIX2);
}
};
export const RTC_set_date = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendDummyInput("")
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_RTCSETDATE)
.appendField('myRTC');
this.appendValueInput("year")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(" " + Blockly.Msg.MIXLY_YEAR);
this.appendValueInput("month")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(" " + Blockly.Msg.MIXLY_MONTH);
this.appendValueInput("day")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(" " + Blockly.Msg.MIXLY_DAY);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.MIXLY_RTCSETDATE + Blockly.Msg.MIXLY_MIX1);
}
};
export const sensor_compass_reset = {
init: function () {
this.jsonInit({
"colour": SENSOR_HUE,
"nextStatement": null,
"previousStatement": null,
"helpUrl": "https://microbit-micropython.readthedocs.io/en/latest/music.html#music.reset",
"message0": Blockly.Msg.MIXLY_MICROBIT_Reset_COMPASS
});
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_Reset_COMPASS);
}
};
export const sensor_light = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_ESP32_LIGHT);
this.setOutput(true, Number);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MICROBIT_SENSOR_LIGHT_TOOLTIP);
}
};
export const sensor_hrsc04_init = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_HCSR04_INIT)
//.appendField("sonar")
.appendField("Trig")
.appendField(new Blockly.FieldDropdown([["P0", "0"], ["P1", "1"], ["P2", "2"], ["P3", "3"], ["P4", "4"], ["P5", "5"], ["P6", "6"], ["P7", "7"], ["P8", "8"], ["P9", "9"], ["P10", "10"], ["P11", "11"], ["P12", "12"], ["P13", "13"], ["P14", "14"], ["P15", "15"], ["P16", "16"], ["P19", "19"], ["P20", "20"]]), "Trig")
.appendField("Echo")
.appendField(new Blockly.FieldDropdown([["P0", "0"], ["P1", "1"], ["P2", "2"], ["P3", "3"], ["P4", "4"], ["P5", "5"], ["P6", "6"], ["P7", "7"], ["P8", "8"], ["P9", "9"], ["P10", "10"], ["P11", "11"], ["P12", "12"], ["P13", "13"], ["P14", "14"], ["P15", "15"], ["P16", "16"], ["P19", "19"], ["P20", "20"]]), "Echo");
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip();
}
};
var TCS34725_GETRGB = [
[Blockly.Msg.COLOUR_RGB_RED, "0"],
[Blockly.Msg.COLOUR_RGB_GREEN, "1"],
[Blockly.Msg.COLOUR_RGB_BLUE, "2"]
];
export const TCS34725_Get_RGB = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.TCS34725_Get_RGB)
.appendField(new Blockly.FieldDropdown(TCS34725_GETRGB), "TCS34725_COLOR");
this.setInputsInline(true);
this.setOutput(true);
}
};
//NTC电阻
export const NTC_TEMP = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendDummyInput("")
.appendField("NTC")
.appendField(Blockly.Msg.MIXLY_TEMP);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_PIN)
.appendField(new Blockly.FieldDropdown(Profile.default.analog), "PIN");
this.appendValueInput("NominalResistance")
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_NominalResistance);
this.appendValueInput("betaCoefficient")
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_betaCoefficient);
this.appendValueInput("seriesResistor")
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_seriesResistor);
this.setInputsInline(false);
this.setOutput(true, Number);
this.setTooltip();
}
};

View File

@@ -0,0 +1,165 @@
import * as Blockly from 'blockly/core';
const SERIAL_HUE = 65; //'#58a8de'//65;
export const serial_print = {
init: function () {
this.setColour(SERIAL_HUE);
this.appendValueInput("CONTENT", String)
.appendField("Serial " + Blockly.Msg.MIXLY_SERIAL_PRINT);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.TEXT_PRINT_TOOLTIP);
}
};
export const serial_println = {
init: function () {
this.setColour(SERIAL_HUE);
this.appendValueInput("CONTENT", String)
.appendField("Serial " + Blockly.Msg.MIXLY_SERIAL_PRINTLN);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.TEXT_PRINT_Huanhang_TOOLTIP + Blockly.Msg.TEXT_PRINT_TOOLTIP);
}
};
//打印16进制数
export const serial_print_hex = {
init: function () {
this.setColour(SERIAL_HUE);
this.appendValueInput("CONTENT", Number)
.appendField("Serial " + Blockly.Msg.MIXLY_SERIAL_PRINT + " (" + Blockly.Msg.MATH_HEX + ")")
.setCheck(Number);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.TEXT_PRINT_HEX_TOOLTIP);
}
};
export const serial_receive_data_event = {
init: function () {
this.setColour(SERIAL_HUE);
this.appendValueInput('char_marker')
.setCheck(String)
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_SERIAL_WHEN_CONTAIN_DATA)
this.appendStatementInput('DO')
.appendField(Blockly.Msg.MIXLY_DO);
}
};
export const serial_readstr = {
init: function () {
this.setColour(SERIAL_HUE);
this.appendDummyInput()
.appendField("Serial " + Blockly.Msg.MIXLY_SERIAL_READSTR);
this.setOutput(true, String);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_BLOCKGROUP_SERIAL_READ_STR);
}
};
export const serial_any = {
init: function () {
this.setColour(SERIAL_HUE);
this.appendDummyInput()
.appendField("Serial " + Blockly.Msg.MIXLY_SERIAL_AVAILABLE);
this.setOutput(true, Boolean);
this.setTooltip(Blockly.Msg.MIXLY_SERIAL_AVAILABLE1);
}
};
export const serial_readline = {
init: function () {
this.setColour(SERIAL_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_SERIAL_READ_LINE);
this.setOutput(true, String);
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_JS_SERIAL_READ_LINE1);
}
};
export const serial_readstr_until = {
init: function () {
this.setColour(SERIAL_HUE);
this.appendDummyInput()
.appendField("Serial " + Blockly.Msg.MIXLY_SERIAL_READSTR_UNTIL)
.appendField(new Blockly.FieldDropdown([
["new line", "serial.delimiters(Delimiters.NewLine)"],
[",", "serial.delimiters(Delimiters.Comma)"],
["$", "serial.delimiters(Delimiters.Dollar)"],
[":", "serial.delimiters(Delimiters.Colon)"],
[".", "serial.delimiters(Delimiters.Fullstop)"],
["#", "serial.delimiters(Delimiters.Hash)"]
]), "char_marker");
this.setInputsInline(true);
this.setOutput(true, String);
}
};
export const serial_softserial = {
init: function () {
this.setColour(SERIAL_HUE);
this.appendValueInput("RX", Number)
.appendField(Blockly.Msg.MIXLY_SETUP)
.appendField("RX#")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendValueInput("TX", Number)
.appendField("TX#")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_SERIAL_BEGIN)
.appendField(new Blockly.FieldDropdown([['115200', '115200'], ['57600', '57600'], ['38400', '38400'], ['28800', '28800'], ['19200', '19200'], ['14400', '14400'], ['9600', '9600']]), 'baudrate');
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_SERIAL_softserial);
}
};
export const serial_begin = {
init: function () {
this.setColour(SERIAL_HUE);
this.appendDummyInput()
.appendField("Serial " + Blockly.Msg.MIXLY_SERIAL_BEGIN)
.appendField(new Blockly.FieldDropdown([['115200', '115200'], ['57600', '57600'], ['38400', '38400'], ['28800', '28800'], ['19200', '19200'], ['14400', '14400'], ['9600', '9600']]), 'baudrate');
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.LISTS_SET_INDEX_SET + Blockly.Msg.MIXLY_SERIAL_BEGIN);
}
};
export const IO_input = {
init: function () {
this.setColour(SERIAL_HUE);
this.appendValueInput("VAR")
.appendField(Blockly.Msg.blockpy_inout_raw_input)
.setCheck(String);
this.setOutput(true);
this.setTooltip(Blockly.Msg.INOUT_input_TOOLTIP);
}
}
export const IO_print = {
init: function () {
this.setColour(SERIAL_HUE);
this.appendValueInput("VAR")
.appendField(Blockly.Msg.MIXLY_SERIAL_PRINTLN);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.BLOCKPY_PRINT_TOOLTIP);
}
};
export const IO_print_inline = {
init: function () {
this.setColour(SERIAL_HUE);
this.appendValueInput("VAR")
.appendField(Blockly.Msg.MIXLY_SERIAL_PRINT);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.TEXT_PRINT_TOOLTIP);
}
};

View File

@@ -0,0 +1,66 @@
import * as Blockly from 'blockly/core';
const SYSTEM_HUE = 120;
export const base_delay = {
init: function () {
this.setColour(SYSTEM_HUE);
this.appendValueInput("DELAY_TIME", Number)
.appendField(Blockly.Msg.MIXLY_DELAY + '(' + Blockly.Msg.MIXLY_MILLIS + ')')
.setCheck(Number);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_CONTROL_DELAY);
}
};
export const controls_millis = {
init: function () {
this.setColour(SYSTEM_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_RUNTIME + "(" + Blockly.Msg.MIXLY_MILLIS + ")");
this.setOutput(true, Number);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_CONTROL_MILLIS);
}
};
export const Panic_with_status_code = {
init: function () {
this.setColour(SYSTEM_HUE);
this.appendValueInput("STATUS_CODE", Number)
.appendField(Blockly.Msg.MIXLY_MICROBIT_Panic_with_status_code)
.setCheck(Number);
this.setPreviousStatement(true, null);
// this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_Panic_with_status_code);
}
};
export const reset = {
init: function () {
this.setColour(SYSTEM_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_Reset_micro);
this.setPreviousStatement(true);
// this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_Reset_micro);
}
};
export const controls_uname = {
init: function () {
this.setColour(SYSTEM_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_PY_CONTORL_UNAME);
this.setInputsInline(true);
this.setOutput(true);
this.setTooltip(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN + Blockly.Msg.MIXLY_MICROBIT_PY_CONTORL_UNAME);
}
};

View File

@@ -0,0 +1,441 @@
'use strict';
pbc.globalFunctionD['mixly_servo_write_angle'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length != 2) {
throw new Error("Incorrect number of arguments");
}
pbc.pinType = "pins_pwm";
var pinblock = py2block.convert(args[0]);
pbc.pinType = null;
var angblock = py2block.convert(args[1]);
if (pinblock != null && angblock != null) {
return [block("servo_move", func.lineno, {},
{
"PIN": pinblock,
"DEGREE": angblock,
}, {
"inline": "true"
})];
}
}
pbc.moduleFunctionD.get('Servo')['angle'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 2) {
throw new Error("Incorrect number of arguments");
}
pbc.pinType = "pins_pwm";
var pinblock = py2block.convert(args[0]);
pbc.pinType = null;
var angblock = py2block.convert(args[1]);
if (pinblock != null && angblock != null) {
return [block("servo_move", func.lineno, {},
{
"PIN": pinblock,
"DEGREE": angblock,
}, {
"inline": "true"
})];
}
}
pbc.moduleFunctionD.get('motor_control')['MotorRun'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 2) {
throw new Error("Incorrect number of arguments");
}
var argblock1 = args[0].n.v;
var argblock2 = args[1].left.n.v + "*";
var speedblock = {
_astname: "Num",
n: {
'v': args[1].right.n.v
}
}
return [block("bit_motor_control", func.lineno, {
'Motor': argblock1,
'mode': argblock2
}, {
'speed': py2block.convert(speedblock)
}, {
"inline": "true"
})];
}
pbc.moduleFunctionD.get('music')['pitch'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length === 1 && keywords.length === 1) {
var roundAstName = args[0]._astname;
pbc.pinType = "pins_pwm";
var pinblock = py2block.convert(keywords[0].value);
pbc.pinType = null;
pbc.pinType = "pins_tone_notes";
var pitchblock;
if (roundAstName === "Call"
&& args[0].func._astname == "Name" && py2block.Name_str(args[0].func) === "round") {
pitchblock = py2block.convert(args[0].args[0])
} else {
pitchblock = py2block.convert(args[0])
}
pbc.pinType = null;
return [block("microbit_music_pitch", func.lineno, {}, {
'pitch': pitchblock,
'PIN': pinblock,
}, {
"inline": "true"
})];
} else if (args.length === 3 && keywords.length === 1 && keywords[0].value._astname == "Name") {
pbc.pinType = "pins_pwm";
var pinblock = py2block.convert(args[2]);
pbc.pinType = null;
var roundAstName = args[0]._astname;
var durationAstName = args[1]._astname;
var param = keywords[0];
var wait = py2block.Name_str(param.value);
var pitchblock = null;
var durationblock = null;
pbc.pinType = "pins_tone_notes";
if (roundAstName === "Call"
&& args[0].func._astname == "Name" && py2block.Name_str(args[0].func) === "round") {
pitchblock = py2block.convert(args[0].args[0])
} else {
pitchblock = py2block.convert(args[0]);
}
pbc.pinType = null;
if (durationAstName === "Call"
&& args[1].func._astname == "Name" && py2block.Name_str(args[1].func) === "round") {
durationblock = py2block.convert(args[1].args[0]);
} else {
durationblock = py2block.convert(args[1]);
}
return [block("microbit_music_pitch_delay", func.lineno, {
'wait': wait
}, {
'pitch': pitchblock,
'duration': durationblock,
'PIN': pinblock,
}, {
"inline": "true"
})];
} else {
throw new Error("Incorrect number of arguments");
}
}
pbc.moduleFunctionD.get('music')['play'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length == 1 && keywords.length == 3) {//music.DADADADUM, pin=pin0, wait=True, loop=False
var musicblock = null;
var pinblock = null;
var waitblock = null;
var loopblock = null;
for (var i = 0; i < keywords.length; i++) {
var param = keywords[i];
var key = py2block.identifier(param.arg);
if (key === "pin") {
pbc.pinType = "pins_pwm";
pinblock = py2block.convert(param.value);
pbc.pinType = null;
} else if (key === "wait" && param.value._astname == "Name") {
waitblock = py2block.Name_str(param.value);
} else if (key === "loop" && param.value._astname == "Name") {
loopblock = py2block.Name_str(param.value);
}
}
if (args[0]._astname == "Attribute"
&& args[0].value._astname == "Name" && py2block.Name_str(args[0].value) == "music") {
musicblock = py2block.identifier(args[0].attr);
if (musicblock != null && pinblock != null && waitblock != null && loopblock != null) {
return [block("microbit_music_play_built_in", func.lineno, {
'melody': musicblock,
'wait': waitblock,
'loop': loopblock
}, {
'PIN': pinblock,
}, {
"inline": "true"
})];
}
} else {
if (pinblock != null && waitblock != null && loopblock != null) {
return [block("microbit_music_play_list_of_notes", func.lineno, {
'wait': waitblock,
'loop': loopblock
}, {
'PIN': pinblock,
'notes': py2block.convert(args[0]),
}, {
"inline": "true"
})];
}
}
}else if(args.length == 1 && keywords.length == 1){
if (args[0]._astname == "Attribute"
&& args[0].value._astname == "Name" && py2block.Name_str(args[0].value) == "music"
&& py2block.identifier(keywords[0].arg) == "pin") {
musicblock = py2block.identifier(args[0].attr);
var param = keywords[0];
var key = py2block.identifier(param.arg);
pbc.pinType = "pins_pwm";
pinblock = py2block.convert(param.value);
pbc.pinType = null;
return [block("microbit_music_play_built_in_easy", func.lineno, {
'melody': musicblock,
}, {
'PIN': pinblock,
}, {
"inline": "true"
})];
}
}
throw new Error("Incorrect number of arguments");
}
pbc.moduleFunctionD.get('music')['stop'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
pbc.pinType = "pins_pwm";
var argblock = py2block.convert(args[0]);
pbc.pinType = null;
return [block("microbit_music_stop", func.lineno, {}, {
'PIN': argblock
}, {
"inline": "true"
})];
}
pbc.moduleFunctionD.get('music')['reset'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
return [block("microbit_music_reset", func.lineno, {}, {}, {
"inline": "true"
})];
}
pbc.moduleFunctionD.get('music')['get_tempo'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
return block("microbit_music_get_tempo", func.lineno, {}, {}, {
"inline": "true"
});
}
pbc.moduleFunctionD.get('music')['set_tempo'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0 || keywords.length !== 2) { //music.set_tempo(ticks=4, bpm=120)
throw new Error("Incorrect number of arguments");
}
var bpmblock = null;
var ticksblock = null;
for (var i = 0; i < keywords.length; i++) {
var param = keywords[i];
var key = py2block.identifier(param.arg);
if (key === 'bpm') {
bpmblock = py2block.convert(param.value);
} else if (key === 'ticks') {
ticksblock = py2block.convert(param.value);
}
}
if (bpmblock != null && ticksblock != null) {
return [block("tone_set_tempo", func.lineno, {}, {
'BPM': bpmblock,
'TICKS': ticksblock,
}, {
"inline": "true"
})];
}
}
pbc.moduleFunctionD.get('speech')['translate'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
var argblock = py2block.convert(args[0]);
return block("speech_translate", func.lineno, {}, {
'VAR': argblock
}, {
"inline": "False"
});
}
function speechSayOrSingOrPronounce(mode){
function converter(py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length === 1 && keywords.length === 4) {//('Mixly 0.997 is great!', pitch=64, speed=72, mouth=128, throat=128)
var argblock = py2block.convert(args[0]);
var pitchblock = null;
var speedblock = null;
var mouthblock = null;
var throatblock = null;
for (var i = 0; i < keywords.length; i++) {
var param = keywords[i];
var key = py2block.identifier(param.arg);
if (key === 'pitch') {
pitchblock = py2block.convert(param.value);
} else if (key === 'speed') {
speedblock = py2block.convert(param.value);
} else if (key === 'mouth') {
mouthblock = py2block.convert(param.value);
} else if (key === 'throat') {
throatblock = py2block.convert(param.value);
}
}
if (argblock != null && pitchblock != null && speedblock != null && mouthblock != null && throatblock != null) {
return [block("speech_say", func.lineno, {
"MODE": mode
}, {
'VAR': argblock,
'pitch': pitchblock,
'speed': speedblock,
'mouth': mouthblock,
'throat': throatblock
}, {
"inline": "true"
})];
}
}else if(args.length === 1 && keywords.length === 0){
return [block("speech_" + mode + "_easy", func.lineno, {}, {
'VAR': py2block.convert(args[0]),
}, {
"inline": "true"
})];
}
throw new Error("Incorrect number of arguments");
}
return converter;
}
pbc.moduleFunctionD.get('speech')['say'] = speechSayOrSingOrPronounce('say');
pbc.moduleFunctionD.get('speech')['sing'] = speechSayOrSingOrPronounce('sing');
pbc.moduleFunctionD.get('speech')['pronounce'] = speechSayOrSingOrPronounce('pronounce');
pbc.moduleFunctionD.get('rgb')['show'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 5) {
throw new Error("Incorrect number of arguments");
}
var argblock1 = py2block.convert(args[1]);
var argblock2 = py2block.convert(args[2]);
var argblock3 = py2block.convert(args[3]);
var argblock4 = py2block.convert(args[4]);
return [block("display_rgb", func.lineno, {}, {
'_LED_': argblock1,
'RVALUE': argblock2,
'GVALUE': argblock3,
'BVALUE': argblock4
}, {
"inline": "true"
})];
}
pbc.moduleFunctionD.get('np')['show'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
return [block("display_rgb_show", func.lineno, {}, {}, {
"inline": "true"
})];
}
pbc.assignD.get('QJ00X_MP3')['check_assign'] = function (py2block, node, targets, value) {
if(value.func._astname != "Name"){
return false;
}
var funcName = value.func.id.v;
if (value._astname === "Call" && funcName === "QJ00X_MP3" && value.keywords.length === 2)
return true;
return false;
}
pbc.assignD.get('QJ00X_MP3')['create_block'] = function (py2block, node, targets, value) {
var rxblock = null;
var txblock = null;
for (var i = 0; i < value.keywords.length; i++) {
var param = value.keywords[i];
var key = py2block.identifier(param.arg);
if (key === "mp3_rx") {
pbc.pinType = "pins_serial";
rxblock = py2block.convert(param.value);
pbc.pinType = null;
} else if (key === "mp3_tx") {
pbc.pinType = "pins_serial";
txblock = py2block.convert(param.value);
pbc.pinType = null;
}
}
//注意:赋值语句里,即使图形块上下可接,也不需要加[]
return block('MP3_INIT', node.lineno, {}, {
'RX': rxblock,
'TX': txblock
});
}
function QJ00X_mp3_set(mode){
function converter(py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 1 && args.length !== 0 && args.length !== 2) {
throw new Error("Incorrect number of arguments");
}
if (args.length == 0) {
return [block("MP3_CONTROL", func.lineno, {
'CONTROL_TYPE': mode
}, {}, {
"inline": "true"
})];
} else if (args.length == 2) {
var argblock1 = py2block.convert(args[0]);
var argblock2 = py2block.convert(args[1]);
return [block("MP3_PLAY_FOLDER", func.lineno, {}, {
"FOLDER": argblock1,
"NUM": argblock2
}, {
"inline": "true"
})];
} else {
if (mode == "set_loop") {
return [block("MP3_LOOP_MODE", func.lineno, {
'LOOP_MODE': py2block.Num_value(args[0])
}, {}, {
"inline": "true"
})];
} else if (mode == "set_eq") {
return [block("MP3_EQ_MODE", func.lineno, {
'EQ_MODE': py2block.Num_value(args[0])
}, {}, {
"inline": "true"
})];
} else if (mode == "set_vol") {
var argblock = py2block.convert(args[0]);
return [block("MP3_VOL", func.lineno, {}, {
"vol": argblock
}, {
"inline": "true"
})];
} else {
var argblock = py2block.convert(args[0]);
return [block("MP3_PLAY_NUM", func.lineno, {}, {
"NUM": argblock
}, {
"inline": "true"
})];
}
}
}
return converter;
}
pbc.objectFunctionD.get('play')['QJ00X_MP3'] = QJ00X_mp3_set('play');
pbc.objectFunctionD.get('pause')['QJ00X_MP3'] = QJ00X_mp3_set('pause');
pbc.objectFunctionD.get('next_track')['QJ00X_MP3'] = QJ00X_mp3_set('next_track');
pbc.objectFunctionD.get('prev_track')['QJ00X_MP3'] = QJ00X_mp3_set('prev_track');
pbc.objectFunctionD.get('inc_vol')['QJ00X_MP3'] = QJ00X_mp3_set('inc_vol');
pbc.objectFunctionD.get('dec_vol')['QJ00X_MP3'] = QJ00X_mp3_set('dec_vol');
pbc.objectFunctionD.get('set_loop')['QJ00X_MP3'] = QJ00X_mp3_set('set_loop');
pbc.objectFunctionD.get('set_eq')['QJ00X_MP3'] = QJ00X_mp3_set('set_eq');
pbc.objectFunctionD.get('set_vol')['QJ00X_MP3'] = QJ00X_mp3_set('set_vol');
pbc.objectFunctionD.get('playFileByIndexNumber')['QJ00X_MP3'] = QJ00X_mp3_set('playFileByIndexNumber');
pbc.objectFunctionD.get('set_folder')['QJ00X_MP3'] = QJ00X_mp3_set('set_folder');

View File

@@ -0,0 +1,263 @@
'use strict';
var pbc = Py2blockConfig.prototype;
pbc.moduleFunctionD.get('radio')['on'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
return [block("radio_ons", func.lineno, {"type": "on"}, {}, {
"inline": "true"
})];
}
pbc.moduleFunctionD.get('radio')['off'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
return [block("radio_ons", func.lineno, {"type": "off"}, {}, {
"inline": "true"
})];
}
pbc.moduleFunctionD.get('radio')['reset'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
return [block("radio_ons", func.lineno, {"type": "reset"}, {}, {
"inline": "true"
})];
}
pbc.moduleFunctionD.get('radio')['config'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0 || keywords.length !== 7) { //length=32, queue=3, channel=7, power=6, address=0x75626974, group=0, data_rate=radio.RATE_1MBIT
throw new Error("Incorrect number of arguments");
}
var lengthblock = null;
var queueblock = null;
var channelblock = null;
var powerblock = null;
var addressblock = null;
var groupblock = null;
var datarateblock = null;
// var baudrate = null;
for (var i = 0; i < keywords.length; i++) {
var param = keywords[i];
var key = py2block.identifier(param.arg);
if (key === "length") {
lengthblock = py2block.convert(param.value);
} else if (key === "queue") {
queueblock = py2block.convert(param.value);
} else if (key === "channel") {
channelblock = py2block.convert(param.value);
} else if (key === "power") {
powerblock = py2block.convert(param.value);
} else if (key === "address") {
addressblock = py2block.convert(param.value);
} else if (key === "group") {
groupblock = py2block.convert(param.value);
} else if (key === "data_rate") {
datarateblock = py2block.convert(param.value);
}
}
if (lengthblock != null && queueblock != null && channelblock != null && powerblock != null && addressblock != null && groupblock != null/*&& data_rate!=null*/) {
return [block("microbit_radio_config", func.lineno, {}, {
"length": lengthblock,
"queue": queueblock,
"channel": channelblock,
"power": powerblock,
"address": addressblock,
"group": groupblock,
"data_rate": datarateblock,
}, {
"inline": "true"
})];
}
}
pbc.moduleFunctionD.get('radio')['send'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length === 0) {
throw new Error("Incorrect number of arguments");
}
return [block("radio_send_string", func.lineno, {}, {
"data": py2block.convert(args[0]),
}, {
"inline": "true"
})];
}
pbc.moduleFunctionD.get('radio')['send_bytes'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length === 0) {
throw new Error("Incorrect number of arguments");
}
return [block("radio_send_string", func.lineno, {"type": "send_bytes"}, {
"data": py2block.convert(args[0]),
}, {
"inline": "true"
})];
}
pbc.moduleFunctionD.get('radio')['receive'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
return block("radio_receive_string", func.lineno, {}, {}, {
"inline": "true"
});
}
pbc.moduleFunctionD.get('radio')['receive_bytes'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
return block("radio_receive_string", func.lineno, {"type": "receive_bytes"}, {}, {
"inline": "true"
});
}
pbc.moduleFunctionD.get('radio')['receive_full'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
return block("radio_receive_string", func.lineno, {"type": "receive_full"}, {}, {
"inline": "true"
});
}
pbc.moduleFunctionD.get('i2c')['init'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0 || keywords.length !== 3) { //i2c.init(sda=20, scl=19, freq=10000)
throw new Error("Incorrect number of arguments");
}
var sdablock = null;
var sclblock = null;
var freqblock = null;
for (var i = 0; i < keywords.length; i++) {
var param = keywords[i];
var key = py2block.identifier(param.arg);
if (key === "sda") {
pbc.inScope = "i2c_init";
pbc.pinType = "pins_digital";
sdablock = py2block.convert(param.value);
pbc.pinType = null;
pbc.inScope = null;
} else if (key === "scl") {
pbc.inScope = "i2c_init";
pbc.pinType = "pins_digital";
sclblock = py2block.convert(param.value);
pbc.pinType = null;
pbc.inScope = null;
} else if (key === "freq") {
freqblock = py2block.convert(param.value);
}
}
if (sdablock != null && sclblock != null && freqblock != null) {
return [block("i2c_init", func.lineno, {}, {
'RX': sdablock,
'TX': sclblock,
"freq": freqblock
}, {
"inline": "true"
})];
}
}
pbc.moduleFunctionD.get('i2c')['read'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 3 || args[2]._astname != "Name") {
throw new Error("Incorrect number of arguments");
}
var adblock = py2block.convert(args[0]);
var dtblock = py2block.convert(args[1]);
return block("i2c_read", func.lineno, {
'is_repeated': py2block.Name_str(args[2])
}, {
'address': adblock,
'data': dtblock,
}, {
"inline": "true"
});
}
pbc.moduleFunctionD.get('i2c')['write'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 3 || args[2]._astname != "Name") {
throw new Error("Incorrect number of arguments");
}
var adblock = py2block.convert(args[0]);
var dtblock = py2block.convert(args[1]);
return [block("i2c_write", func.lineno, {
'is_repeated': py2block.Name_str(args[2])
}, {
'address': adblock,
'data': dtblock,
}, {
"inline": "true"
})];
}
pbc.moduleFunctionD.get('spi')['init'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0 || keywords.length !== 6
|| keywords[0].value._astname != "Num"
|| keywords[1].value._astname != "Num"
|| keywords[2].value._astname != "Num"
|| keywords[3].value._astname != "Num"
|| keywords[4].value._astname != "Num"
|| keywords[5].value._astname != "Num"
) { //(baudrate=1000000, bits=8, mode=0, mosi=15, miso= 14, sclk=13)
throw new Error("Incorrect number of arguments");
}
var baudrate = null;
var bitsblock = null;
var modeblock = null;
var mosiblock = null;
var misoblock = null;
var sclkblock = null;
for (var i = 0; i < keywords.length; i++) {
var param = keywords[i];
var key = py2block.identifier(param.arg);
if (key === "baudrate") {
baudrate = py2block.Num_value(param.value);
} else if (key === "bits") {
bitsblock = py2block.Num_value(param.value);
} else if (key === "mode") {
modeblock = py2block.Num_value(param.value);
} else if (key === "mosi") {
mosiblock = py2block.Num_value(param.value);
} else if (key === "miso") {
misoblock = py2block.Num_value(param.value);
} else if (key === "sclk") {
sclkblock = py2block.Num_value(param.value);
}
}
if (bitsblock != null && modeblock != null && baudrate != null
&& mosiblock != null && misoblock != null && sclkblock != null) {
return [block("spi_init", func.lineno, {
"freq": baudrate,
"bits": bitsblock,
"mode": modeblock,
"mosi": mosiblock,
"miso": misoblock,
"sck": sclkblock//
}, {}, {
"inline": "false"
})];
}
}
pbc.moduleFunctionD.get('spi')['write'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length === 0) {
throw new Error("Incorrect number of arguments");
}
return block("spi_write", func.lineno, {}, {
'data': py2block.convert(args[0]),
}, {
"inline": "true"
});
}

View File

@@ -0,0 +1,448 @@
'use strict';
function show_or_scroll(blockid1, blockid2, blockid3 = null) {
function converter(py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length === 1 && keywords.length === 4) {//Image.ALL_CLOCKS, delay=120, wait=True, loop=False, clear=False
var imagesblock = null;
var delayblock = null;
var waitblock = null;
var loopblock = null;
var clearblock = null;
imagesblock = py2block.convert(args[0]);
for (var i = 0; i < keywords.length; i++) {
var param = keywords[i];
var key = py2block.identifier(param.arg);
if (key === "delay") {
delayblock = py2block.convert(param.value);
} else if (key === "wait" && param.value._astname == "Name") {
waitblock = py2block.Name_str(param.value);
} else if (key === "loop" && param.value._astname == "Name") {
loopblock = py2block.Name_str(param.value);
} else if (key === "clear" && param.value._astname == "Name") {
clearblock = py2block.Name_str(param.value);
}
}
if (imagesblock != null && delayblock != null
&& waitblock != null && loopblock != null && clearblock != null) {
return [block(blockid2, func.lineno, {
'wait': waitblock,
'loop': loopblock,
'clear': clearblock,
},
{
'images': imagesblock,
'delay': delayblock,
}, {
"inline": "true"
})];
}
} else if (args.length === 1 && keywords.length === 0) {
return [block(blockid1, func.lineno, {},
{
'data': py2block.convert(args[0]),
}, {
"inline": "true"
})];
} else if (args.length === 1 && keywords.length === 1 && blockid3) {
var delayblock = py2block.convert(keywords[0].value);
return [block(blockid3, func.lineno, {},
{
'data': py2block.convert(args[0]),
'delay': delayblock
}, {
"inline": "true"
})];
}
throw new Error("Incorrect number of arguments");
}
return converter;
}
pbc.moduleFunctionD.get('display')['show'] = show_or_scroll('monitor_show_image_or_string', 'microbit_display_show_animation');
pbc.moduleFunctionD.get('display')['scroll'] = show_or_scroll('monitor_scroll_string', 'microbit_display_scroll_string_animation', 'monitor_scroll_string_with_delay');
//创建图像
pbc.globalFunctionD['Image'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 1 || args[0]._astname != "Str") {
throw new Error("Incorrect number of arguments");
}
var colours = [
"#000000",
"#440000",
"#660000",
"#880000",
"#aa0000",
"#bb0000",
"#cc0000",
"#dd0000",
"#ee0000",
"#ff0000"
];
var flag = 0;
var tempblock = py2block.Str_value(args[0]);
var temptext = new Array();
temptext = tempblock.split(':');
if (temptext.length == 5) {
for (var i = 0; i < 5; i++) {
if (temptext[i].length == 5) {
flag++;
}
}
}
if (flag == 5) {
return block('microbit_image_create', func.lineno, {
"00": colours[temptext[0].charAt(0)],
"01": colours[temptext[0].charAt(1)],
"02": colours[temptext[0].charAt(2)],
"03": colours[temptext[0].charAt(3)],
"04": colours[temptext[0].charAt(4)],
"10": colours[temptext[1].charAt(0)],
"11": colours[temptext[1].charAt(1)],
"12": colours[temptext[1].charAt(2)],
"13": colours[temptext[1].charAt(3)],
"14": colours[temptext[1].charAt(4)],
"20": colours[temptext[2].charAt(0)],
"21": colours[temptext[2].charAt(1)],
"22": colours[temptext[2].charAt(2)],
"23": colours[temptext[2].charAt(3)],
"24": colours[temptext[2].charAt(4)],
"30": colours[temptext[3].charAt(0)],
"31": colours[temptext[3].charAt(1)],
"32": colours[temptext[3].charAt(2)],
"33": colours[temptext[3].charAt(3)],
"34": colours[temptext[3].charAt(4)],
"40": colours[temptext[4].charAt(0)],
"41": colours[temptext[4].charAt(1)],
"42": colours[temptext[4].charAt(2)],
"43": colours[temptext[4].charAt(3)],
"44": colours[temptext[4].charAt(4)],
}, {}, {
"inline": "false"
});
}
}
pbc.moduleFunctionD.get('image')['height'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
return block('display_image_size', func.lineno, {
'OP': 'height'
}, {
'VAR': py2block.convert(args[0]),
}, {
"inline": "true"
});
}
pbc.moduleFunctionD.get('image')['width'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
return block('display_image_size', func.lineno, {
'OP': 'width'
}, {
'VAR': py2block.convert(args[0]),
}, {
"inline": "true"
});
}
function imageShift(mode){
function converter(py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
var imageblock = py2block.convert(func.value);
return block('image_shift', func.lineno, {
'OP': mode
}, {
'img': imageblock,
'val': py2block.convert(args[0]),
}, {
"inline": "true"
});
}
return converter;
}
pbc.objectFunctionD.get('shift_up')['Image'] = imageShift('up');
pbc.objectFunctionD.get('shift_down')['Image'] = imageShift('down');
pbc.objectFunctionD.get('shift_left')['Image'] = imageShift('left');
pbc.objectFunctionD.get('shift_right')['Image'] = imageShift('right');
pbc.objectFunctionD.get('copy')['Image'] = function converter(py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
var imageblock = py2block.convert(func.value);
return block('microbit_image_copy', func.lineno, {}, {
'image': imageblock,
}, {
"inline": "true"
});
}
pbc.objectFunctionD.get('invert')['Image'] = function converter(py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
var imageblock = py2block.convert(func.value);
return block('microbit_image_invert', func.lineno, {}, {
'image': imageblock,
}, {
"inline": "true"
});
}
pbc.moduleFunctionD.get('display')['get_pixel'] = function(py2block, func, args, keywords, starargs, kwargs, node){
if (args.length !== 2){
throw new Error("Incorrect number of arguments");
}
var astname = args[0]._astname;
var astname1 = args[1]._astname;
var xblock;
var yblock;
pbc.pinType = "pins_axis";
if(astname === "Call" && args[0].func._astname == "Name" && py2block.Name_str(args[0].func) === "int"){ //display.get_pixel(int(0), int(0))
xblock = py2block.convert(args[0].args[0]);
}else{
xblock = py2block.convert(args[0]);
}
if(astname1 === "Call" && args[1].func._astname == "Name" && py2block.Name_str(args[1].func) === "int"){ //display.get_pixel(int(0), int(0))
yblock = py2block.convert(args[1].args[0]);
}else{
yblock = py2block.convert(args[1]);
}
pbc.pinType = null;
return block("monitor_get_pixel", func.lineno, {}, {
'x':xblock,
'y':yblock
}, {
"inline": "true"
});
}
pbc.moduleFunctionD.get('display')['set_pixel'] = function(py2block, func, args, keywords, starargs, kwargs, node){
if (args.length !== 3){
throw new Error("Incorrect number of arguments");
}
var astname = args[0]._astname;
var astname1 = args[1]._astname;
pbc.pinType = "pins_brightness";
var brightblock = py2block.convert(args[2]);
pbc.pinType = null;
var xblock;
var yblock;
pbc.pinType = "pins_axis";
if(astname === "Call" && args[0].func._astname == "Name" && py2block.Name_str(args[0].func) === "int"){ //display.set_pixel(int(0), int(0))
xblock = py2block.convert(args[0].args[0]);
}else{
xblock = py2block.convert(args[0]);
}
if(astname1 === "Call" && args[1].func._astname == "Name" && py2block.Name_str(args[1].func) === "int"){ //display.set_pixel(int(0), int(0))
yblock = py2block.convert(args[1].args[0]);
}else{
yblock = py2block.convert(args[1]);
}
pbc.pinType = null;
return [block("monitor_bright_point", func.lineno, {}, {
'x':xblock,
'y':yblock,
'brightness':brightblock,
}, {
"inline": "true"
})];
}
function displayOnOrOff(mode){
function converter(py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
return [block("microbit_display_on", func.lineno, {
'on_off': mode
}, {}, {
"inline": "true"
})];
}
return converter;
}
pbc.moduleFunctionD.get('display')['on'] = displayOnOrOff('on');
pbc.moduleFunctionD.get('display')['off'] = displayOnOrOff('off');
pbc.moduleFunctionD.get('display')['is_on'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
return block("microbit_display_is_on", func.lineno, {}, {}, {
"inline": "true"
});
}
pbc.moduleFunctionD.get('display')['clear'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
return [block("microbit_display_clear", func.lineno, {}, {}, {
"inline": "true"
})];
}
pbc.assignD.get('Rgb')['check_assign'] = function(py2block, node, targets, value) {
if(value._astname != "Call" || value.func._astname != "Attribute" || value.func.value._astname != "Name"){
return false;
}
var moduleName = py2block.Name_str(value.func.value);
var funcName = py2block.identifier(value.func.attr);
if(value._astname === "Call" && moduleName === "neopixel"
&& funcName === "NeoPixel" && value.args.length === 2)
return true;
return false;
}
pbc.assignD.get('Rgb')['create_block'] = function(py2block, node, targets, value){
pbc.pinType = "pins_digital";
var pinblock = py2block.convert(value.args[0]);
pbc.pinType = null;
var countblock = py2block.convert(value.args[1]);
return block("display_rgb_init", node.lineno, {}, {
"PIN":pinblock,
"LEDCOUNT":countblock
});
}
pbc.globalFunctionD['mixly_rgb_show'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 4) {
throw new Error("Incorrect number of arguments");
}
return [block("display_rgb", func.lineno, {
}, {
'_LED_':py2block.convert(args[0]),
"RVALUE":py2block.convert(args[1]),
"GVALUE":py2block.convert(args[2]),
"BVALUE":py2block.convert(args[3])
}, {
"inline": "true"
})];
}
pbc.assignD.get('Lcd')['check_assign'] = function(py2block, node, targets, value) {
if(value._astname != "Call" || value.func._astname != "Name"){
return false;
}
var className = py2block.Name_str(value.func);
if(value._astname === "Call" && className === "LCD1602" && value.args.length === 1)
return true;
return false;
}
pbc.assignD.get('Lcd')['create_block'] = function(py2block, node, targets, value){
pbc.inScope = "lcd_init";
var argblock = py2block.convert(value.args[0]);
pbc.inScope = null;
return block("group_lcd_init", node.lineno, {}, {
"device":argblock
});
}
pbc.moduleFunctionD.get('mylcd')['mixly_puts_two_lines'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 2) {
throw new Error("Incorrect number of arguments");
}
return [block("group_lcd_print", func.lineno, {
}, {
"TEXT":py2block.convert(args[0]),
"TEXT2":py2block.convert(args[1])
}, {
"inline": "false"
})];
}
pbc.moduleFunctionD.get('mylcd')['mixly_puts'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 3) {
throw new Error("Incorrect number of arguments");
}
return [block("group_lcd_print2", func.lineno, {
}, {
"row":py2block.convert(args[1]),
"column":py2block.convert(args[2]),
"TEXT":py2block.convert(args[0]),
}, {
"inline": "true"
})];
}
function mylcdOnOrOffOrClear(mode){
function converter(py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
return [block("group_lcd_power", func.lineno, {
'STAT': mode
}, {}, {
"inline": "true"
})];
}
return converter;
}
pbc.moduleFunctionD.get('mylcd')['on'] = mylcdOnOrOffOrClear('on()');
pbc.moduleFunctionD.get('mylcd')['off'] = mylcdOnOrOffOrClear('off()');
pbc.moduleFunctionD.get('mylcd')['clear'] = mylcdOnOrOffOrClear('clear()');
pbc.moduleFunctionD.get('mylcd')['backlight'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 1 || args[0]._astname != "Name") {
throw new Error("Incorrect number of arguments");
}
var stat = py2block.Name_str(args[0]);
return [block("group_lcd_power", func.lineno, {
'STAT': "backlight(" + stat + ")"
}, {}, {
"inline": "true"
})];
}
pbc.globalFunctionD['mixly_oled_text'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 4) {
throw new Error("Incorrect number of arguments");
}
return [block("lp2i_u8g_draw_4strings", func.lineno, {
}, {
"Text_line1":py2block.convert(args[0]),
"Text_line2":py2block.convert(args[1]),
"Text_line3":py2block.convert(args[2]),
"Text_line4":py2block.convert(args[3])
}, {
"inline": "false"
})];
}
pbc.objectFunctionD.get('show_fill')['monitor'] = function(py2block, func, args, keywords, starargs, kwargs, node) {
if(args.length!=1){
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
var flagblock = py2block.identifier(args[0].n.v);
return [block("display_fill", func.lineno, {'key':flagblock}, { "SUB":objblock,
}, {
"inline": "true"
})];
}

View File

@@ -0,0 +1,121 @@
'use strict';
pbc.objectFunctionD.get('write_digital')['Pin'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
pbc.pinType = "pins_digital";
var pinblock = py2block.convert(func.value);
var argblock = py2block.convert(args[0]);
pbc.pinType = null;
return [block("inout_digital_write", func.lineno, {}, {
"PIN": pinblock,
"STAT": argblock
}, {
"inline": "true"
})];
}
pbc.objectFunctionD.get('read_digital')['Pin'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
pbc.pinType = "pins_digital";
var pinblock = py2block.convert(func.value);
pbc.pinType = null;
return block("inout_digital_read", func.lineno, {}, {
"PIN": pinblock
}, {
"inline": "true"
});
}
pbc.objectFunctionD.get('write_analog')['Pin'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
pbc.pinType = "pins_analog";
var pinblock = py2block.convert(func.value);
var argblock = py2block.convert(args[0]);
pbc.pinType = null;
return [block("inout_analog_write", func.lineno, {}, {
"PIN": pinblock,
"NUM": argblock
}, {
"inline": "true"
})];
}
pbc.objectFunctionD.get('read_analog')['Pin'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
pbc.pinType = "pins_analog";
var pinblock = py2block.convert(func.value);
pbc.pinType = null;
return block("inout_analog_read", func.lineno, {}, {
"PIN": pinblock
}, {
"inline": "true"
});
}
pbc.objectFunctionD.get('set_analog_period')['Pin'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length != 1) {
throw new Error("Incorrect number of arguments");
}
pbc.pinType = "pins_pwm";
var pinblock = py2block.convert(func.value);
var argblock = py2block.convert(args[0]);
pbc.pinType = null;
return [block("inout_analog_write_set", func.lineno, {
'key': 'period'
}, {
"PIN": pinblock,
"NUM": argblock
}, {
"inline": "true"
})];
}
pbc.objectFunctionD.get('set_analog_period_microseconds')['Pin'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length != 1) {
throw new Error("Incorrect number of arguments");
}
pbc.pinType = "pins_pwm";
var pinblock = py2block.convert(func.value);
var argblock = py2block.convert(args[0]);
pbc.pinType = null;
return [block("inout_analog_write_set", func.lineno,
{
'key': 'period_microseconds'
}, {
"PIN": pinblock,
"NUM": argblock
}, {
"inline": "true"
})];
}
pbc.objectFunctionD.get('is_touched')['Pin'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
pbc.pinType = "pins_interrupt";
var pinblock = py2block.convert(func.value);
pbc.pinType = null;
return block("sensor_pin_pressed", func.lineno, {}, {
"pin": pinblock
}, {
"inline": "true"
});
}

View File

@@ -0,0 +1,120 @@
function defDict(type) {
var dict = {};
return {
get: function (key) {
if (!dict[key]) {
dict[key] = type.constructor();
}
return dict[key];
},
dict: dict
};
}
function Py2blockConfig (){
this.initIgnoreS();
this.initModuleAttrD();
this.initKnownModuleS();
this.initObjectTypeD();
}
var pbc = Py2blockConfig.prototype;
pbc.MICROBITPY = "microbit[py]";
pbc.board = pbc.MICROBITPY;
pbc.objectFunctionD = defDict({});
pbc.moduleFunctionD = defDict({});
pbc.moduleAttrD = defDict({});
pbc.objectAttrD = defDict({});
pbc.globalFunctionD = {};
pbc.assignD = defDict({});
pbc.ifStatementD= defDict({});
pbc.whileStatementD= defDict({});
pbc.forStatementD= defDict({});
pbc.reservedNameD= {};
pbc.knownModuleS = new Set();
pbc.objectTypeD = {}; //key变量名value变量类型如{'a':'List'}
pbc.ignoreS = new Set();
pbc.pinType = null;
pbc.inScope = null;
pbc.formatModuleKeyL = [];
pbc.formatModuleL = [];
//忽略某些方法、类、赋值
pbc.initIgnoreS = function(){
var pythonIgnoreL = [
];
var boardIgnoreL = [
//actuator.js
'Servo', 'mixly_servo_write_angle',
//display.js
"LCD1602", "LCD_I2C_ADDR", "OLED12864_I2C","mixly_rgb_show", "oled", "mixly_oled_text",
//sensor.js
'DS1307', 'DS1307_I2C_ADDRESS', 'DS1307_REG_SECOND', 'DS1307_REG_MINUTE',
'DS1307_REG_HOUR', 'DS1307_REG_WEEKDAY', 'DS1307_REG_DAY', 'DS1307_REG_MONTH', 'DS1307_REG_YEAR',
'DS1307_REG_CTRL', 'DS1307_REG_RAM', 'ds'
];
var ignoreL = pythonIgnoreL.concat(boardIgnoreL);
for (var i = 0; i < ignoreL.length; i++) {
this.ignoreS.add(ignoreL[i]);
}
}
pbc.initModuleAttrD = function(){
//communicate.js,例如 radio.RATE_2MBIT
for (var i = 0; i < profile.default.radio_datarate.length; i++) {
this.moduleAttrD.get('radio')[profile.default.radio_datarate[i][1]] = function (node, module, attr) {
return block("pins_radio_datarate", node.lineno, {
"PIN": attr
});
}
}
//display.js
for (var i = 0; i < profile.default.builtinimg.length; i++) {
pbc.moduleAttrD.get('Image')[profile.default.builtinimg[i][0]] = function (node, module, attr) {
return block("pins_builtinimg", node.lineno, {
"PIN": module + "." + attr
});
}
}
for (var i = 0; i < profile.default.imglist.length; i++) {
pbc.moduleAttrD.get('Image')[profile.default.imglist[i][0]] = function (node, module, attr) {
return block("pins_imglist", node.lineno, {
"PIN": module + "." + attr
});
}
}
for (var i = 0; i < profile.default.digital.length; i++) {
pbc.moduleAttrD.get('PIN')[profile.default.digital[i][0]] = function (node, module, attr) {
return block("pins_digital", node.lineno, {
"PIN": module + "." + attr
});
}
}
}
pbc.initKnownModuleS = function(){
var pythonModuleL = [
'math', 'random'
];
var boardModuleL = [];
var moduleL = pythonModuleL.concat(boardModuleL);
for (var i = 0; i < moduleL.length; i++) {
this.knownModuleS.add(moduleL[i]);
}
}
pbc.initObjectTypeD = function () {
this.objectTypeD = {
'f': 'open'
}
}
pbc.reset = function(){
this.initObjectTypeD();
}
var py2block_config = new Py2blockConfig();

View File

@@ -0,0 +1,325 @@
'use strict';
pbc.objectFunctionD.get('is_pressed')['Pin'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
pbc.pinType = "pins_button";
var objblock = py2block.convert(func.value);
pbc.pinType = null;
return block("sensor_button_is_pressed", func.lineno, {}, {
"btn": objblock
}, {
"inline": "true"
});
}
pbc.objectFunctionD.get('was_pressed')['Pin'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
pbc.pinType = "pins_button";
var objblock = py2block.convert(func.value);
pbc.pinType = null;
return block("sensor_button_was_pressed", func.lineno, {}, {
"btn": objblock
}, {
"inline": "true"
});
}
pbc.objectFunctionD.get('get_presses')['Pin'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
pbc.pinType = "pins_button";
var objblock = py2block.convert(func.value);
pbc.pinType = null;
return block("sensor_button_get_presses", func.lineno, {}, {
"btn": objblock
}, {
"inline": "true"
});
}
/*
pbc.ifStatementD.get('if_is_gesture')['check_condition'] = function (py2block, node, test, body, orelse) {
if (test._astname == "Call" && test.func._astname == "Attribute"
&& test.func.value._astname == "Name"
&& py2block.Name_str(test.func.value) == "accelerometer"
&& py2block.identifier(test.func.attr) == "is_gesture"
&& test.args.length == 1) {
return true;
}
return false;
}
pbc.ifStatementD.get('if_is_gesture')['create_block'] = function (py2block, node, test, body, orelse) {
return block("controls_attachGestureInterrupt", node.lineno, {
'gesture': py2block.Str_value(test.args[0])
}, {}, {
"inline": "true"
}, {}, {
"DO": py2block.convertBody(body)
});
}
pbc.ifStatementD.get('if_was_gesture')['check_condition'] = function (py2block, node, test, body, orelse) {
if (test._astname == "Call" && test.func._astname == "Attribute"
&& test.func.value._astname == "Name"
&& py2block.Name_str(test.func.value) == "accelerometer"
&& py2block.identifier(test.func.attr) == "was_gesture"
&& test.args.length == 1) {
return true;
}
return false;
}
pbc.ifStatementD.get('if_was_gesture')['create_block'] = function (py2block, node, test, body, orelse) {
return block("controls_attachGestureInterrupt2", node.lineno, {
'gesture': py2block.Str_value(test.args[0])
}, {}, {
"inline": "true"
}, {}, {
"DO": py2block.convertBody(body)
});
}*/
function acceleromeerGetDir(mode) {
function converter(py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
return block("sensor_get_acceleration", func.lineno, {
"key": mode
}, {}, {
"inline": "true"
});
}
return converter;
}
pbc.moduleFunctionD.get('accelerometer')['get_x'] = acceleromeerGetDir('x');
pbc.moduleFunctionD.get('accelerometer')['get_y'] = acceleromeerGetDir('y');
pbc.moduleFunctionD.get('accelerometer')['get_z'] = acceleromeerGetDir('z');
pbc.moduleFunctionD.get('accelerometer')['get_values'] = acceleromeerGetDir('values');
function accelerometerGetGestrues(mode) {
function converter(py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
return block("sensor_get_gestures", func.lineno, {
'GES': mode
}, {}, {
"inline": "true"
});
}
return converter;
}
pbc.moduleFunctionD.get('accelerometer')['get_gestures'] = accelerometerGetGestrues('all');
pbc.moduleFunctionD.get('accelerometer')['current_gesture'] = accelerometerGetGestrues('current');
pbc.moduleFunctionD.get('accelerometer')['is_gesture'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
return block("sensor_current_gesture1", func.lineno, {'gesture': py2block.Str_value(args[0])}, {}, {
"inline": "true"
});
}
pbc.moduleFunctionD.get('accelerometer')['was_gesture'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
return block("sensor_current_gesture2", func.lineno, {'gesture': py2block.Str_value(args[0])}, {}, {
"inline": "true"
});
}
pbc.moduleFunctionD.get('compass')['calibrate'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
return [block("sensor_calibrate_compass", func.lineno, {}, {}, {
"inline": "true"
})];
}
pbc.moduleFunctionD.get('compass')['is_calibrated'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
return block("sensor_is_compass_calibrated", func.lineno, {}, {}, {
"inline": "true"
});
}
function getStrength(mode) {
function converter(py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
return block("sensor_field_strength", func.lineno, {
'compass': mode
}, {}, {
"inline": "true"
});
}
return converter;
}
pbc.moduleFunctionD.get('compass')['get_field_strength'] = getStrength('get_field_strength');
pbc.moduleFunctionD.get('compass')['heading'] = getStrength('heading');
pbc.moduleFunctionD.get('compass')['get_x'] = getStrength('get_x');
pbc.moduleFunctionD.get('compass')['get_y'] = getStrength('get_y');
pbc.moduleFunctionD.get('compass')['get_z'] = getStrength('get_z');
pbc.moduleFunctionD.get('compass')['clear_calibration'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
return [block("sensor_compass_reset", func.lineno, {}, {}, {
"inline": "true"
})];
}
pbc.globalFunctionD['temperature'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
return block("sensor_temperature", func.lineno, {}, {}, {
"inline": "true"
});
}
pbc.moduleFunctionD.get('display')['read_light_level'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
return block("sensor_light", func.lineno, {}, {}, {
"inline": "true"
});
}
pbc.moduleFunctionD.get('ultrasonic')['distance_cm'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
var trig = keywords[0].value.id.v.replace("pin", "");
var echo = keywords[1].value.id.v.replace("pin", "");
return block("sensor_distance_hrsc04", func.lineno, {
"Trig": trig,
"Echo": echo
}, {}, {
"inline": "true"
});
}
function ds1307GetTime(mode) {
function converter(py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
return block("RTC_get_time", func.lineno, {
'TIME_TYPE': mode
}, {}, {
"inline": "true"
});
}
return converter;
}
pbc.moduleFunctionD.get('ds')['Year'] = ds1307GetTime('Year');
pbc.moduleFunctionD.get('ds')['Month'] = ds1307GetTime('Month');
pbc.moduleFunctionD.get('ds')['Day'] = ds1307GetTime('Day');
pbc.moduleFunctionD.get('ds')['Hour'] = ds1307GetTime('Hour');
pbc.moduleFunctionD.get('ds')['Minute'] = ds1307GetTime('Minute');
pbc.moduleFunctionD.get('ds')['Second'] = ds1307GetTime('Second');
pbc.moduleFunctionD.get('ds')['Week'] = ds1307GetTime('Week');
pbc.moduleFunctionD.get('ds')['get_time'] = ds1307GetTime('Mix2');
pbc.moduleFunctionD.get('ds')['get_date'] = ds1307GetTime('Mix1');
pbc.moduleFunctionD.get('ds')['set_date'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length != 3) {
throw new Error("Incorrect number of arguments");
}
var yearblock = py2block.convert(args[0]);
var monthblock = py2block.convert(args[1]);
var dayblock = py2block.convert(args[2]);
return [block("RTC_set_date", func.lineno, {}, {
'year': yearblock,
"month": monthblock,
"day": dayblock,
}, {
"inline": "false"
})];
}
pbc.moduleFunctionD.get('ds')['set_time'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length != 3) {
throw new Error("Incorrect number of arguments");
}
var hourblock = py2block.convert(args[0]);
var minuteblock = py2block.convert(args[1]);
var secondblock = py2block.convert(args[2]);
return [block("RTC_set_time", func.lineno, {}, {
"hour": hourblock,
"minute": minuteblock,
"second": secondblock,
}, {
"inline": "false"
})];
}
pbc.assignD.get('HCSR04')['check_assign'] = function (py2block, node, targets, value) {
if(value.func._astname != "Name"){
return false;
}
var funcName = py2block.identifier(value.func.id);
value.args = value.args || [];
if (value._astname === "Call" && funcName === "HCSR04" && !value.args.length)
return true;
return false;
}
pbc.assignD.get('HCSR04')['create_block'] = function (py2block, node, targets, value) {
var name = py2block.Name_str(node.targets[0]);
var Trig = value.keywords[0].value.id.v;
Trig = Trig.replace(/[^0-9]/ig,"");
var Echo = value.keywords[1].value.id.v;;
Echo = Echo.replace(/[^0-9]/ig,"");
//注意:赋值语句里,即使图形块上下可接,也不需要加[]
return block('sensor_hrsc04_init', node.lineno, {
"Trig": Trig,
"Echo": Echo
}, {});
}
pbc.moduleFunctionD.get('tcs')['getRawRGBData'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
var arg = args[0].n.v;
return block("TCS34725_Get_RGB", func.lineno, {'TCS34725_COLOR': arg}, {}, {
"inline": "true"
});
}

View File

@@ -0,0 +1,160 @@
'use strict';
pbc.globalFunctionD['print'] = function(py2block, func, args, keywords, starargs, kwargs, node){
if (args.length === 1 && keywords.length === 1
&& py2block.identifier(keywords[0].arg) === "end"
&& keywords[0].value._astname === "Str"
&& py2block.Str_value(keywords[0].value) === ""
){
var argblock = py2block.convert(args[0]);
return [block("IO_print_inline", func.lineno, {}, {
'VAR':argblock
}, {
"inline": "false"
})];
}else if (args.length === 1 && keywords.length === 0) {
var argblock = py2block.convert(args[0]);
return [block("IO_print", func.lineno, {}, {
'VAR':argblock
}, {
"inline": "false"
})];
}else{
throw new Error("Incorrect number of arguments");
}
}
pbc.globalFunctionD['input'] = function(py2block, func, args, keywords, starargs, kwargs, node){
if (args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
var argblock = py2block.convert(args[0]);
return block("IO_input", func.lineno, {}, {
'VAR':argblock
}, {
"inline": "false"
});
}
pbc.moduleFunctionD.get('uart')['init'] = function(py2block, func, args, keywords, starargs, kwargs, node){
if (args.length === 0 && keywords.length === 1
&& keywords[0].value._astname == "Num") { //uart.init(baudrate=9600)
if(py2block.identifier(keywords[0].arg) === "baudrate") {
return [block("serial_begin", func.lineno, {
"baudrate": py2block.Num_value(keywords[0].value)
}, {}, {
"inline": "true"
})];
}
}else if(args.length === 0 && keywords.length === 3) { //uart.init(rx=0, tx=1, baudrate=115200)
var rxblock = null;
var txblock = null;
var baudrate = null;
for (var i = 0; i < keywords.length; i++) {
var param = keywords[i];
var key = py2block.identifier(param.arg);
if (key === "rx") {
pbc.pinType = "pins_serial";
rxblock = py2block.convert(param.value);
pbc.pinType = null;
} else if (key === "tx") {
pbc.pinType = "pins_serial";
txblock = py2block.convert(param.value);
pbc.pinType = null;
} else if (key === "baudrate" && param.value._astname == "Num") {
baudrate = py2block.Num_value(param.value);
}
}
if (rxblock != null && txblock != null && baudrate != null) {
return [block("serial_softserial", func.lineno, {
"baudrate": baudrate
}, {
"RX":rxblock,
"TX":txblock
}, {
"inline": "true"
})];
}
}
throw new Error("Incorrect number of arguments");
}
pbc.moduleFunctionD.get('uart')['write'] = function(py2block, func, args, keywords, starargs, kwargs, node){
if (args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
var astname = args[0]._astname;
if(astname === "Call"){
if(args[0].func._astname == "Name" && py2block.Name_str(args[0].func) === "str"){ //serial.write(str("XXX"))
return [block("serial_print", func.lineno, {}, {
"CONTENT":py2block.convert(args[0].args[0]),
}, {
"inline": "false"
})];
}
}else if(astname === "BinOp"){
if(args[0].op.name === "Add" && args[0].right._astname === "Str"
&& py2block.Str_value(args[0].right) === "\r\n"
&& args[0].left._astname === "Call" && args[0].left.func._astname == "Name"
&& py2block.Name_str(args[0].left.func) === "str"
){
if(args[0].left.args[0]._astname === "Call"
&& args[0].left.args[0].func._astname === "Name"
&& py2block.Name_str(args[0].left.args[0].func) === "hex"){ //serial.write(str(hex(XX)) + "\r\n")
pbc.inScope = "lcd_init";
var numblock=py2block.convert(args[0].left.args[0].args[0]);
pbc.inScope=null;
return [block("serial_print_hex", func.lineno, {}, {
"CONTENT": numblock,
}, {
"inline": "false"
})];
}else{
return [block("serial_println", func.lineno, {}, { //serial.write(str("XX") + "\r\n")
"CONTENT": py2block.convert(args[0].left.args[0]),
}, {
"inline": "false"
})];
}
}
}
return [block("serial_print", func.lineno, {}, {
"CONTENT":py2block.convert(args[0]),
}, {
"inline": "true"
})];
}
pbc.moduleFunctionD.get('uart')['any'] = function(py2block, func, args, keywords, starargs, kwargs, node){
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
return block("serial_any", func.lineno, {}, {}, {
"inline": "true"
});
}
pbc.moduleFunctionD.get('uart')['read'] = function(py2block, func, args, keywords, starargs, kwargs, node){
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
return block("serial_readstr", func.lineno, {}, {}, {
"inline": "true"
});
}
pbc.moduleFunctionD.get('uart')['readline'] = function(py2block, func, args, keywords, starargs, kwargs, node){
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
return block("serial_readline", func.lineno, {}, {}, {
"inline": "true"
});
}

View File

@@ -0,0 +1,70 @@
'use strict';
//microbit[py]的停止程序
pbc.whileStatementD.get('while_stop_program')['check_condition'] = function (py2block, node, test, body, orelse) {
if (test._astname == "Name" && py2block.Name_str(test) == "True"
&& body.length == 1 && body[0]._astname == "Pass") {
return true;
}
return false;
}
pbc.whileStatementD.get('while_stop_program')['create_block'] = function (py2block, node, test, body, orelse) {
return [block("controls_end_program", node.lineno, {}, {}, {
"inline": "true"
})];
}
pbc.globalFunctionD['sleep'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length != 1) {
throw new Error("Incorrect number of arguments");
}
return [block("base_delay", func.lineno, {}, {
'DELAY_TIME': py2block.convert(args[0]),
}, {
"inline": "true"
})];
}
pbc.globalFunctionD['running_time'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length != 0) {
throw new Error("Incorrect number of arguments");
}
return block("controls_millis", func.lineno, {}, {}, {
"inline": "true"
});
}
pbc.globalFunctionD['panic'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length != 1) {
throw new Error("Incorrect number of arguments");
}
return [block("Panic_with_status_code", func.lineno, {}, {
'STATUS_CODE': py2block.convert(args[0])
}, {
"inline": "true"
})];
}
pbc.globalFunctionD['reset'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length != 0) {
throw new Error("Incorrect number of arguments");
}
return [block("reset", func.lineno, {}, {}, {
"inline": "true"
})];
}
pbc.moduleFunctionD.get('os')['uname'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length != 0) {
throw new Error("Incorrect number of arguments");
}
return block("controls_uname", func.lineno, {}, {}, {
"inline": "true"
});
}

View File

@@ -0,0 +1,152 @@
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(1) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/inout.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(1) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/inout2.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(2) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/ctrl.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(2) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/ctrl2.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(3) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/math.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(3) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/math2.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(4) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/logic.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(4) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/logic2.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(5) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/text.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(5) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/text2.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(6) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/list3.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(6) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/list4.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(7) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/tuple.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(7) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/tuple2.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(8) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/dict.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(8) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/dict2.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(9) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/set.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(9) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/set2.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(10) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/var.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(10) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/var2.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(11) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/func.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(11) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/func2.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(12) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/port.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(12) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/port2.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(13) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/sensor.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(13) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/sensor2.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(14) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/act.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(14) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/act2.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(15) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/monitor.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(15) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/monitor2.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(16) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/file.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(16) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/file2.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(17) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/comuni.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(17) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/comuni2.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(18) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/net.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(18) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/net2.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(19) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/factory3.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(19) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/factory4.png') no-repeat;
background-size: 100% auto;
}

View File

@@ -0,0 +1,43 @@
import MicropythonNRF51822MicrobitPins from './blocks/microbit_profile';
import * as MicropythonNRF51822MicrobitActuatorBlocks from './blocks/actuator';
import * as MicropythonNRF51822MicrobitCommunicateBlocks from './blocks/communicate';
import * as MicropythonNRF51822MicrobitDisplayBlocks from './blocks/display';
import * as MicropythonNRF51822MicrobitFactoryBlocks from './blocks/factory';
import * as MicropythonNRF51822MicrobitInoutBlocks from './blocks/inout';
import * as MicropythonNRF51822MicrobitPinsBlocks from './blocks/pins';
import * as MicropythonNRF51822MicrobitSensorBlocks from './blocks/sensor';
import * as MicropythonNRF51822MicrobitSerialBlocks from './blocks/serial';
import * as MicropythonNRF51822MicrobitSystemBlocks from './blocks/system';
import * as MicropythonNRF51822MicrobitActuatorGenerators from './generators/actuator';
import * as MicropythonNRF51822MicrobitCommunicateGenerators from './generators/communicate';
import * as MicropythonNRF51822MicrobitDisplayGenerators from './generators/display';
import * as MicropythonNRF51822MicrobitFactoryGenerators from './generators/factory';
import * as MicropythonNRF51822MicrobitInoutGenerators from './generators/inout';
import * as MicropythonNRF51822MicrobitPinsGenerators from './generators/pins';
import * as MicropythonNRF51822MicrobitSensorGenerators from './generators/sensor';
import * as MicropythonNRF51822MicrobitSerialGenerators from './generators/serial';
import * as MicropythonNRF51822MicrobitSystemGenerators from './generators/system';
export {
MicropythonNRF51822MicrobitPins,
MicropythonNRF51822MicrobitActuatorBlocks,
MicropythonNRF51822MicrobitCommunicateBlocks,
MicropythonNRF51822MicrobitDisplayBlocks,
MicropythonNRF51822MicrobitFactoryBlocks,
MicropythonNRF51822MicrobitInoutBlocks,
MicropythonNRF51822MicrobitPinsBlocks,
MicropythonNRF51822MicrobitSensorBlocks,
MicropythonNRF51822MicrobitSerialBlocks,
MicropythonNRF51822MicrobitSystemBlocks,
MicropythonNRF51822MicrobitActuatorGenerators,
MicropythonNRF51822MicrobitCommunicateGenerators,
MicropythonNRF51822MicrobitDisplayGenerators,
MicropythonNRF51822MicrobitFactoryGenerators,
MicropythonNRF51822MicrobitInoutGenerators,
MicropythonNRF51822MicrobitPinsGenerators,
MicropythonNRF51822MicrobitSensorGenerators,
MicropythonNRF51822MicrobitSerialGenerators,
MicropythonNRF51822MicrobitSystemGenerators
};

View File

@@ -0,0 +1,284 @@
export const microbit_music_play_built_in = function (block, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.definitions_['import_music'] = 'import music';
var dropdown_melody = block.getFieldValue('melody');
var pin = generator.valueToCode(block, 'PIN', generator.ORDER_ATOMIC);
var checkbox_wait = block.getFieldValue('wait') == 'TRUE' ? 'True' : 'False';
var checkbox_loop = block.getFieldValue('loop') == 'TRUE' ? 'True' : 'False';
var code = 'music.play(music.' + dropdown_melody + ', pin=pin' + pin + ', wait=' + checkbox_wait + ', loop=' + checkbox_loop + ')\n';
return code;
}
export const microbit_music_play_built_in_easy = function (block, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.definitions_['import_music'] = 'import music';
var dropdown_melody = block.getFieldValue('melody');
var pin = generator.valueToCode(block, 'PIN', generator.ORDER_ATOMIC);
var code = 'music.play(music.' + dropdown_melody + ', pin=pin' + pin + ')\n';
return code;
}
export const microbit_music_pitch_delay = function (block, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.definitions_['import_music'] = 'import music';
generator.definitions_['import_math'] = 'import math';
var number_pitch = generator.valueToCode(block, 'pitch', generator.ORDER_ATOMIC);
var number_duration = generator.valueToCode(block, 'duration', generator.ORDER_ATOMIC);
var pin = generator.valueToCode(block, 'PIN', generator.ORDER_ATOMIC);
var checkbox_wait = block.getFieldValue('wait') == 'TRUE' ? 'True' : 'False';
var code = 'music.pitch(round(' + number_pitch + '), round(' + number_duration + '), pin' + pin + ', wait = ' + checkbox_wait + ')\n';
return code;
}
export const microbit_music_pitch = function (block, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.definitions_['import_music'] = 'import music';
generator.definitions_['import_math'] = 'import math';
var number_pitch = generator.valueToCode(block, 'pitch', generator.ORDER_ATOMIC);
// var number_duration = generator.valueToCode(block, 'duration', generator.ORDER_ATOMIC);
var pin = generator.valueToCode(block, 'PIN', generator.ORDER_ATOMIC);
var code = 'music.pitch(round(' + number_pitch + '), pin=pin' + pin + ')\n';
return code;
}
export const microbit_music_play_list_of_notes = function (block, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.definitions_['import_music'] = 'import music';
var pin = generator.valueToCode(block, 'PIN', generator.ORDER_ATOMIC);
var value_notes = generator.valueToCode(block, 'notes', generator.ORDER_ATOMIC) || '[]';
var checkbox_wait = block.getFieldValue('wait') == 'TRUE' ? 'True' : 'False';
var checkbox_loop = block.getFieldValue('loop') == 'TRUE' ? 'True' : 'False';
var code = 'music.play(' + value_notes + ', pin=pin' + pin + ', wait=' + checkbox_wait + ', loop=' + checkbox_loop + ')\n';
return code;
}
export const microbit_music_reset = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.definitions_['import_music'] = 'import music';
var code = 'music.reset()\n';
return code;
}
export const microbit_music_stop = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.definitions_['import_music'] = 'import music';
var pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var code = 'music.stop(pin' + pin + ')\n';
return code;
}
export const microbit_music_get_tempo = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.definitions_['import_music'] = 'import music';
var code = 'music.get_tempo()';
return [code, generator.ORDER_ATOMIC];
}
export const tone_set_tempo = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var bpm = generator.valueToCode(this, 'BPM', generator.ORDER_ASSIGNMENT);
var ticks = generator.valueToCode(this, 'TICKS', generator.ORDER_ASSIGNMENT);
var code = "music.set_tempo(ticks=" + ticks + ", bpm=" + bpm + ")\n";
return code;
}
export const speech_translate = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.definitions_['import_speech'] = 'import speech';
var text = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var code = ["speech.translate(" + text + ")", generator.ORDER_ATOMIC];
return code
}
export const speech_say = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.definitions_['import_speech'] = 'import speech';
var mode = this.getFieldValue("MODE");
var text = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var pitch = generator.valueToCode(this, 'pitch', generator.ORDER_ATOMIC);
var speed = generator.valueToCode(this, 'speed', generator.ORDER_ATOMIC);
var mouth = generator.valueToCode(this, 'mouth', generator.ORDER_ATOMIC);
var throat = generator.valueToCode(this, 'throat', generator.ORDER_ATOMIC);
var code = "speech." + mode + "(" + text + ", pitch=" + pitch + ", speed=" + speed + ", mouth=" + mouth + ", throat=" + throat + ")\n";
return code
}
// export const speech_sing = function(){
// generator.definitions_['import_microbit_*'] = 'from microbit import *';
// generator.definitions_['import_speech'] = 'import speech';
// var text = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
// var pitch = generator.valueToCode(this, 'pitch', generator.ORDER_ATOMIC);
// var speed = generator.valueToCode(this, 'speed', generator.ORDER_ATOMIC);
// var mouth = generator.valueToCode(this, 'mouth', generator.ORDER_ATOMIC);
// var throat = generator.valueToCode(this, 'throat', generator.ORDER_ATOMIC);
// var code = "speech.sing("+ text +", pitch="+pitch+", speed="+speed+", mouth="+mouth+", throat="+throat+")\n";
// return code
// }
// export const speech_prenounce = function(){
// generator.definitions_['import_microbit_*'] = 'from microbit import *';
// generator.definitions_['import_speech'] = 'import speech';
// var text = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
// var pitch = generator.valueToCode(this, 'pitch', generator.ORDER_ATOMIC);
// var speed = generator.valueToCode(this, 'speed', generator.ORDER_ATOMIC);
// var mouth = generator.valueToCode(this, 'mouth', generator.ORDER_ATOMIC);
// var throat = generator.valueToCode(this, 'throat', generator.ORDER_ATOMIC);
// var code = "speech.pronounce("+ text +", pitch="+pitch+", speed="+speed+", mouth="+mouth+", throat="+throat+")\n";
// return code
// }
export const speech_say_easy = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.definitions_['import_speech'] = 'import speech';
var text = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var code = "speech.say(" + text + ")\n";
return code
}
export const speech_sing_easy = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.definitions_['import_speech'] = 'import speech';
var text = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var code = "speech.sing(" + text + ")\n";
return code
}
export const speech_pronounce_easy = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.definitions_['import_speech'] = 'import speech';
var text = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var code = "speech.pronounce(" + text + ")\n";
return code
}
export const servo_move = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.definitions_['import_Servolib'] = 'import Servo';
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var value_degree = generator.valueToCode(this, 'DEGREE', generator.ORDER_ATOMIC);
if (!isNaN(parseInt(dropdown_pin)))
var code = 'Servo.angle(pin' + dropdown_pin + ', ' + value_degree + ')\n';
else
var code = 'Servo.angle(' + dropdown_pin + ', ' + value_degree + ')\n';
return code;
}
export const bit_motor_control = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.definitions_['import_motor_control'] = 'import motor_control';
var Motor = this.getFieldValue('Motor');
var mode = this.getFieldValue('mode');
var speed = generator.valueToCode(this, 'speed', generator.ORDER_ATOMIC);
var code = 'motor_control.MotorRun(' + Motor + ', ' + mode + '' + speed + ')\n';
return code;
}
export const display_rgb_init = function (_, generator) {
var dropdown_rgbpin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var value_ledcount = generator.valueToCode(this, 'LEDCOUNT', generator.ORDER_ATOMIC);
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.definitions_['import_neopixel'] = 'import neopixel';
// generator.definitions_['include_display'] = '#include "Mixly.h"';
generator.setups_['var_rgb_display' + dropdown_rgbpin] = 'np = neopixel.NeoPixel(pin' + dropdown_rgbpin + ', ' + value_ledcount + ')\n';
// generator.setups_['setup_rgb_display_begin_' + dropdown_rgbpin] = 'rgb_display_' + dropdown_rgbpin + '.begin();';
// generator.setups_['setup_rgb_display_setpin' + dropdown_rgbpin] = 'rgb_display_' + dropdown_rgbpin + '.setPin(' + dropdown_rgbpin + ');';
return '';
}
export const display_rgb = function (_, generator) {
var value_led = generator.valueToCode(this, '_LED_', generator.ORDER_ATOMIC);
var value_rvalue = generator.valueToCode(this, 'RVALUE', generator.ORDER_ATOMIC);
var value_gvalue = generator.valueToCode(this, 'GVALUE', generator.ORDER_ATOMIC);
var value_bvalue = generator.valueToCode(this, 'BVALUE', generator.ORDER_ATOMIC);
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.definitions_['import_neopixel'] = 'import neopixel';
var code = 'np[' + value_led + '] = (' + value_rvalue + ', ' + value_gvalue + ', ' + value_bvalue + ')\n';
return code;
}
export const display_rgb2 = function (_, generator) {
var value_led = generator.valueToCode(this, '_LED_', generator.ORDER_ATOMIC);
var colour_rgb_led_color = this.getFieldValue('RGB_LED_COLOR');
var color = colour_rgb_led_color;
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.definitions_['import_neopixel'] = 'import neopixel';
var code = 'np[' + value_led + '] = (' + color + ')\n';
code += 'np.show()\n';
return code;
}
export const display_rgb_show = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.definitions_['import_neopixel'] = 'import neopixel';
var code = 'np.show()\n';
return code;
}
export const MP3_INIT = function (_, generator) {
var dropdown_pin1 = generator.valueToCode(this, 'RX', generator.ORDER_ATOMIC);
var dropdown_pin2 = generator.valueToCode(this, 'TX', generator.ORDER_ATOMIC);
if (!isNaN(parseInt(dropdown_pin1)))
dropdown_pin1 = "pin" + dropdown_pin1;
if (!isNaN(parseInt(dropdown_pin2)))
dropdown_pin2 = "pin" + dropdown_pin2;
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.definitions_['import_QJ00X_MP3'] = 'from MP3 import QJ00X_MP3';
var code = 'mp3' + ' = ' + 'QJ00X_MP3(mp3_rx=' + dropdown_pin1 + ', mp3_tx=' + dropdown_pin2 + ')\n';
return code;
}
// mp3 控制播放
export const MP3_CONTROL = function (_, generator) {
var CONTROL_TYPE = this.getFieldValue('CONTROL_TYPE');
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.definitions_['import_QJ00X_MP3'] = 'from MP3 import QJ00X_MP3';
var code = 'mp3' + '.' + CONTROL_TYPE + '()\n';
return code;
}
// mp3 循环模式
export const MP3_LOOP_MODE = function (_, generator) {
var LOOP_MODE = this.getFieldValue('LOOP_MODE');
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.definitions_['import_QJ00X_MP3'] = 'from MP3 import QJ00X_MP3';
var code = 'mp3' + '.set_loop(' + LOOP_MODE + ')\n';
return code;
}
// mp3 EQ模式
export const MP3_EQ_MODE = function (_, generator) {
var EQ_MODE = this.getFieldValue('EQ_MODE');
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.definitions_['import_QJ00X_MP3'] = 'from MP3 import QJ00X_MP3';
var code = 'mp3' + '.set_eq(' + EQ_MODE + ')\n';
return code;
}
// mp3 设置音量
export const MP3_VOL = function (_, generator) {
var vol = generator.valueToCode(this, 'vol', generator.ORDER_ATOMIC);
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.definitions_['import_QJ00X_MP3'] = 'from MP3 import QJ00X_MP3';
var code = 'mp3' + '.set_vol(' + vol + ')\n';
return code;
}
// mp3 播放第N首
export const MP3_PLAY_NUM = function (_, generator) {
var NUM = generator.valueToCode(this, 'NUM', generator.ORDER_ATOMIC);
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.definitions_['import_QJ00X_MP3'] = 'from MP3 import QJ00X_MP3';
var code = 'mp3' + '.playFileByIndexNumber(' + NUM + ')\n';
return code;
}
export const MP3_PLAY_FOLDER = function (_, generator) {
var FOLDER = generator.valueToCode(this, 'FOLDER', generator.ORDER_ATOMIC);
var NUM = generator.valueToCode(this, 'NUM', generator.ORDER_ATOMIC);
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.definitions_['import_QJ00X_MP3'] = 'from MP3 import QJ00X_MP3';
var code = 'mp3' + '.set_folder(' + FOLDER + ', ' + NUM + ')\n';
return code;
}

View File

@@ -0,0 +1,108 @@
export const radio_ons = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.definitions_['import_radio'] = 'import radio';
var type = this.getFieldValue('type');
var code = 'radio.' + type + '()\n';
return code;
}
export const microbit_radio_on = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.definitions_['import_radio'] = 'import radio';
var code = 'radio.on()\n';
return code;
}
export const microbit_radio_off = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.definitions_['import_radio'] = 'import radio';
var code = 'radio.off()\n';
return code;
}
export const microbit_radio_config = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.definitions_['import_radio'] = 'import radio';
//var number_length = block.getFieldValue('length');
var number_length = generator.valueToCode(this, "length", generator.ORDER_ATOMIC);
var number_queue = generator.valueToCode(this, "queue", generator.ORDER_ATOMIC);
var number_channel = generator.valueToCode(this, "channel", generator.ORDER_ATOMIC);
var number_power = generator.valueToCode(this, "power", generator.ORDER_ATOMIC);
var number_address = generator.valueToCode(this, "address", generator.ORDER_ATOMIC);
var number_group = generator.valueToCode(this, "group", generator.ORDER_ATOMIC);
var dropdown_data_rate = generator.valueToCode(this, "data_rate", generator.ORDER_ATOMIC);
var code = 'radio.config(length=' + number_length + ', queue=' + number_queue + ', channel=' + number_channel + ', power=' + number_power + ', address=' + number_address + ', group=' + number_group + ', data_rate=radio.' + dropdown_data_rate + ')\n';
return code;
}
export const microbit_radio_reset = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.definitions_['import_radio'] = 'import radio';
var code = 'radio.reset()\n';
return code;
}
export const radio_send_string = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.definitions_['import_radio'] = 'import radio';
var type = this.getFieldValue('type');
var number = generator.valueToCode(this, 'data', generator.ORDER_ATOMIC);
return "radio." + type + "(" + number + ")\n";
}
export const radio_receive_string = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.definitions_['import_radio'] = 'import radio';
var type = this.getFieldValue('type');
var code = "radio." + type + "()";
return [code, generator.ORDER_ATOMIC];
}
export const microbit_radio_receive = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.definitions_['import_radio'] = 'import radio';
var code = 'radio.receive()';
return [code, generator.ORDER_ATOMIC];
}
export const i2c_init = function (_, generator) {
var dropdown_pin1 = generator.valueToCode(this, 'RX', generator.ORDER_ATOMIC);
var dropdown_pin2 = generator.valueToCode(this, 'TX', generator.ORDER_ATOMIC);
var freq = generator.valueToCode(this, 'freq', generator.ORDER_ATOMIC);
if (!isNaN(parseInt(dropdown_pin1)))
dropdown_pin1 = "pin" + dropdown_pin1;
if (!isNaN(parseInt(dropdown_pin2)))
dropdown_pin2 = "pin" + dropdown_pin2;
return "i2c.init(sda=" + dropdown_pin1 + ", scl=" + dropdown_pin2 + ", freq=" + freq + ")\n";
}
export const i2c_read = function (_, generator) {
var address = generator.valueToCode(this, 'address', generator.ORDER_ATOMIC);
var data = generator.valueToCode(this, 'data', generator.ORDER_ATOMIC);
var is_repeated = this.getFieldValue('is_repeated');
is_repeated = is_repeated.substring(0, 1).toUpperCase() + is_repeated.substring(1).toLowerCase();
return ["i2c.read(" + address + ", " + data + ", " + is_repeated + ")", generator.ORDER_ATOMIC];
}
export const i2c_write = function (_, generator) {
var address = generator.valueToCode(this, 'address', generator.ORDER_ATOMIC);
var data = generator.valueToCode(this, 'data', generator.ORDER_ATOMIC);
var is_repeated = this.getFieldValue('is_repeated');
is_repeated = is_repeated.substring(0, 1).toUpperCase() + is_repeated.substring(1).toLowerCase();
return "i2c.write(" + address + ", " + data + ", " + is_repeated + ")\n";
}
export const spi_init = function (block) {
var freq = block.getFieldValue('freq');
var bits = block.getFieldValue('bits');
var mode = block.getFieldValue('mode');
var mosi = block.getFieldValue('mosi');
var miso = block.getFieldValue('miso');
var sck = block.getFieldValue('sck');
return "spi.init(baudrate=" + freq + ", bits=" + bits + ", mode=" + mode + ", mosi=" + mosi + ", miso= " + miso + ", sclk=" + sck + ");\n";
}
export const spi_write = function (_, generator) {
var data = generator.valueToCode(this, 'data', generator.ORDER_ATOMIC);
return ["spi.write(" + data + ")", generator.ORDER_ATOMIC];
}

View File

@@ -0,0 +1,279 @@
export const microbit_display_clear = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var code = 'display.clear()\n';
return code;
}
export const monitor_get_pixel = function (block, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var value_x = generator.valueToCode(block, 'x', generator.ORDER_ATOMIC);
var value_y = generator.valueToCode(block, 'y', generator.ORDER_ATOMIC);
var code = 'display.get_pixel(int(' + value_x + '), int(' + value_y + '))';
return [code, generator.ORDER_ATOMIC];
}
export const microbit_display_set_pixel = function (block, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var value_x = generator.valueToCode(block, 'x', generator.ORDER_ATOMIC);
var value_y = generator.valueToCode(block, 'y', generator.ORDER_ATOMIC);
var value_value = generator.valueToCode(block, 'value', generator.ORDER_ATOMIC);
var code = 'display.set_pixel(int(' + value_x + '), int(' + value_y + '), ' + value_value + ')\n';
return code;
}
export const monitor_bright_point = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var x = generator.valueToCode(this, 'x', generator.ORDER_ASSIGNMENT);
var y = generator.valueToCode(this, 'y', generator.ORDER_ASSIGNMENT);
var brightness = generator.valueToCode(this, 'brightness', generator.ORDER_ASSIGNMENT);
var code = 'display.set_pixel(int(' + x + '), int(' + y + '), ' + brightness + ")\n";
return code;
}
export const monitor_show_image_or_string = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var code = "display.show(" + data + ")\n";
return code;
}
export const monitor_scroll_string = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var code = "display.scroll(" + data + ")\n";
return code;
}
export const monitor_scroll_string_with_delay = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var delay = generator.valueToCode(this, 'delay', generator.ORDER_ASSIGNMENT);
var code = "display.scroll(" + data + ", delay=" + delay + ")\n";
return code;
}
export const microbit_display_show_image = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var value_image = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var code = 'display.show(' + value_image + ')\n';
return code;
}
export const microbit_display_show_default_image = function (block, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var dropdown_image = block.getFieldValue('image');
var value_image = 'Image.' + dropdown_image;
var code = 'display.show(' + value_image + ')\n';
return code;
}
export const microbit_display_show_animation = function (block, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var value_images = generator.valueToCode(block, 'images', generator.ORDER_ATOMIC);
var number_delay = generator.valueToCode(block, 'delay', generator.ORDER_ATOMIC);
var checkbox_wait = block.getFieldValue('wait') == 'TRUE' ? 'True' : 'False';
var checkbox_loop = block.getFieldValue('loop') == 'TRUE' ? 'True' : 'False';
var checkbox_clear = block.getFieldValue('clear') == 'TRUE' ? 'True' : 'False';
var code = 'display.show(' + value_images + ', delay=' + number_delay + ', wait=' + checkbox_wait + ', loop=' + checkbox_loop + ', clear=' + checkbox_clear + ')\n';
return code;
}
export const microbit_display_scroll = function (block, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var value_message = generator.valueToCode(block, 'message', generator.ORDER_ATOMIC);
var code = 'display.scroll(' + value_message + ')\n';
return code;
}
export const microbit_display_on = function (block, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var mode = block.getFieldValue('on_off');
var code = 'display.' + mode + '()\n';
return code;
}
// export const microbit_display_off = function(block) {
// generator.definitions_['import_microbit_*'] = 'from microbit import *';
// var code = 'display.off()\n';
// return code;
// }
export const microbit_display_is_on = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var code = 'display.is_on()';
return [code, generator.ORDER_ATOMIC];
}
export const microbit_image_builtins = function (block, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var dropdown_image = block.getFieldValue('image');
var code = 'Image.' + dropdown_image;
return [code, generator.ORDER_ATOMIC];
}
export const microbit_image_copy = function (block, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var value_image = generator.valueToCode(block, 'image', generator.ORDER_ATOMIC);
var code = value_image + '.copy()';
return [code, generator.ORDER_ATOMIC];
}
export const microbit_image_invert = function (block, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var value_image = generator.valueToCode(block, 'image', generator.ORDER_ATOMIC);
var code = value_image + '.invert()';
return [code, generator.ORDER_ATOMIC];
}
export const microbit_image_create = function (block, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var colours = {
"#000000": "0",
"#440000": "1",
"#660000": "2",
"#880000": "3",
"#aa0000": "4",
"#bb0000": "5",
"#cc0000": "6",
"#dd0000": "7",
"#ee0000": "8",
"#ff0000": "9"
}
var colour_00 = colours[block.getFieldValue('00')];
var colour_01 = colours[block.getFieldValue('01')];
var colour_02 = colours[block.getFieldValue('02')];
var colour_03 = colours[block.getFieldValue('03')];
var colour_04 = colours[block.getFieldValue('04')];
var colour_10 = colours[block.getFieldValue('10')];
var colour_11 = colours[block.getFieldValue('11')];
var colour_12 = colours[block.getFieldValue('12')];
var colour_13 = colours[block.getFieldValue('13')];
var colour_14 = colours[block.getFieldValue('14')];
var colour_20 = colours[block.getFieldValue('20')];
var colour_21 = colours[block.getFieldValue('21')];
var colour_22 = colours[block.getFieldValue('22')];
var colour_23 = colours[block.getFieldValue('23')];
var colour_24 = colours[block.getFieldValue('24')];
var colour_30 = colours[block.getFieldValue('30')];
var colour_31 = colours[block.getFieldValue('31')];
var colour_32 = colours[block.getFieldValue('32')];
var colour_33 = colours[block.getFieldValue('33')];
var colour_34 = colours[block.getFieldValue('34')];
var colour_40 = colours[block.getFieldValue('40')];
var colour_41 = colours[block.getFieldValue('41')];
var colour_42 = colours[block.getFieldValue('42')];
var colour_43 = colours[block.getFieldValue('43')];
var colour_44 = colours[block.getFieldValue('44')];
var code = 'Image("' + colour_00 + colour_01 + colour_02 + colour_03 + colour_04 + ':' + colour_10 + colour_11 + colour_12 + colour_13 + colour_14 + ':' + colour_20 + colour_21 + colour_22 + colour_23 + colour_24 + ':' + colour_30 + colour_31 + colour_32 + colour_33 + colour_34 + ':' + colour_40 + colour_41 + colour_42 + colour_43 + colour_44 + '")';
return [code, generator.ORDER_ATOMIC];
}
export const image_shift = function (block, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var op = block.getFieldValue("OP");
var image = generator.valueToCode(block, 'img', generator.ORDER_ATOMIC);
var value = generator.valueToCode(block, 'val', generator.ORDER_ATOMIC);
var code = image + '.shift_' + op + '(' + value + ')';
return [code, generator.ORDER_ATOMIC];
}
export const image_arithmetic = function (block, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var op = block.getFieldValue("OP");
var imga = generator.valueToCode(block, 'A', generator.ORDER_ATOMIC);
var imgb = generator.valueToCode(block, 'B', generator.ORDER_ATOMIC);
if (op == 'INTERSECTION') {
var code = imga + '-(' + imga + '-' + imgb + ')';
} else {
var code = imga + op + imgb;
}
return [code, generator.ORDER_ATOMIC];
}
export const microbit_display_scroll_string_animation = function (block, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var value_images = generator.valueToCode(block, 'images', generator.ORDER_ATOMIC) || 'hello';
var number_delay = generator.valueToCode(block, 'delay', generator.ORDER_ATOMIC);
var checkbox_wait = block.getFieldValue('wait') == 'TRUE' ? 'True' : 'False';
var checkbox_loop = block.getFieldValue('loop') == 'TRUE' ? 'True' : 'False';
var checkbox_clear = block.getFieldValue('clear') == 'TRUE' ? 'True' : 'False';
var code = 'display.scroll' + '(' + value_images + ', delay=' + number_delay + ', wait=' + checkbox_wait + ', loop=' + checkbox_loop + ', clear=' + checkbox_clear + ')\n';
return code;
}
// export const microbit_display_scroll_string = function(block) {
// generator.definitions_['import_microbit_*'] = 'from microbit import *';
// var value_images = generator.valueToCode(block, 'images', generator.ORDER_MEMBER) || 'hello';
// var number_delay = generator.valueToCode(block, 'delay', generator.ORDER_ATOMIC);
// var checkbox_wait = block.getFieldValue('wait') == 'TRUE' ? 'True' : 'False';
// var checkbox_loop = block.getFieldValue('loop') == 'TRUE' ? 'True' : 'False';
// var checkbox_clear = block.getFieldValue('clear') == 'TRUE' ? 'True' : 'False';
// var code = 'display.show(' + value_images + ', delay=' + number_delay + ', wait=' + checkbox_wait + ', loop=' + checkbox_loop + ', clear=' + checkbox_clear + ')\n';
// return code;
// }
export const group_lcd_print = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.definitions_['import_lcd1602'] = 'import lcd1602';
var str1 = generator.valueToCode(this, 'TEXT', generator.ORDER_ASSIGNMENT);
var str2 = generator.valueToCode(this, 'TEXT2', generator.ORDER_ASSIGNMENT);
//generator.setups_['class_LCD1602'] = generator.CLASS_LCD1602_INIT;//python.js
var code = 'mylcd.mixly_puts_two_lines(' + str1 + ', ' + str2 + ')\n';
return code;
}
export const group_lcd_init = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.definitions_['import_lcd1602'] = 'import lcd1602';
var device = generator.valueToCode(this, 'device', generator.ORDER_ASSIGNMENT) || '0x27';
//generator.setups_['class_LCD1602'] = generator.CLASS_LCD1602_INIT;//python.js
return 'mylcd = lcd1602.LCD1602(' + device + ')\n';
}
export const group_lcd_print2 = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.definitions_['import_lcd1602'] = 'import lcd1602';
var str = generator.valueToCode(this, 'TEXT', generator.ORDER_ASSIGNMENT) || 'String("")';
var row = generator.valueToCode(this, 'row', generator.ORDER_ASSIGNMENT) || '1';
var column = generator.valueToCode(this, 'column', generator.ORDER_ASSIGNMENT) || '1';
//generator.setups_['class_LCD1602'] = generator.CLASS_LCD1602_INIT;//python.js
var code = 'mylcd.mixly_puts(' + str + ', ' + column + ', ' + row + ')\n'
return code;
}
export const group_lcd_power = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.definitions_['import_lcd1602'] = 'import lcd1602';
var dropdown_stat = this.getFieldValue('STAT');
var code = 'mylcd.' + dropdown_stat + '\n';
return code;
}
export const lp2i_u8g_draw_4strings = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.definitions_['import_oled'] = 'import oled';
var value_text_line1 = generator.valueToCode(this, 'Text_line1', generator.ORDER_ASSIGNMENT) || '\'\'';
var value_text_line2 = generator.valueToCode(this, 'Text_line2', generator.ORDER_ASSIGNMENT) || '\'\'';
var value_text_line3 = generator.valueToCode(this, 'Text_line3', generator.ORDER_ASSIGNMENT) || '\'\'';
var value_text_line4 = generator.valueToCode(this, 'Text_line4', generator.ORDER_ASSIGNMENT) || '\'\'';
//generator.setups_["class_OLED12864_I2C"] = generator.CLASS_OLED12864_I2C_INIT;
return 'mixly_oled_text(' + value_text_line1 + ', ' + value_text_line2 + ', ' + value_text_line3 + ', ' + value_text_line4 + ')\n';
}
export const display_image_size = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var data = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var size = this.getFieldValue('OP');
var code = ["Image." + size + "(" + data + ")", generator.ORDER_ATOMIC];
return code;
}
export const display_fill = function (_, generator) {
var varName = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.definitions_['import_oled'] = 'import oled';
var key = this.getFieldValue('key');
var code = varName + '.show_fill(' + key + ')\n';
return code;
}

View File

@@ -0,0 +1,87 @@
export const factory_from_import = function (_, generator) {
var path = this.getFieldValue('path');
var module = this.getFieldValue('module');
generator.definitions_['import_' + path + '_' + module] = 'from ' + path + ' import ' + module;
return '';
}
export const factory_import = function (_, generator) {
var module = this.getFieldValue('module');
generator.definitions_['import_' + module] = 'import ' + module;
return '';
}
export const factory_function_noreturn = function (_, generator) {
var NAME = this.getFieldValue('NAME');
var code = new Array(this.itemCount_);
for (var n = 0; n < this.itemCount_; n++) {
code[n] = generator.valueToCode(this, 'ADD' + n,
generator.ORDER_NONE) || '';
}
return NAME + '(' + code.join(', ') + ')\n';
}
export const factory_function_return = function (_, generator) {
var NAME = this.getFieldValue('NAME');
var code = new Array(this.itemCount_);
for (var n = 0; n < this.itemCount_; n++) {
code[n] = generator.valueToCode(this, 'ADD' + n,
generator.ORDER_NONE) || '';
}
return [NAME + '(' + code.join(', ') + ')', generator.ORDER_ATOMIC];
}
export const factory_declare = function (_, generator) {
var TYPE = this.getFieldValue('TYPE');
var NAME = this.getFieldValue('NAME');
generator.setups_['var_' + TYPE + '_' + NAME] = NAME + ' = ' + TYPE + '()\n';
return '';
}
export const factory_callMethod_noreturn = function (_, generator) {
var NAME = this.getFieldValue('NAME');
var METHOD = this.getFieldValue('METHOD');
var code = new Array(this.itemCount_);
for (var n = 0; n < this.itemCount_; n++) {
code[n] = generator.valueToCode(this, 'ADD' + n,
generator.ORDER_NONE) || '';
}
return NAME + '.' + METHOD + '(' + code.join(', ') + ')\n';
}
export const factory_callMethod_return = function (_, generator) {
var NAME = this.getFieldValue('NAME');
var METHOD = this.getFieldValue('METHOD');
var code = new Array(this.itemCount_);
for (var n = 0; n < this.itemCount_; n++) {
code[n] = generator.valueToCode(this, 'ADD' + n,
generator.ORDER_NONE) || '';
}
return [NAME + '.' + METHOD + '(' + code.join(', ') + ')', generator.ORDER_ATOMIC];
}
export const factory_block = function () {
var VALUE = this.getFieldValue('VALUE');
//if(!(VALUE.charAt(VALUE.length-1)==";")){
//VALUE=VALUE+';';
//}
return VALUE + '\n';
}
export const factory_block_return = function (_, generator) {
var VALUE = this.getFieldValue('VALUE');
return [VALUE, generator.ORDER_ATOMIC];
}
export const factory_block_with_textarea = function () {
var VALUE = this.getFieldValue('VALUE');
//if(!(VALUE.charAt(VALUE.length-1)==";")){
//VALUE=VALUE+';';
//}
return VALUE + '\n';
}
export const factory_block_return_with_textarea = function (_, generator) {
var VALUE = this.getFieldValue('VALUE');
return [VALUE, generator.ORDER_ATOMIC];
}

View File

@@ -0,0 +1,115 @@
import * as Blockly from 'blockly/core';
export const game_create_sprite = function (_, generator) {
var x = generator.valueToCode(this, 'x', generator.ORDER_ATOMIC);
var y = generator.valueToCode(this, 'y', generator.ORDER_ATOMIC);
var code = 'game.createSprite(' + x + ', ' + y + ')';
return [code, generator.ORDER_ATOMIC];
}
export const game_move_by = function (_, generator) {
var item = generator.valueToCode(this, 'var', generator.ORDER_ATOMIC);
var data = generator.valueToCode(this, 'data', generator.ORDER_ATOMIC);
generator.definitions_['var_declare' + item] = 'let ' + item + ':game.LedSprite = null;';
var code = item + '.move(' + data + ');\n';
return code;
}
export const game_delete_var = function (_, generator) {
var item = generator.valueToCode(this, 'var', generator.ORDER_ATOMIC);
generator.definitions_['var_declare' + item] = 'let ' + item + ':game.LedSprite = null;';
var code = item + '.delete();\n';
Blockly.isDefiniedItem = 1;
return code;
}
export const game_turn_by_direction = function (_, generator) {
var item = generator.valueToCode(this, 'var', generator.ORDER_ATOMIC);
var dir = this.getFieldValue('dir');
var data = generator.valueToCode(this, 'data', generator.ORDER_ATOMIC);
generator.definitions_['var_declare' + item] = 'let ' + item + ':game.LedSprite = null;';
var code = item + '.turn(' + dir + ', ' + data + ');\n';
return code;
}
export const game_change_by = function (_, generator) {
var item = generator.valueToCode(this, 'var', generator.ORDER_ATOMIC);
var change_key = this.getFieldValue('change_key');
var data = generator.valueToCode(this, 'data', generator.ORDER_ATOMIC);
generator.definitions_['var_declare' + item] = 'let ' + item + ':game.LedSprite = null;';
var code = item + '.change(' + change_key + ', ' + data + ');\n';
return code;
}
export const game_set_xy = function (_, generator) {
var item = generator.valueToCode(this, 'var', generator.ORDER_ATOMIC);
var change_key = this.getFieldValue('change_key');
var data = generator.valueToCode(this, 'data', generator.ORDER_ATOMIC);
generator.definitions_['var_declare' + item] = 'let ' + item + ':game.LedSprite = null;';
var code = item + '.set(' + change_key + ', ' + data + ');\n';
return code;
}
export const game_get_xy = function (_, generator) {
var item = generator.valueToCode(this, 'var', generator.ORDER_ATOMIC);
var change_key = this.getFieldValue('change_key');
var code = item + '.get(' + change_key + ')';
generator.definitions_['var_declare' + item] = 'let ' + item + ':game.LedSprite = null;';
return [code, generator.ORDER_ATOMIC];
}
export const game_touch_another = function (_, generator) {
var item = generator.valueToCode(this, 'var', generator.ORDER_ATOMIC);
var another = generator.valueToCode(this, 'another', generator.ORDER_ATOMIC) || 'null';
var code = item + '.isTouching(' + another + ')';
generator.definitions_['var_declare' + item] = 'let ' + item + ':game.LedSprite = null;';
return [code, generator.ORDER_ATOMIC];
}
export const game_touch_edge = function (_, generator) {
var item = generator.valueToCode(this, 'var', generator.ORDER_ATOMIC);
var code = item + '.isTouchingEdge()';
generator.definitions_['var_declare' + item] = 'let ' + item + ':game.LedSprite = null;';
return [code, generator.ORDER_ATOMIC];
}
export const game_on_edge_and_bounce = function (_, generator) {
var item = generator.valueToCode(this, 'var', generator.ORDER_ATOMIC);
var code = item + '.ifOnEdgeBounce();\n';
generator.definitions_['var_declare' + item] = 'let ' + item + ':game.LedSprite = null;';
return code;
}
export const game_change_score = function (_, generator) {
var data = generator.valueToCode(this, 'data', generator.ORDER_ATOMIC);
var code = 'game.addScore(' + data + ');\n';
return code;
}
export const game_set_score = function (_, generator) {
var data = generator.valueToCode(this, 'data', generator.ORDER_ATOMIC);
var code = 'game.setScore(' + data + ');\n';
return code;
}
export const game_start_countdown = function (_, generator) {
var data = generator.valueToCode(this, 'data', generator.ORDER_ATOMIC);
var code = 'game.startCountdown(' + data + ');\n';
return code;
}
export const game_get_score = function (_, generator) {
return ["game.score()", generator.ORDER_ATOMIC];
}
export const game_over = function () {
return "game.gameOver();\n";
}
export const game_resume = function () {
return "game.resume();\n";
}
export const game_pause = function () {
return "game.pause();\n";
}

View File

@@ -0,0 +1,65 @@
// ok
export const inout_highlow = function (_, generator) {
// Boolean values HIGH and LOW.
var code = (this.getFieldValue('BOOL') == 'HIGH') ? '1' : '0';
return [code, generator.ORDER_ATOMIC];
}
// ok
export const inout_digital_write = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var dropdown_stat = generator.valueToCode(this, 'STAT', generator.ORDER_ATOMIC);
var code = "";
// code += 'pins.digitalWritePin(' + dropdown_pin + ',' + dropdown_stat + ')\n'
code += 'pin'+ dropdown_pin +'.write_digital('+ dropdown_stat +')\n'
return code;
}
// ok
export const inout_digital_read = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var code = "";
code = 'pin' + dropdown_pin + '.read_digital()';
return [code, generator.ORDER_ATOMIC];
}
//ok
export const inout_analog_write = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
//var dropdown_stat = this.getFieldValue('STAT');
var value_num = generator.valueToCode(this, 'NUM', generator.ORDER_ATOMIC);
//generator.setups_['setup_output'+dropdown_pin] = 'pinMode('+dropdown_pin+', OUTPUT);';
var code = 'pin' + dropdown_pin + '.write_analog(' + value_num + ')\n';
return code;
}
//ok
export const inout_analog_write_set = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var value_num = generator.valueToCode(this, 'NUM', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
var code = 'pin' + dropdown_pin + '.set_analog_'+ key +'(' + value_num + ')\n';
//var code = 'pin' + dropdown_pin + '.set_analog_period(' + value_num + ')\n';
return code;
}
// ok
export const inout_analog_read = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
//generator.setups_['setup_input_'+dropdown_pin] = 'pinMode('+dropdown_pin+', INPUT);';
var code = 'pin' + dropdown_pin + '.read_analog()';
return [code, generator.ORDER_ATOMIC];
}
// ok
export const sensor_pin_pressed = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var pin = generator.valueToCode(this, 'pin', generator.ORDER_ATOMIC);
var code = 'pin'+ pin + '.is_touched()';
return [code, generator.ORDER_ATOMIC];
}

View File

@@ -0,0 +1,17 @@
export const pins_digital = function (_, generator) {
var code = this.getFieldValue('PIN');
return [code, generator.ORDER_ATOMIC];
}
export const pins_analog = pins_digital;
export const pins_button = pins_digital;
export const pins_pwm = pins_digital;
export const pins_interrupt = pins_digital;
export const pins_serial = pins_digital;
export const pins_builtinimg = pins_digital;
export const pins_imglist = pins_digital;
export const pins_axis = pins_digital;
export const pins_brightness = pins_digital;
export const pins_tone_notes = pins_digital;
export const pins_radio_power = pins_digital;
export const pins_radio_datarate = pins_digital;

View File

@@ -0,0 +1,304 @@
export const sensor_button_is_pressed = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var btn = generator.valueToCode(this, 'btn', generator.ORDER_ATOMIC);
var code = btn + '.is_pressed()';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_button_was_pressed = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var btn = generator.valueToCode(this, 'btn', generator.ORDER_ATOMIC);
var code = btn + '.was_pressed()';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_button_get_presses = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var btn = generator.valueToCode(this, 'btn', generator.ORDER_ATOMIC);
var code = btn + '.get_presses()';
return [code, generator.ORDER_ATOMIC];
}
export const controls_GestureLists = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var gesture = this.getFieldValue('gesture');
// generator.definitions_['func_gesture' + gesture] = code;
return ['"' + gesture + '"', generator.ORDER_ATOMIC];
}
export const controls_attachGestureInterrupt = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var gesture = this.getFieldValue('gesture');
var branch = generator.statementToCode(this, 'DO');
var d = branch || generator.PASS;
var code = 'if accelerometer.is_gesture("' + gesture + '"):\n' + d;
// generator.definitions_['func_gesture' + gesture] = code;
return code;
}
export const sensor_current_gesture1 = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var gesture = this.getFieldValue('gesture');
var code = 'accelerometer.is_gesture("' + gesture + '")';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_current_gesture2 = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var gesture = this.getFieldValue('gesture');
var code = 'accelerometer.was_gesture("' + gesture + '")';
return [code, generator.ORDER_ATOMIC];
}
export const controls_attachGestureInterrupt2 = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var gesture = this.getFieldValue('gesture');
var branch = generator.statementToCode(this, 'DO');
var d = branch || generator.PASS;
var code = 'if accelerometer.was_gesture("' + gesture + '"):\n' + d;
// generator.definitions_['func_gesture' + gesture] = code;
return code;
}
export const sensor_get_gestures = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var gesture = this.getFieldValue('GES');
var a;
if (gesture == 'all') {
a = 'accelerometer.get_gestures()';
}
else if (gesture == 'current') {
a = 'accelerometer.current_gesture()';
}
return [a, generator.ORDER_ATOMIC];
}
export const sensor_current_gesture = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
return ['accelerometer.current_gesture()', generator.ORDER_ATOMIC];
}
export const sensor_get_acceleration = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var key = this.getFieldValue('key')
var code = 'accelerometer.get_' + key + '()';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_set_acceleration = function () {
var key = this.getFieldValue('key')
var code = 'input.setAccelerometerRange(' + key + ')\n';
return code;
}
// undefined?!?!?!?!
export const sensor_light_level = function (_, generator) {
return ['input.lightLevel()', generator.ORDER_ATOMIC];
}
export const sensor_calibrate_compass = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
return 'compass.calibrate()\n';
}
export const sensor_is_compass_calibrated = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
return ['compass.is_calibrated()', generator.ORDER_ATOMIC];
}
export const sensor_compass_heading = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
return ['compass.heading()', generator.ORDER_ATOMIC];
}
export const sensor_temperature = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
return ['temperature()', generator.ORDER_ATOMIC];
}
export const sensor_field_strength = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var compass = this.getFieldValue('compass');
var code = 'compass.' + compass + '()'
return [code, generator.ORDER_ATOMIC];
}
export const sensor_rotation = function (_, generator) {
var key = this.getFieldValue('key')
var code = 'input.rotation(' + key + ')';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_magnetic = function (_, generator) {
var key = this.getFieldValue('key')
var code = 'input.magneticForce(' + key + ')';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_distance_hrsc04 = function (_, generator) {
var Trig = this.getFieldValue('Trig');
var Echo = this.getFieldValue('Echo');
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.definitions_['import_ultrasonic'] = 'import ultrasonic';
return ['ultrasonic.distance_cm(t_pin=pin' + Trig + ', e_pin=pin' + Echo + ')', generator.ORDER_ATOMIC];
}
export const sensor_distance_hrsc04_ = function (_, generator) {
var Trig = this.getFieldValue('Trig');
var Echo = this.getFieldValue('Echo');
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.setups_['class_hrsc04_'] =
'class HCSR04:\n' +
' def __init__(self, tpin=pin' + Trig + ', epin=pin' + Echo + ', spin=pin13):\n' +
' self.trigger_pin = tpin\n' +
' self.echo_pin = epin\n' +
' self.sclk_pin = spin\n' +
'\n' +
' def distance_mm(self):\n' +
' spi.init(baudrate=125000, sclk=self.sclk_pin,\n' +
' mosi=self.trigger_pin, miso=self.echo_pin)\n' +
' pre = 0\n' +
' post = 0\n' +
' k = -1\n' +
' length = 500\n' +
' resp = bytearray(length)\n' +
' resp[0] = 0xFF\n' +
' spi.write_readinto(resp, resp)\n' +
' # find first non zero value\n' +
' try:\n' +
' i, value = next((ind, v) for ind, v in enumerate(resp) if v)\n' +
' except StopIteration:\n' +
' i = -1\n' +
' if i > 0:\n' +
' pre = bin(value).count("1")\n' +
' # find first non full high value afterwards\n' +
' try:\n' +
' k, value = next((ind, v)\n' +
' for ind, v in enumerate(resp[i:length - 2]) if resp[i + ind + 1] == 0)\n' +
' post = bin(value).count("1") if k else 0\n' +
' k = k + i\n' +
' except StopIteration:\n' +
' i = -1\n' +
' dist= -1 if i < 0 else round((pre + (k - i) * 8. + post) * 8 * 0.172)\n' +
' return dist\n' +
'\n' +
' def distance_cm(self):\n' +
' return self.distance_mm() / 10.0\n' +
'\n' +
'sonar=HCSR04()\n' +
'\n'
return ['sonar.distance_cm()', generator.ORDER_ATOMIC];
}
export const DS1307_init = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.definitions_['import_RTC'] = 'from RTC import *';
//var RTCName = this.getFieldValue('RTCName');
//generator.definitions_['include_Mixly'] = '#include "Mixly.h"';
//generator.setups_['class_DS1307'] = generator.CLASS_DS1307_INIT;
//generator.definitions_['DS1307'+RTCName] = 'DS1307 ' + RTCName + '('+SDA+','+SCL+');';
//return 'DS1307' + '('+SDA+','+SCL+')\n';
}
export const RTC_get_time = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.definitions_['import_RTC'] = 'from RTC import *';
//var RTCName = this.getFieldValue('RTCName');
var timeType = this.getFieldValue('TIME_TYPE');
//generator.setups_['class_DS1307'] = generator.CLASS_DS1307_INIT;
switch (timeType) {
//
case "Year":
var code = 'ds.' + timeType + '()';
return [code, generator.ORDER_ASSIGNMENT];
case "Month":
var code = 'ds.' + timeType + '()';
return [code, generator.ORDER_ASSIGNMENT];
case "Day":
var code = 'ds.' + timeType + '()';
return [code, generator.ORDER_ASSIGNMENT];
case "Hour":
var code = 'ds.' + timeType + '()';
return [code, generator.ORDER_ASSIGNMENT];
case "Minute":
var code = 'ds.' + timeType + '()';
return [code, generator.ORDER_ASSIGNMENT];
case "Second":
var code = 'ds.' + timeType + '()';
return [code, generator.ORDER_ASSIGNMENT];
case "Week":
var code = 'ds.' + timeType + '()';
return [code, generator.ORDER_ASSIGNMENT];
case "Mix1":
var code = 'ds.get_date()';
return [code, generator.ORDER_ASSIGNMENT];
case "Mix2":
var code = 'ds.get_time()';
return [code, generator.ORDER_ASSIGNMENT];
}
}
export const RTC_set_time = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.definitions_['import_RTC'] = 'from RTC import *';
//var RTCName = this.getFieldValue('RTCName');
var hour = generator.valueToCode(this, "hour", generator.ORDER_ASSIGNMENT);
var minute = generator.valueToCode(this, "minute", generator.ORDER_ASSIGNMENT);
var second = generator.valueToCode(this, "second", generator.ORDER_ASSIGNMENT);
//generator.setups_['class_DS1307'] = generator.CLASS_DS1307_INIT;
var code = 'ds.set_time(' + hour + ', ' + minute + ', ' + second + ')\n';
return code;
}
export const RTC_set_date = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.definitions_['import_RTC'] = 'from RTC import *';
//var RTCName = this.getFieldValue('RTCName');
var year = generator.valueToCode(this, "year", generator.ORDER_ASSIGNMENT);
var month = generator.valueToCode(this, "month", generator.ORDER_ASSIGNMENT);
var day = generator.valueToCode(this, "day", generator.ORDER_ASSIGNMENT);
//generator.setups_['class_DS1307'] = generator.CLASS_DS1307_INIT;
var code = 'ds.set_date(' + year + ', ' + month + ', ' + day + ')\n';
return code;
}
export const sensor_compass_reset = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
return 'compass.clear_calibration()\n';
}
export const sensor_light = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
return ['display.read_light_level()', generator.ORDER_ATOMIC];
}
export const sensor_hrsc04_init = function (_, generator) {
var Trig = this.getFieldValue('Trig');
var Echo = this.getFieldValue('Echo');
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.definitions_['import_ultrasonic'] = 'from ultrasonic import *';
return "sonar = HCSR04(tpin=pin" + Trig + ", epin=pin" + Echo + ")\n"
}
export const TCS34725_Get_RGB = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.definitions_['import_TCS'] = 'from TCS import *';
var RGB = this.getFieldValue('TCS34725_COLOR');
return ["tcs.getRawRGBData(" + RGB + ")", generator.ORDER_ATOMIC];
}
export const NTC_TEMP = function (_, generator) {
var PIN = this.getFieldValue('PIN');
var NominalResistance = generator.valueToCode(this, 'NominalResistance', generator.ORDER_ATOMIC);
var betaCoefficient = generator.valueToCode(this, 'betaCoefficient', generator.ORDER_ATOMIC);
var seriesResistor = generator.valueToCode(this, 'seriesResistor', generator.ORDER_ATOMIC);
generator.definitions_['import_microbit_*'] = 'from microbit import *';
generator.definitions_['import_ntc'] = 'import ntc';
var code = 'ntc.read(pin' + PIN + ', ' + NominalResistance + ', ' + betaCoefficient + ', ' + seriesResistor + ')';
return [code, generator.ORDER_ATOMIC];
}

View File

@@ -0,0 +1,91 @@
export const serial_print = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var content = generator.valueToCode(this, 'CONTENT', generator.ORDER_ATOMIC) || '""'
var code = "uart.write(str(" + content + "))\n";
return code;
}
export const serial_println = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var content = generator.valueToCode(this, 'CONTENT', generator.ORDER_ATOMIC) || '""'
var code = "uart.write(str(" + content + ")+'\\r\\n')\n";
return code;
}
export const serial_print_hex = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var content = generator.valueToCode(this, 'CONTENT', generator.ORDER_ATOMIC) || '0';
var code = "uart.write(str(hex(" + content + ")) + '\\r\\n')\n";
return code;
}
export const serial_receive_data_event = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var char_marker = generator.valueToCode(this, 'char_marker', generator.ORDER_ATOMIC) || ';';
var branch = generator.statementToCode(this, 'DO');
generator.definitions_['func_serial_receive_data_event_' + char_marker.charCodeAt(1)] = "serial.onDataReceived(" + char_marker + ", () => {\n" + branch + "}\n";
}
export const serial_any = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var code = "uart.any()";
return [code, generator.ORDER_ATOMIC];
}
export const serial_readstr = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var code = "uart.read()";
return [code, generator.ORDER_ATOMIC];
}
export const serial_readline = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var code = "uart.readline()";
return [code, generator.ORDER_ATOMIC];
}
export const serial_readstr_until = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var char_marker = this.getFieldValue('char_marker');
var code = "serial.readUntil(" + char_marker + ")";
return [code, generator.ORDER_ATOMIC];
}
export const serial_softserial = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var dropdown_pin1 = generator.valueToCode(this, 'RX', generator.ORDER_ATOMIC);
var dropdown_pin2 = generator.valueToCode(this, 'TX', generator.ORDER_ATOMIC);
if (!isNaN(parseInt(dropdown_pin1)))
dropdown_pin1 = "pin" + dropdown_pin1;
if (!isNaN(parseInt(dropdown_pin2)))
dropdown_pin2 = "pin" + dropdown_pin2;
var baudrate = this.getFieldValue('baudrate');
return "uart.init(rx=" + dropdown_pin1 + ", tx=" + dropdown_pin2 + ", baudrate=" + baudrate + ")\n";
}
export const serial_begin = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var baudrate = this.getFieldValue('baudrate');
return "uart.init(baudrate=" + baudrate + ")\n";
}
export const IO_input = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '""';
return ['input(' + str + ')', generator.ORDER_ATOMIC];
}
export const IO_print = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '""';
var code = "print(" + str + ")\n";
return code;
}
export const IO_print_inline = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '""';
var code = "print(" + str + ',end ="")\n';
return code;
}

View File

@@ -0,0 +1,91 @@
import { Profile } from 'mixly';
export const system_run_in_background = function (_, generator) {
var branch = generator.statementToCode(this, 'do');
return 'control.inBackground(() => {\n' + branch + '})\n';
}
export const system_reset = function () {
return 'control.reset()\n';
}
export const system_wait = function (_, generator) {
var data = generator.valueToCode(this, 'data', generator.ORDER_ATOMIC) || Profile.default.serial;
return 'control.waitMicros(' + data + ')\n';
}
export const system_raise_event = function (_, generator) {
var source = generator.valueToCode(this, 'system_event_bus_source', generator.ORDER_ATOMIC) || Profile.default.serial;
var value = generator.valueToCode(this, 'system_event_bus_value', generator.ORDER_ATOMIC) || Profile.default.serial;
return 'control.raiseEvent(' + source + ', ' + value + ')\n';
}
export const system_on_event = function (_, generator) {
var source = generator.valueToCode(this, 'system_event_bus_source', generator.ORDER_ATOMIC) || Profile.default.serial;
var value = generator.valueToCode(this, 'system_event_bus_value', generator.ORDER_ATOMIC) || Profile.default.serial;
var branch = generator.statementToCode(this, 'do');
return 'control.onEvent(' + source + ', ' + value + ', () => {\n' + branch + ')\n';
}
export const system_timestamp = function (_, generator) {
return ['control.eventTimestamp()', generator.ORDER_ATOMIC];
}
export const system_value = function (_, generator) {
return ['control.eventValue()', generator.ORDER_ATOMIC];
}
export const system_event_bus_source = function (_, generator) {
return [this.getFieldValue('key'), generator.ORDER_ATOMIC];
}
export const system_event_bus_value = function (_, generator) {
return [this.getFieldValue('key'), generator.ORDER_ATOMIC];
}
export const system_device_name = function (_, generator) {
return ['control.deviceName()', generator.ORDER_ATOMIC];
}
export const system_device_serial_number = function (_, generator) {
return ['control.deviceSerialNumber()', generator.ORDER_ATOMIC];
}
// ok
export const base_delay = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var delay_time = generator.valueToCode(this, 'DELAY_TIME', generator.ORDER_ATOMIC) || '1000'
var code = 'sleep(' + delay_time + ')\n';
return code;
}
// ok
export const Panic_with_status_code = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var status_code = generator.valueToCode(this, 'STATUS_CODE', generator.ORDER_ATOMIC) || '1000'
var code = 'panic(' + status_code + ')\n';
return code;
}
// ok
export const controls_millis = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var code = 'running_time()';
return [code, generator.ORDER_ATOMIC];
}
// ok
export const controls_end_program = function () {
return 'while True:\n pass\n';
}
// ok
export const reset = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
return 'reset()\n';
}
export const controls_uname = function (_, generator) {
generator.definitions_['import_os'] = 'import os';
return ['os.uname()', generator.ORDER_ATOMIC];
}

View File

@@ -0,0 +1,119 @@
import * as Blockly from 'blockly/core';
import { Profile } from 'mixly';
import {
PythonVariablesBlocks,
PythonControlBlocks,
PythonMathBlocks,
PythonTextBlocks,
PythonListsBlocks,
PythonDictsBlocks,
PythonLogicBlocks,
PythonStorageBlocks,
PythonProceduresBlocks,
PythonTupleBlocks,
PythonSetBlocks,
PythonHtmlBlocks,
PythonUtilityBlocks,
PythonVariablesGenerators,
PythonControlGenerators,
PythonMathGenerators,
PythonTextGenerators,
PythonListsGenerators,
PythonDictsGenerators,
PythonLogicGenerators,
PythonStorageGenerators,
PythonProceduresGenerators,
PythonTupleGenerators,
PythonSetGenerators,
PythonHtmlGenerators,
PythonUtilityGenerators,
Procedures,
Variables,
Python
} from '@mixly/python';
import {
MicropythonNRF51822MicrobitPins,
MicropythonNRF51822MicrobitActuatorBlocks,
MicropythonNRF51822MicrobitCommunicateBlocks,
MicropythonNRF51822MicrobitDisplayBlocks,
MicropythonNRF51822MicrobitFactoryBlocks,
MicropythonNRF51822MicrobitInoutBlocks,
MicropythonNRF51822MicrobitPinsBlocks,
MicropythonNRF51822MicrobitSensorBlocks,
MicropythonNRF51822MicrobitSerialBlocks,
MicropythonNRF51822MicrobitSystemBlocks,
MicropythonNRF51822MicrobitActuatorGenerators,
MicropythonNRF51822MicrobitCommunicateGenerators,
MicropythonNRF51822MicrobitDisplayGenerators,
MicropythonNRF51822MicrobitFactoryGenerators,
MicropythonNRF51822MicrobitInoutGenerators,
MicropythonNRF51822MicrobitPinsGenerators,
MicropythonNRF51822MicrobitSensorGenerators,
MicropythonNRF51822MicrobitSerialGenerators,
MicropythonNRF51822MicrobitSystemGenerators
} from './';
import './css/color_microbit_python_advance.css';
Object.assign(Blockly.Variables, Variables);
Object.assign(Blockly.Procedures, Procedures);
Blockly.Python = Python;
Blockly.generator = Python;
Profile.default = {};
Object.assign(Profile, MicropythonNRF51822MicrobitPins);
Object.assign(Profile.default, MicropythonNRF51822MicrobitPins['microbit']);
Object.assign(
Blockly.Blocks,
PythonVariablesBlocks,
PythonControlBlocks,
PythonMathBlocks,
PythonTextBlocks,
PythonListsBlocks,
PythonDictsBlocks,
PythonLogicBlocks,
PythonStorageBlocks,
PythonProceduresBlocks,
PythonTupleBlocks,
PythonSetBlocks,
PythonHtmlBlocks,
PythonUtilityBlocks,
MicropythonNRF51822MicrobitActuatorBlocks,
MicropythonNRF51822MicrobitCommunicateBlocks,
MicropythonNRF51822MicrobitDisplayBlocks,
MicropythonNRF51822MicrobitFactoryBlocks,
MicropythonNRF51822MicrobitInoutBlocks,
MicropythonNRF51822MicrobitPinsBlocks,
MicropythonNRF51822MicrobitSensorBlocks,
MicropythonNRF51822MicrobitSerialBlocks,
MicropythonNRF51822MicrobitSystemBlocks
);
Object.assign(
Blockly.Python.forBlock,
PythonVariablesGenerators,
PythonControlGenerators,
PythonMathGenerators,
PythonTextGenerators,
PythonListsGenerators,
PythonDictsGenerators,
PythonLogicGenerators,
PythonStorageGenerators,
PythonProceduresGenerators,
PythonTupleGenerators,
PythonSetGenerators,
PythonHtmlGenerators,
PythonUtilityGenerators,
MicropythonNRF51822MicrobitActuatorGenerators,
MicropythonNRF51822MicrobitCommunicateGenerators,
MicropythonNRF51822MicrobitDisplayGenerators,
MicropythonNRF51822MicrobitFactoryGenerators,
MicropythonNRF51822MicrobitInoutGenerators,
MicropythonNRF51822MicrobitPinsGenerators,
MicropythonNRF51822MicrobitSensorGenerators,
MicropythonNRF51822MicrobitSerialGenerators,
MicropythonNRF51822MicrobitSystemGenerators
);

View File

@@ -0,0 +1,72 @@
from microbit import *
class QJ00X_MP3:
def __init__(self, mp3_rx=pin2, mp3_tx=pin16, volume=0x16, mode=0x01):
uart.init(rx=mp3_rx, tx=mp3_tx, baudrate=9600)
self.set_eq(1)
self.set_vol(volume)
self.set_mode(mode)
self.pause()
def _send_cmd(self, length, cmd, data_high=None, data_low=None):
uart.write(b'\x7E')
uart.write(bytes([length]))
uart.write(bytes([cmd]))
if data_high != None:
uart.write(bytes([data_high]))
if data_low != None:
uart.write(bytes([data_low]))
uart.write(b'\xEF')
sleep(200)
#下一曲
def next_track(self):
self._send_cmd(0x02, 0x03)
#上一曲
def prev_track(self):
self._send_cmd(0x02, 0x04)
#选择曲目
def sel_track(self, track_index):
self._send_cmd(0x03, track_index)
#音量+
def inc_vol(self):
self._send_cmd(0x02, 0x05)
#音量-
def dec_vol(self):
self._send_cmd(0x02, 0x06)
#设置音量
def set_vol(self, volume):
self._send_cmd(0x03, 0x31, data_high=volume)
#设置音效
def set_eq(self, equalizer):
self._send_cmd(0x03, 0x32, data_high=equalizer)
#设置播放设备
def set_mode(self, mode):
self._send_cmd(0x03, 0x35, data_high=mode)
#播放
def play(self):
self._send_cmd(0x02, 0x01)
#终止播放
def pause(self):
self._send_cmd(0x02, 0x02)
#设置文件夹播放
def set_folder(self, folder_index, music_index):
self._send_cmd(0x04, 0x42, data_high=folder_index, data_low=music_index)
#设置曲目播放
def playFileByIndexNumber(self, music_index):
self._send_cmd(0x04, 0x41, data_high=0x00, data_low=music_index)
#设置循环
def set_loop(self, mode):
self._send_cmd(0x03, 0x33, data_high=mode)

View File

@@ -0,0 +1,128 @@
from microbit import *
DS1307_I2C_ADDRESS = (104)
DS1307_REG_SECOND = (0)
DS1307_REG_MINUTE = (1)
DS1307_REG_HOUR = (2)
DS1307_REG_WEEKDAY = (3)
DS1307_REG_DAY = (4)
DS1307_REG_MONTH = (5)
DS1307_REG_YEAR = (6)
DS1307_REG_CTRL = (7)
DS1307_REG_RAM = (8)
class DS1307():
# set reg
def setReg(self, reg, dat):
i2c.write(DS1307_I2C_ADDRESS, bytearray([reg, dat]))
# get reg
def getReg(self, reg):
i2c.write(DS1307_I2C_ADDRESS, bytearray([reg]))
t = i2c.read(DS1307_I2C_ADDRESS, 1)
return t[0]
def start(self):
t = self.getReg(DS1307_REG_SECOND)
self.setReg(DS1307_REG_SECOND, t&0x7F)
def stop(self):
t = self.getReg(DS1307_REG_SECOND)
self.setReg(DS1307_REG_SECOND, t|0x80)
def DecToHex(self, dat):
return (dat//10) * 16 + (dat%10)
def HexToDec(self, dat):
return (dat//16) * 10 + (dat%16)
def DateTime(self, DT=None):
if DT == None:
i2c.write(DS1307_I2C_ADDRESS, bytearray([0]))
buf = i2c.read(DS1307_I2C_ADDRESS, 7)
DT = [0] * 8
DT[0] = self.HexToDec(buf[6]) + 2000
DT[1] = self.HexToDec(buf[5])
DT[2] = self.HexToDec(buf[4])
DT[3] = self.HexToDec(buf[3])
DT[4] = self.HexToDec(buf[2])
DT[5] = self.HexToDec(buf[1])
DT[6] = self.HexToDec(buf[0])
DT[7] = 0
return DT
else:
buf = bytearray(8)
buf[0] = 0
buf[1] = self.DecToHex(DT[6]%60) # second
buf[2] = self.DecToHex(DT[5]%60) # minute
buf[3] = self.DecToHex(DT[4]%24) # hour
buf[4] = self.DecToHex(DT[3]%8) # week day
buf[5] = self.DecToHex(DT[2]%32) # date
buf[6] = self.DecToHex(DT[1]%13) # month
buf[7] = self.DecToHex(DT[0]%100) # year
i2c.write(DS1307_I2C_ADDRESS, buf)
def Year(self, year = None):
if year == None:
return self.HexToDec(self.getReg(DS1307_REG_YEAR)) + 2000
else:
self.setReg(DS1307_REG_YEAR, self.DecToHex(year%100))
def Month(self, month = None):
if month == None:
return self.HexToDec(self.getReg(DS1307_REG_MONTH))
else:
self.setReg(DS1307_REG_MONTH, self.DecToHex(month%13))
def Day(self, day = None):
if day == None:
return self.HexToDec(self.getReg(DS1307_REG_DAY))
else:
self.setReg(DS1307_REG_DAY, self.DecToHex(day%32))
def Weekday(self, weekday = None):
if weekday == None:
return self.HexToDec(self.getReg(DS1307_REG_WEEKDAY))
else:
self.setReg(DS1307_REG_WEEKDAY, self.DecToHex(weekday%8))
def Hour(self, hour = None):
if hour == None:
return self.HexToDec(self.getReg(DS1307_REG_HOUR))
else:
self.setReg(DS1307_REG_HOUR, self.DecToHex(hour%24))
def Minute(self, minute = None):
if minute == None:
return self.HexToDec(self.getReg(DS1307_REG_MINUTE))
else:
self.setReg(DS1307_REG_MINUTE, self.DecToHex(minute%60))
def Second(self, second = None):
if second == None:
return self.HexToDec(self.getReg(DS1307_REG_SECOND))
else:
self.setReg(DS1307_REG_SECOND, self.DecToHex(second%60))
def ram(self, reg, dat = None):
if dat == None:
return self.getReg(DS1307_REG_RAM + (reg%56))
else:
self.setReg(DS1307_REG_RAM + (reg%56), dat)
def get_time(self):
return self.Hour() + self.Minute() + self.Second()
def get_date(self):
return self.Year() + self.Month() + self.Day()
def set_time(self, hour, minute, second):
self.Hour(hour)
self.Minute(minute)
self.Second(second)
def set_date(self, year, month, day):
self.Year(year)
self.Month(month)
self.Day(day)
ds = DS1307()

View File

@@ -0,0 +1,6 @@
from microbit import *
def angle(pin, angle):
pin.set_analog_period(round((1/50) * 1000))
duty = 26 + (angle * 102) / 180
pin.write_analog(duty)

View File

@@ -0,0 +1,148 @@
from microbit import *
class TCS34725():
TCS34725_ADDRESS = 0x29
TCS34725_COMMAND_BIT = 0x80
TCS34725_ENABLE = 0x00
TCS34725_ENABLE_AIEN = 0x10 # RGBC Interrupt Enable
TCS34725_ENABLE_WEN = 0x08 # Wait enable - Writing 1 activates the wait timer
TCS34725_ENABLE_AEN = 0x02 # RGBC Enable - Writing 1 actives the ADC, 0 disables it
TCS34725_ENABLE_PON = 0x01 # Power on - Writing 1 activates the internal oscillator, 0 disables it
TCS34725_ATIME = 0x01 # Integration time
TCS34725_WTIME = 0x03 # Wait time (if TCS34725_ENABLE_WEN is asserted
TCS34725_WTIME_2_4MS = 0xFF # WLONG0 = 2.4ms WLONG1 = 0.029s
TCS34725_WTIME_204MS = 0xAB # WLONG0 = 204ms WLONG1 = 2.45s
TCS34725_WTIME_614MS = 0x00 # WLONG0 = 614ms WLONG1 = 7.4s
TCS34725_AILTL = 0x04 # Clear channel lower interrupt threshold
TCS34725_AILTH = 0x05
TCS34725_AIHTL = 0x06 # Clear channel upper interrupt threshold
TCS34725_AIHTH = 0x07
TCS34725_PERS = 0x0C # Persistence register - basic SW filtering mechanism for interrupts
TCS34725_PERS_NONE = 0b0000 # Every RGBC cycle generates an interrupt
TCS34725_PERS_1_CYCLE = 0b0001 # 1 clean channel value outside threshold range generates an interrupt
TCS34725_PERS_2_CYCLE = 0b0010 # 2 clean channel values outside threshold range generates an interrupt
TCS34725_PERS_3_CYCLE = 0b0011 # 3 clean channel values outside threshold range generates an interrupt
TCS34725_PERS_5_CYCLE = 0b0100 # 5 clean channel values outside threshold range generates an interrupt
TCS34725_PERS_10_CYCLE = 0b0101 # 10 clean channel values outside threshold range generates an interrupt
TCS34725_PERS_15_CYCLE = 0b0110 # 15 clean channel values outside threshold range generates an interrupt
TCS34725_PERS_20_CYCLE = 0b0111 # 20 clean channel values outside threshold range generates an interrupt
TCS34725_PERS_25_CYCLE = 0b1000 # 25 clean channel values outside threshold range generates an interrupt
TCS34725_PERS_30_CYCLE = 0b1001 # 30 clean channel values outside threshold range generates an interrupt
TCS34725_PERS_35_CYCLE = 0b1010 # 35 clean channel values outside threshold range generates an interrupt
TCS34725_PERS_40_CYCLE = 0b1011 # 40 clean channel values outside threshold range generates an interrupt
TCS34725_PERS_45_CYCLE = 0b1100 # 45 clean channel values outside threshold range generates an interrupt
TCS34725_PERS_50_CYCLE = 0b1101 # 50 clean channel values outside threshold range generates an interrupt
TCS34725_PERS_55_CYCLE = 0b1110 # 55 clean channel values outside threshold range generates an interrupt
TCS34725_PERS_60_CYCLE = 0b1111 # 60 clean channel values outside threshold range generates an interrupt
TCS34725_CONFIG = 0x0D
TCS34725_CONFIG_WLONG = 0x02 # Choose between short and long (12x wait times via TCS34725_WTIME
TCS34725_CONTROL = 0x0F # Set the gain level for the sensor
TCS34725_ID = 0x12 # 0x44 = TCS34721/TCS34725, 0x4D = TCS34723/TCS34727
TCS34725_STATUS = 0x13
TCS34725_STATUS_AINT = 0x10 # RGBC Clean channel interrupt
TCS34725_STATUS_AVALID = 0x01 # Indicates that the RGBC channels have completed an integration cycle
TCS34725_CDATAL = 0x14 # Clear channel data
TCS34725_CDATAH = 0x15
TCS34725_RDATAL = 0x16 # Red channel data
TCS34725_RDATAH = 0x17
TCS34725_GDATAL = 0x18 # Green channel data
TCS34725_GDATAH = 0x19
TCS34725_BDATAL = 0x1A # Blue channel data
TCS34725_BDATAH = 0x1B
# TCS34725_INTEGRATIONTIME_2_4MS = 0xFF, /**< 2.4ms - 1 cycle - Max Count: 1024
# TCS34725_INTEGRATIONTIME_24MS = 0xF6, /**< 24ms - 10 cycles - Max Count: 10240
# TCS34725_INTEGRATIONTIME_50MS = 0xEB, /**< 50ms - 20 cycles - Max Count: 20480
# TCS34725_INTEGRATIONTIME_101MS = 0xD5, /**< 101ms - 42 cycles - Max Count: 43008
# TCS34725_INTEGRATIONTIME_154MS = 0xC0, /**< 154ms - 64 cycles - Max Count: 65535
# TCS34725_INTEGRATIONTIME_700MS = 0x00 /**< 700ms - 256 cycles - Max Count: 65535
_tcs34725Initialised = False
_tcs34725Gain = 0
_tcs34725IntegrationTime = 0x00
def __init__(self, i2c):
self.i2c = i2c
#pass
def write8(self, reg, val):
self.i2c.write(self.TCS34725_ADDRESS, bytearray([self.TCS34725_COMMAND_BIT | reg, val & 0xFF]))
def read16(self, reg):
self.i2c.write(self.TCS34725_ADDRESS, bytearray([self.TCS34725_COMMAND_BIT | reg]))
list_bytes = self.i2c.read(self.TCS34725_ADDRESS, 2)
bytes = list_bytes[1]<<8 | list_bytes[0]
#return [ hex(x) for x in bytes ][0]
return bytes
def read8(self, reg):
self.i2c.write(self.TCS34725_ADDRESS, bytearray([self.TCS34725_COMMAND_BIT | reg]))
return i2c.read(self.TCS34725_ADDRESS, 1)[0] - 0
def begin(self):
x = self.read8(self.TCS34725_ID)
#print(x)
if x != 68: # code I was basing this on expects 0x44, not sure why. Got 0x12
print('did not get the expected response from sensor: ', x)
return False
self._tcs34725Initialised = True
self.setIntegrationTime(self._tcs34725IntegrationTime)
self.setGain(0)
self.enable()
return True
def setIntegrationTime(self, theTime):
if theTime not in [0xFF,0xF6,0xEB,0xD5,0xC0,0x00]:
print('setting integration time to 0x00, %s is illegal' % theTime)
theTime = 0x00
self.write8(self.TCS34725_ATIME, theTime)
# self.i2c.write8(self.TCS34725_ATIME, theTime)
self._tcs34725IntegrationTime = theTime
def setGain(self, gain):
# TCS34725_GAIN_1X = 0x00, /**< No gain
# TCS34725_GAIN_4X = 0x01, /**< 2x gain
# TCS34725_GAIN_16X = 0x02, /**< 16x gain
# TCS34725_GAIN_60X = 0x03 /**< 60x gain
if gain not in [0,1,2,3]:
print('setting gain to 0, %s is illegal' % gain)
gain = 0
self.write8(self.TCS34725_CONTROL, gain)
self._tcs34725Gain = gain
def enable(self):
self.write8(self.TCS34725_ENABLE, self.TCS34725_ENABLE_PON)
sleep(0.003)
self.write8(self.TCS34725_ENABLE, (self.TCS34725_ENABLE_PON | self.TCS34725_ENABLE_AEN))
def getRawRGBData(self, type):
if not self._tcs34725Initialised:
self.begin()
r = self.read16(self.TCS34725_RDATAL)
g = self.read16(self.TCS34725_GDATAL)
b = self.read16(self.TCS34725_BDATAL)
if self._tcs34725IntegrationTime == 0xFF:
sleep(0.0024)
elif self._tcs34725IntegrationTime == 0xF6:
sleep(0.024)
elif self._tcs34725IntegrationTime == 0xEB:
sleep(0.050)
elif self._tcs34725IntegrationTime == 0xD5:
sleep(0.101)
elif self._tcs34725IntegrationTime == 0xC0:
sleep(0.154)
elif self._tcs34725IntegrationTime == 0x00:
sleep(0.700)
else:
sleep(0.700)
if type == 0:
return r
elif type == 1:
return g
else:
return b
tcs = TCS34725(i2c)

View File

@@ -0,0 +1,86 @@
from microbit import *
class LCD1602():
def __init__(self, lcd_i2c_addr):
self.buf = bytearray(1)
self.BK = 0x08
self.RS = 0x00
self.E = 0x04
self.setcmd(0x33)
sleep(5)
self.send(0x30)
sleep(5)
self.send(0x20)
sleep(5)
self.setcmd(0x28)
self.setcmd(0x0C)
self.setcmd(0x06)
self.setcmd(0x01)
self.version='1.0'
self.lcd_i2c_addr=lcd_i2c_addr
def setReg(self, dat):
self.buf[0] = dat
i2c.write(self.lcd_i2c_addr, self.buf)
sleep(1)
def send(self, dat):
d=dat&0xF0
d|=self.BK
d|=self.RS
self.setReg(d)
self.setReg(d|0x04)
self.setReg(d)
def setcmd(self, cmd):
self.RS=0
self.send(cmd)
self.send(cmd<<4)
def setdat(self, dat):
self.RS=1
self.send(dat)
self.send(dat<<4)
def clear(self):
self.setcmd(1)
def backlight(self, on):
if on:
self.BK=0x08
else:
self.BK=0
self.setdat(0)
def on(self):
self.setcmd(0x0C)
def off(self):
self.setcmd(0x08)
def char(self, ch, x=-1, y=0):
if x>=0:
a=0x80
if y>0:
a=0xC0
a+=x
self.setcmd(a)
self.setdat(ch)
def puts(self, s, x=0, y=0):
if len(s)>0:
self.char(ord(s[0]),x,y)
for i in range(1, len(s)):
self.char(ord(s[i]))
def mixly_puts(self, s, x=1, y=1):
s = str(s)
x = x - 1
y = y - 1
self.puts(self, s, x, y)
def mixly_puts_two_lines(self, line1, line2):
line1 = str(line1)
line2 = str(line2)
self.puts(self, line1, 0, 0)
self.puts(self, line2, 0, 1)

View File

@@ -0,0 +1,59 @@
import math
def math_map(v, al, ah, bl, bh):
return bl + (bh - bl) * (v - al) / (ah - al)
def math_mean(myList):
localList = [e for e in myList if type(e) == int or type(e) == float]
if not localList: return
return float(sum(localList)) / len(localList)
def math_median(myList):
localList = sorted([e for e in myList if type(e) == int or type(e) == float])
if not localList: return
if len(localList) % 2 == 0:
return (localList[len(localList) // 2 - 1] + localList[len(localList) // 2]) / 2.0
else:
return localList[(len(localList) - 1) // 2]
def math_modes(some_list):
modes = []
# Using a lists of [item, count] to keep count rather than dict
# to avoid "unhashable" errors when the counted item is itself a list or dict.
counts = []
maxCount = 1
for item in some_list:
found = False
for count in counts:
if count[0] == item:
count[1] += 1
maxCount = max(maxCount, count[1])
found = True
if not found:
counts.append([item, 1])
for counted_item, item_count in counts:
if item_count == maxCount:
modes.append(counted_item)
return modes
def math_standard_deviation(numbers):
n = len(numbers)
if n == 0: return
mean = float(sum(numbers)) / n
variance = sum((x - mean) ** 2 for x in numbers) / n
return math.sqrt(variance)
def lists_sort(my_list, type, reverse):
def try_float(s):
try:
return float(s)
except:
return 0
key_funcs = {
"NUMERIC": try_float,
"TEXT": str,
"IGNORE_CASE": lambda s: str(s).lower()
}
key_func = key_funcs[type]
list_cpy = list(my_list)
return sorted(list_cpy, key=key_func, reverse=reverse)

View File

@@ -0,0 +1,65 @@
from microbit import *
def initPCA9685():
i2c.write(0x40, bytearray([0x00, 0x00]))
setFreq(50)
for idx in range(0, 16, 1):
setPwm(idx, 0 ,0)
def MotorRun(Motors, speed):
speed = speed * 16
if (speed >= 4096):
speed = 4095
if (speed <= -4096):
speed = -4095
if (Motors <= 4 and Motors > 0):
pp = (Motors - 1) * 2
pn = (Motors - 1) * 2 + 1
if (speed >= 0):
setPwm(pp, 0, speed)
setPwm(pn, 0, 0)
else :
setPwm(pp, 0, 0)
setPwm(pn, 0, -speed)
def Servo(Servos, degree):
v_us = (degree * 1800 / 180 + 600)
value = int(v_us * 4096 / 20000)
setPwm(Servos + 7, 0, value)
def setFreq(freq):
prescaleval = int(25000000/(4096*freq)) - 1
i2c.write(0x40, bytearray([0x00]))
oldmode = i2c.read(0x40, 1)
newmode = (oldmode[0] & 0x7F) | 0x10
i2c.write(0x40, bytearray([0x00, newmode]))
i2c.write(0x40, bytearray([0xfe, prescaleval]))
i2c.write(0x40, bytearray([0x00, oldmode[0]]))
sleep(4)
i2c.write(0x40, bytearray([0x00, oldmode[0] | 0xa1]))
def setPwm(channel, on, off):
if (channel >= 0 and channel <= 15):
buf = bytearray([0X06 + 4 * channel, on & 0xff, (on >> 8) & 0xff, off & 0xff, (off >> 8) & 0xff])
i2c.write(0x40, buf)
def setStepper(stpMotors, dir, speed):
spd = speed
setFreq(spd)
if (stpMotors == 1):
if (dir):
setPwm(0, 2047, 4095)
setPwm(1, 1, 2047)
setPwm(2, 1023, 3071)
setPwm(3, 3071, 1023)
else:
setPwm(3, 2047, 4095)
setPwm(2, 1, 2047)
setPwm(1, 1023, 3071)
setPwm(0, 3071, 1023)
elif (stpMotors == 2):
if (dir):
setPwm(4, 2047, 4095)
setPwm(5, 1, 2047)
setPwm(6, 1023, 3071)
setPwm(7, 3071, 1023)
else:
setPwm(7, 2047, 4095)
setPwm(6, 1, 2047)
setPwm(4, 1023, 3071)
setPwm(5, 3071, 1023)

View File

@@ -0,0 +1,27 @@
from microbit import *
import math
_VOLTAGE_POWER = 5
_RS = 10
_B = 3950
_T1 = 273.15 + 25
_R1 = 100
def read(pin, r1, b, rs):
r1 = r1 / 1000
rs = rs / 1000
# print("rs:" + str(rs))
_analogValue = pin.read_analog()
_voltageValue = (_analogValue / 1545) * _VOLTAGE_POWER
# print("voltageValue:" + str(_voltageValue))
_rt = ((_VOLTAGE_POWER - _voltageValue) * rs) / _voltageValue
# print("rt:" + str(_rt))
_tempValue = (((_T1 * b) / (b + _T1 * math.log(_rt / r1))) - 273.15)
return _tempValue

View File

@@ -0,0 +1,105 @@
from microbit import *
class OLED12864_I2C():
def __init__(self):
cmd = [
[0xAE], # SSD1306_DISPLAYOFF
[0xA4], # SSD1306_DISPLAYALLON_RESUME
[0xD5, 0xF0], # SSD1306_SETDISPLAYCLOCKDIV
[0xA8, 0x3F], # SSD1306_SETMULTIPLEX
[0xD3, 0x00], # SSD1306_SETDISPLAYOFFSET
[0 | 0x0], # line #SSD1306_SETSTARTLINE
[0x8D, 0x14], # SSD1306_CHARGEPUMP
[0x20, 0x00], # SSD1306_MEMORYMODE
[0x21, 0, 127], # SSD1306_COLUMNADDR
[0x22, 0, 63], # SSD1306_PAGEADDR
[0xa0 | 0x1], # SSD1306_SEGREMAP
[0xc8], # SSD1306_COMSCANDEC
[0xDA, 0x12], # SSD1306_SETCOMPINS
[0x81, 0xCF], # SSD1306_SETCONTRAST
[0xd9, 0xF1], # SSD1306_SETPRECHARGE
[0xDB, 0x40], # SSD1306_SETVCOMDETECT
[0xA6], # SSD1306_NORMALDISPLAY
[0xd6, 1], # zoom on
[0xaf] # SSD1306_DISPLAYON
]
for c in cmd:
self.command(c)
self._ZOOM = 1
self.ADDR = 0x3C
self.screen = bytearray(1025) # send byte plus pixels
self.screen[0] = 0x40
def command(self, c):
i2c.write(self.ADDR, b'·' + bytearray(c))
def set_pos(self, col=0, page=0):
self.command([0xb0 | page]) # page number
# take upper and lower value of col * 2
c = col * (self._ZOOM+1)
c1, c2 = c & 0x0F, c >> 4
self.command([0x00 | c1]) # lower start column address
self.command([0x10 | c2]) # upper start column address
def pixel(self, x, y, color=1, draw=1):
page, shift_page = divmod(y, 8)
ind = x * (self._ZOOM+1) + page * 128 + 1
b = self.screen[ind] | (1 << shift_page) if color else self.screen[ind] & ~ (1 << shift_page)
self.screen[ind] = b
self.set_pos(x, page)
if self._ZOOM:
self.screen[ind+1]=b
i2c.write(0x3c, bytearray([0x40, b, b]))
else:
i2c.write(0x3c, bytearray([0x40, b]))
def zoom(self, d=1):
self._ZOOM = 1 if d else 0
self.command([0xd6, self._ZOOM])
def invert(self, v=1):
n = 0xa7 if v else 0xa6
self.command([n])
def clear(self, c=0):
for i in range(1, 1025):
self.screen[i] = 0
self.draw()
def draw(self):
self.set_pos()
i2c.write(self.ADDR, self.screen)
def text(self, x, y, s, draw=1):
for i in range(0, min(len(s), 12 - x)):
for c in range(0, 5):
col = 0
for r in range(1, 6):
p = Image(s[i]).get_pixel(c, r - 1)
col = col | (1 << r) if (p != 0) else col
ind = (x + i) * 5 * (self._ZOOM+1) + y * 128 + c*(self._ZOOM+1) + 1
self.screen[ind] = col
if self._ZOOM:
self.screen[ind + 1] = col
self.set_pos(x * 5, y)
ind0 = x * 5 * (self._ZOOM+1) + y * 128 + 1
i2c.write(self.ADDR, b'@' + self.screen[ind0:ind + 1])
def hline(self, x, y, l,c=1):
d = 1 if l>0 else -1
for i in range(x, x+l, d):
self.pixel(i,y,c)
def vline(self, x, y, l,c=1):
d = 1 if l>0 else -1
for i in range(y, y+l,d):
self.pixel(x,i,c,0)
def rect(self, x1,y1,x2,y2,c=1):
self.hline(x1,y1,x2-x1+1,c)
self.hline(x1,y2,x2-x1+1,c)
self.vline(x1,y1,y2-y1+1,c)
self.vline(x2,y1,y2-y1+1,c)
oled = OLED12864_I2C()

View File

@@ -0,0 +1,5 @@
from microbit import *
def show(object, led, r, g, b):
object[led] = (r, g, b)
object.show()

View File

@@ -0,0 +1,32 @@
from microbit import *
def distance_mm(tpin=pin16, epin=pin15):
spi.init(baudrate=125000, sclk=pin13,
mosi=tpin, miso=epin)
pre = 0
post = 0
k = -1
length = 500
resp = bytearray(length)
resp[0] = 0xFF
spi.write_readinto(resp, resp)
# find first non zero value
try:
i, value = next((ind, v) for ind, v in enumerate(resp) if v)
except StopIteration:
i = -1
if i > 0:
pre = bin(value).count("1")
# find first non full high value afterwards
try:
k, value = next((ind, v)
for ind, v in enumerate(resp[i:length - 2]) if resp[i + ind + 1] == 0)
post = bin(value).count("1") if k else 0
k = k + i
except StopIteration:
i = -1
dist= -1 if i < 0 else round((pre + (k - i) * 8. + post) * 8 * 0.172)
return dist
def distance_cm(t_pin=pin16, e_pin=pin15):
return distance_mm(tpin=t_pin, epin=e_pin) / 10.0

View File

@@ -0,0 +1,65 @@
{
"board": {
"micro:bit v1": "micropython:nrf51822:v1",
"micro:bit v2": "micropython:nrf51822:v2"
},
"language": "MicroPython",
"burn": {
"type": "volume",
"volumeName": "MICROBIT",
"micropython:nrf51822:v1": {
"filePath": "{indexPath}/build/microbit-micropython-v1.hex"
},
"micropython:nrf51822:v2": {
"filePath": "{indexPath}/build/microbit-micropython-v2.hex"
}
},
"upload": {
"type": "command",
"portSelect": [
{
"vendorId": "0D28",
"productId": "0204"
}
],
"libPath": [
"{indexPath}/build/lib"
],
"command": "\"{ampy}\" -p {com} -d 1 -r \"{reset}\" put \"{indexPath}/build/upload\"",
"filePath": "{indexPath}/build/upload/main.py",
"copyLib": true,
"reset": []
},
"nav": {
"burn": true,
"upload": true,
"save": {
"py": true
},
"setting": {
"pythonToBlockly": true
}
},
"serial": {
"ctrlCBtn": true,
"ctrlDBtn": true,
"baudRates": 115200,
"yMax": 100,
"yMin": 0,
"pointNum": 100,
"rts": true,
"dtr": true
},
"pythonToBlockly": false,
"web": {
"com": "usb",
"burn": {
"micropython:nrf51822:v1": {
"filePath": "./build/microbit-micropython-v1-lib.hex"
},
"micropython:nrf51822:v2": {
"filePath": "./build/microbit-micropython-v2-lib.hex"
}
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

View File

@@ -0,0 +1,29 @@
{
"name": "@mixly/micropython-nrf51822-microbit",
"version": "1.2.0",
"description": "适用于mixly的micropython nrf51822 microbit模块",
"scripts": {
"build:dev": "webpack --config=webpack.dev.js",
"build:prod": "webpack --config=webpack.prod.js"
},
"main": "./export.js",
"author": "Mixly Team",
"keywords": [
"mixly",
"mixly-plugin",
"micropython-nrf51822-microbit"
],
"homepage": "https://gitee.com/mixly2/mixly2.0_src/tree/develop/boards/default_src/micropython_nrf51822_microbit",
"bugs": {
"url": "https://gitee.com/mixly2/mixly2.0_src/issues"
},
"repository": {
"type": "git",
"url": "https://gitee.com/mixly2/mixly2.0_src.git",
"directory": "default_src/micropython_nrf51822_microbit"
},
"publishConfig": {
"access": "public"
},
"license": "Apache 2.0"
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,11 @@
const path = require("path");
const common = require("../../../webpack.common");
const { merge } = require("webpack-merge");
module.exports = merge(common, {
resolve: {
alias: {
'@mixly/python': path.resolve(__dirname, '../python')
}
}
});

View File

@@ -0,0 +1,21 @@
const path = require("path");
const common = require("./webpack.common");
const { merge } = require("webpack-merge");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const ESLintPlugin = require('eslint-webpack-plugin');
module.exports = merge(common, {
mode: "development",
devtool: 'source-map',
plugins: [
new ESLintPlugin({
context: process.cwd(),
}),
new HtmlWebpackPlugin({
inject: false,
template: path.resolve(process.cwd(), 'template.xml'),
filename: 'index.xml',
minify: false
}),
]
});

View File

@@ -0,0 +1,27 @@
const path = require("path");
const common = require("./webpack.common");
const { merge } = require("webpack-merge");
const TerserPlugin = require("terser-webpack-plugin");
var HtmlWebpackPlugin = require("html-webpack-plugin");
module.exports = merge(common, {
mode: "production",
optimization: {
minimize: true,
minimizer: [
new TerserPlugin({
extractComments: false,
}),
new HtmlWebpackPlugin({
inject: false,
template: path.resolve(process.cwd(), 'template.xml'),
filename: 'index.xml',
minify: {
removeAttributeQuotes: true,
collapseWhitespace: true,
removeComments: true,
}
})
]
}
});