初始化提交
This commit is contained in:
@@ -0,0 +1,3 @@
|
||||
node_modules
|
||||
build
|
||||
origin
|
||||
@@ -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("RX#");
|
||||
this.appendValueInput("TX")
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField("TX#");
|
||||
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();
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,307 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
@@ -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];
|
||||
});
|
||||
}
|
||||
};
|
||||
@@ -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);
|
||||
}
|
||||
};
|
||||
104
boards/default_src/micropython_nrf51822_mithoncc/blocks/inout.js
Normal file
104
boards/default_src/micropython_nrf51822_mithoncc/blocks/inout.js
Normal 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);
|
||||
}
|
||||
};
|
||||
@@ -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["Mithon CC"] = pins["microbit"];
|
||||
|
||||
export default pins;
|
||||
@@ -0,0 +1,210 @@
|
||||
import * as Blockly from 'blockly/core';
|
||||
|
||||
const SENSOR_HUE = 40;
|
||||
const ACTUATOR_HUE = 100;
|
||||
const LOOPS_HUE = 120;
|
||||
|
||||
// Blockly.FieldColour.COLOURS = ['#0f0', '#0e0', '#0d0', '#0c0', '#0b0', '#0a0',
|
||||
// '#080', '#060', '#040', '#000'];
|
||||
// Blockly.FieldColour.COLUMNS = 5;
|
||||
|
||||
export const base_loop = {
|
||||
init: function () {
|
||||
this.jsonInit({
|
||||
"message0": Blockly.Msg.CONTROLS_REPEAT_TITLE_REPEAT + Blockly.Msg.CONTROLS_REPEAT_INPUT_DO,
|
||||
"message1": "%1",
|
||||
"colour": LOOPS_HUE,
|
||||
"args1": [
|
||||
{
|
||||
"type": "input_statement",
|
||||
"name": "DO"
|
||||
}
|
||||
],
|
||||
//"style":{"hat": "not"},
|
||||
"tooltip": "",
|
||||
"helpUrl": ""
|
||||
});
|
||||
//this.setPreviousStatement(true, null);
|
||||
}
|
||||
};
|
||||
|
||||
export const actuator_rgb_color = {
|
||||
init: function () {
|
||||
this.setColour(ACTUATOR_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_RGB)
|
||||
.appendField(Blockly.Msg.MIXLY_RGB_NUM);
|
||||
this.appendDummyInput("")
|
||||
.appendField(new Blockly.FieldDropdown([
|
||||
[Blockly.Msg.MIXLY_ALL, "0"],
|
||||
["0", "1"],
|
||||
["1", "2"],
|
||||
["2", "3"],
|
||||
["3", "4"]
|
||||
]), 'LED')
|
||||
.appendField(Blockly.Msg.HTML_COLOUR);
|
||||
this.appendDummyInput("")
|
||||
.appendField(new Blockly.FieldDropdown([
|
||||
[Blockly.Msg.COLOUR_RGB_RED, "255,0,0"],
|
||||
[Blockly.Msg.COLOUR_RGB_ORANGE, "255,128,0"],
|
||||
[Blockly.Msg.COLOUR_RGB_YELLOW, "255,255,0"],
|
||||
[Blockly.Msg.COLOUR_RGB_GREEN, "0,255,0"],
|
||||
[Blockly.Msg.COLOUR_RGB_CYAN, "0,255,255"],
|
||||
[Blockly.Msg.COLOUR_RGB_BLUE, "0,0,255"],
|
||||
[Blockly.Msg.COLOUR_RGB_PURPLE, "128,0,255"],
|
||||
[Blockly.Msg.COLOUR_RGB_WHITE, "255,255,255"]
|
||||
]), 'COLOR');
|
||||
this.setInputsInline(true);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
}
|
||||
};
|
||||
|
||||
export const actuator_rgb_off = {
|
||||
init: function () {
|
||||
this.setColour(ACTUATOR_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_RGB)
|
||||
.appendField(Blockly.Msg.MIXLY_RGB_NUM);
|
||||
this.appendDummyInput("")
|
||||
.appendField(new Blockly.FieldDropdown([
|
||||
[Blockly.Msg.MIXLY_ALL, "0"],
|
||||
["0", "1"],
|
||||
["1", "2"],
|
||||
["2", "3"],
|
||||
["3", "4"]
|
||||
]), 'LED')
|
||||
.appendField(Blockly.Msg.MIXLY_MICROBIT_Turn_off_display);
|
||||
this.setInputsInline(true);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
}
|
||||
};
|
||||
|
||||
export const actuator_rgb = {
|
||||
init: function () {
|
||||
this.setColour(ACTUATOR_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_RGB)
|
||||
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);
|
||||
}
|
||||
};
|
||||
|
||||
export const actuator_motor_on = {
|
||||
init: function () {
|
||||
this.setColour(ACTUATOR_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_MOTOR)
|
||||
.appendField(Blockly.Msg.LCD_NUMBERING);
|
||||
this.appendDummyInput("")
|
||||
.appendField(new Blockly.FieldDropdown([
|
||||
[Blockly.Msg.MIXLY_ALL, "0"],
|
||||
["1", "1"],
|
||||
["2", "2"],
|
||||
["3", "3"]
|
||||
]), 'NUMBER');
|
||||
this.appendValueInput('SPEED')
|
||||
.appendField(Blockly.Msg.MIXLY_SPEED + "(0~12)")
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_MICROBIT_Direction)
|
||||
.appendField(new Blockly.FieldDropdown([
|
||||
[Blockly.Msg.CLOCKWISE, "1"],
|
||||
[Blockly.Msg.ANTI_CLOCKWISE, "0"]
|
||||
]), 'DIRECTION')
|
||||
this.setInputsInline(true);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
}
|
||||
};
|
||||
|
||||
export const actuator_motor_off = {
|
||||
init: function () {
|
||||
this.setColour(ACTUATOR_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_MOTOR)
|
||||
.appendField(Blockly.Msg.LCD_NUMBERING);
|
||||
this.appendDummyInput("")
|
||||
.appendField(new Blockly.FieldDropdown([
|
||||
[Blockly.Msg.MIXLY_ALL, "0"],
|
||||
["1", "1"],
|
||||
["2", "2"],
|
||||
["3", "3"]
|
||||
]), 'NUMBER')
|
||||
.appendField(Blockly.Msg.MIXLY_STOP);
|
||||
this.setInputsInline(true);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
}
|
||||
};
|
||||
|
||||
export const sensor_pin_near = {
|
||||
init: function () {
|
||||
this.setColour(SENSOR_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET)
|
||||
.appendField(Blockly.Msg.LCD_NUMBERING)
|
||||
.appendField(new Blockly.FieldDropdown([
|
||||
["1", "1"],
|
||||
["2", "2"]
|
||||
]), 'NUMBER')
|
||||
.appendField(Blockly.Msg.MIXLY_ESP32_NEAR);
|
||||
this.setOutput(true, Number);
|
||||
this.setInputsInline(true);
|
||||
}
|
||||
};
|
||||
|
||||
export const sensor_while_btn_pressed = {
|
||||
init: function () {
|
||||
this.setColour(20);
|
||||
this.appendValueInput('btn')
|
||||
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_CURRENT + Blockly.Msg.MIXLY_BUTTON_PRESSED + Blockly.Msg.MIXLY_BUTTON)
|
||||
.setCheck(Number);
|
||||
this.appendStatementInput('DO')
|
||||
.appendField(Blockly.Msg.CONTROLS_IF_MSG_THEN);
|
||||
this.setInputsInline(true);
|
||||
}
|
||||
};
|
||||
|
||||
export const sensor_while_is_gesture = {
|
||||
init: function () {
|
||||
this.setColour(20);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_CURRENT + Blockly.Msg.MIXLY_MICROBIT_JS_IS_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.CONTROLS_IF_MSG_THEN);
|
||||
this.setInputsInline(true);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
export const sensor_while_is_near = {
|
||||
init: function () {
|
||||
this.setColour(20);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_CURRENT + Blockly.Msg.MIXLY_ESP32_EXTERN_NEAR)
|
||||
.appendField(new Blockly.FieldDropdown([["1", "1"], ["2", "2"]]), "near")
|
||||
.appendField(Blockly.Msg.MIXLY_MITHON_NEAR);
|
||||
this.appendStatementInput('DO')
|
||||
.appendField(Blockly.Msg.CONTROLS_IF_MSG_THEN);
|
||||
this.setInputsInline(true);
|
||||
}
|
||||
};
|
||||
121
boards/default_src/micropython_nrf51822_mithoncc/blocks/pins.js
Normal file
121
boards/default_src/micropython_nrf51822_mithoncc/blocks/pins.js
Normal 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);
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,646 @@
|
||||
import * as Blockly from 'blockly/core';
|
||||
|
||||
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);
|
||||
}
|
||||
};
|
||||
@@ -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);
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,62 @@
|
||||
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);
|
||||
}
|
||||
};
|
||||
@@ -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');
|
||||
@@ -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"
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
})];
|
||||
}
|
||||
@@ -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"
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,137 @@
|
||||
'use strict';
|
||||
|
||||
pbc.moduleFunctionD.get('rgb_show')['mixly_rgb_show_all'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
|
||||
if (args.length !== 3) {
|
||||
throw new Error("Incorrect number of arguments");
|
||||
}
|
||||
var r = args[0].n.v;
|
||||
var g = args[1].n.v;
|
||||
var b = args[2].n.v;
|
||||
if (r-0 == 0 && g-0 == 0 && b-0 == 0) {
|
||||
return [block("actuator_rgb_off", func.lineno, {
|
||||
"LED": 0
|
||||
}, {}, {
|
||||
"inline": "true"
|
||||
})];
|
||||
} else {
|
||||
return [block("actuator_rgb_color", func.lineno, {
|
||||
"LED": 0,
|
||||
"COLOR": r+","+g+","+b
|
||||
}, {}, {
|
||||
"inline": "true"
|
||||
})];
|
||||
}
|
||||
}
|
||||
|
||||
pbc.moduleFunctionD.get('rgb_show')['mixly_rgb_show'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
|
||||
if (args.length !== 4) {
|
||||
throw new Error("Incorrect number of arguments");
|
||||
}
|
||||
var led = args[0].n.v;
|
||||
if (led-0 >= 4) {
|
||||
var ledblock = {
|
||||
_astname: "Num",
|
||||
n: {
|
||||
'v': led
|
||||
}
|
||||
}
|
||||
return [block("actuator_rgb", func.lineno, {}, {
|
||||
"_LED_": py2block.convert(ledblock),
|
||||
"RVALUE": py2block.convert(args[1]),
|
||||
"GVALUE": py2block.convert(args[2]),
|
||||
"BVALUE": py2block.convert(args[3])
|
||||
}, {
|
||||
"inline": "true"
|
||||
})];
|
||||
}
|
||||
|
||||
var r = args[1].n.v;
|
||||
var g = args[2].n.v;
|
||||
var b = args[3].n.v;
|
||||
if (r-0 == 0 && g-0 == 0 && b-0 == 0) {
|
||||
return [block("actuator_rgb_off", func.lineno, {
|
||||
"LED": (led-0)+1
|
||||
}, {}, {
|
||||
"inline": "true"
|
||||
})];
|
||||
} else {
|
||||
return [block("actuator_rgb_color", func.lineno, {
|
||||
"LED": (led-0)+1,
|
||||
"COLOR": r+","+g+","+b
|
||||
}, {}, {
|
||||
"inline": "true"
|
||||
})];
|
||||
}
|
||||
}
|
||||
|
||||
pbc.moduleFunctionD.get('motor_control')['motor1'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
|
||||
if (args.length !== 2 && args.length !== 1) {
|
||||
throw new Error("Incorrect number of arguments");
|
||||
}
|
||||
if (args.length == 1) {
|
||||
return [block("actuator_motor_off", func.lineno, {
|
||||
"NUMBER": 1
|
||||
}, {}, {
|
||||
"inline": "true"
|
||||
})];
|
||||
} else {
|
||||
var direction = args[1].n.v;
|
||||
var speed = py2block.convert(args[0]);
|
||||
return [block("actuator_motor_on", func.lineno, {
|
||||
"NUMBER": 1,
|
||||
"DIRECTION": direction
|
||||
}, {
|
||||
"SPEED": speed
|
||||
}, {
|
||||
"inline": "true"
|
||||
})];
|
||||
}
|
||||
}
|
||||
|
||||
pbc.moduleFunctionD.get('motor_control')['motor2'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
|
||||
if (args.length !== 2 && args.length !== 1) {
|
||||
throw new Error("Incorrect number of arguments");
|
||||
}
|
||||
if (args.length == 1) {
|
||||
return [block("actuator_motor_off", func.lineno, {
|
||||
"NUMBER": 2
|
||||
}, {}, {
|
||||
"inline": "true"
|
||||
})];
|
||||
} else {
|
||||
var direction = args[1].n.v;
|
||||
var speed = py2block.convert(args[0]);
|
||||
return [block("actuator_motor_on", func.lineno, {
|
||||
"NUMBER": 2,
|
||||
"DIRECTION": direction
|
||||
}, {
|
||||
"SPEED": speed
|
||||
}, {
|
||||
"inline": "true"
|
||||
})];
|
||||
}
|
||||
}
|
||||
|
||||
pbc.moduleFunctionD.get('motor_control')['motor3'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
|
||||
if (args.length !== 2 && args.length !== 1) {
|
||||
throw new Error("Incorrect number of arguments");
|
||||
}
|
||||
if (args.length == 1) {
|
||||
return [block("actuator_motor_off", func.lineno, {
|
||||
"NUMBER": 3
|
||||
}, {}, {
|
||||
"inline": "true"
|
||||
})];
|
||||
} else {
|
||||
var direction = args[1].n.v;
|
||||
var speed = py2block.convert(args[0]);
|
||||
return [block("actuator_motor_on", func.lineno, {
|
||||
"NUMBER": 3,
|
||||
"DIRECTION": direction
|
||||
}, {
|
||||
"SPEED": speed
|
||||
}, {
|
||||
"inline": "true"
|
||||
})];
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
|
||||
@@ -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"
|
||||
});
|
||||
}
|
||||
@@ -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"
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,128 @@
|
||||
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(1) > 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(1) > 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(2) > 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(2) > 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(3) > 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(3) > 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(4) > 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(4) > 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(5) > 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(5) > 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(6) > 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(6) > 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(7) > 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(7) > 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(8) > 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(8) > 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(9) > 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(9) > 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(10) > 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(10) > 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(11) > 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(11) > 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(12) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
|
||||
background:url('../../../../common/media/mark/event.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/event2.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/net.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/net2.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
47
boards/default_src/micropython_nrf51822_mithoncc/export.js
Normal file
47
boards/default_src/micropython_nrf51822_mithoncc/export.js
Normal file
@@ -0,0 +1,47 @@
|
||||
import MicropythonNRF51822MithonCCPins from './blocks/microbit_profile';
|
||||
|
||||
import * as MicropythonNRF51822MithonCCActuatorBlocks from './blocks/actuator';
|
||||
import * as MicropythonNRF51822MithonCCCommunicateBlocks from './blocks/communicate';
|
||||
import * as MicropythonNRF51822MithonCCDisplayBlocks from './blocks/display';
|
||||
import * as MicropythonNRF51822MithonCCFactoryBlocks from './blocks/factory';
|
||||
import * as MicropythonNRF51822MithonCCInoutBlocks from './blocks/inout';
|
||||
import * as MicropythonNRF51822MithonCCMithonBlocks from './blocks/mithon';
|
||||
import * as MicropythonNRF51822MithonCCPinsBlocks from './blocks/pins';
|
||||
import * as MicropythonNRF51822MithonCCSensorBlocks from './blocks/sensor';
|
||||
import * as MicropythonNRF51822MithonCCSerialBlocks from './blocks/serial';
|
||||
import * as MicropythonNRF51822MithonCCSystemBlocks from './blocks/system';
|
||||
|
||||
import * as MicropythonNRF51822MithonCCActuatorGenerators from './generators/actuator';
|
||||
import * as MicropythonNRF51822MithonCCCommunicateGenerators from './generators/communicate';
|
||||
import * as MicropythonNRF51822MithonCCDisplayGenerators from './generators/display';
|
||||
import * as MicropythonNRF51822MithonCCFactoryGenerators from './generators/factory';
|
||||
import * as MicropythonNRF51822MithonCCInoutGenerators from './generators/inout';
|
||||
import * as MicropythonNRF51822MithonCCMithonGenerators from './generators/mithon';
|
||||
import * as MicropythonNRF51822MithonCCPinsGenerators from './generators/pins';
|
||||
import * as MicropythonNRF51822MithonCCSensorGenerators from './generators/sensor';
|
||||
import * as MicropythonNRF51822MithonCCSerialGenerators from './generators/serial';
|
||||
import * as MicropythonNRF51822MithonCCSystemGenerators from './generators/system';
|
||||
|
||||
export {
|
||||
MicropythonNRF51822MithonCCPins,
|
||||
MicropythonNRF51822MithonCCActuatorBlocks,
|
||||
MicropythonNRF51822MithonCCCommunicateBlocks,
|
||||
MicropythonNRF51822MithonCCDisplayBlocks,
|
||||
MicropythonNRF51822MithonCCFactoryBlocks,
|
||||
MicropythonNRF51822MithonCCInoutBlocks,
|
||||
MicropythonNRF51822MithonCCMithonBlocks,
|
||||
MicropythonNRF51822MithonCCPinsBlocks,
|
||||
MicropythonNRF51822MithonCCSensorBlocks,
|
||||
MicropythonNRF51822MithonCCSerialBlocks,
|
||||
MicropythonNRF51822MithonCCSystemBlocks,
|
||||
MicropythonNRF51822MithonCCActuatorGenerators,
|
||||
MicropythonNRF51822MithonCCCommunicateGenerators,
|
||||
MicropythonNRF51822MithonCCDisplayGenerators,
|
||||
MicropythonNRF51822MithonCCFactoryGenerators,
|
||||
MicropythonNRF51822MithonCCInoutGenerators,
|
||||
MicropythonNRF51822MithonCCMithonGenerators,
|
||||
MicropythonNRF51822MithonCCPinsGenerators,
|
||||
MicropythonNRF51822MithonCCSensorGenerators,
|
||||
MicropythonNRF51822MithonCCSerialGenerators,
|
||||
MicropythonNRF51822MithonCCSystemGenerators
|
||||
};
|
||||
@@ -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 (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 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;
|
||||
}
|
||||
@@ -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];
|
||||
}
|
||||
@@ -0,0 +1,278 @@
|
||||
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;
|
||||
}
|
||||
@@ -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];
|
||||
}
|
||||
@@ -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";
|
||||
}
|
||||
@@ -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];
|
||||
}
|
||||
@@ -0,0 +1,223 @@
|
||||
export const microbit_image_create = function (block, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
var colours = {
|
||||
"#000000": "0",
|
||||
"#004400": "1",
|
||||
"#006600": "2",
|
||||
"#008800": "3",
|
||||
"#00aa00": "4",
|
||||
"#00bb00": "5",
|
||||
"#00cc00": "6",
|
||||
"#00dd00": "7",
|
||||
"#00ee00": "8",
|
||||
"#00ff00": "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 base_loop = function (block, generator) {
|
||||
//var b = "UNTIL" == a.getFieldValue("MODE"),
|
||||
//var c = generator.valueToCode(a, "BOOL", b ? generator.ORDER_LOGICAL_NOT : generator.ORDER_NONE) || "False",
|
||||
var d = generator.statementToCode(block, "DO"),
|
||||
d = generator.addLoopTrap(d, block.id) || generator.PASS;
|
||||
generator.loops_['base_loop'] = d;
|
||||
return "";
|
||||
}
|
||||
|
||||
export const actuator_rgb_color = function (_, generator) {
|
||||
var value_led = this.getFieldValue('LED');
|
||||
var values = this.getFieldValue('COLOR').split(",");
|
||||
var value_rvalue = values[0];
|
||||
var value_gvalue = values[1];
|
||||
var value_bvalue = values[2];
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
generator.definitions_['import_neopixel'] = 'import neopixel';
|
||||
generator.definitions_['import_rgb_show'] = 'import rgb_show';
|
||||
//generator.setups_['mixly_rgb_init'] = 'np = neopixel.NeoPixel(pin12, 4)\n';
|
||||
if (value_led > 0) {
|
||||
//generator.setups_['mixly_rgb_show'] = generator.FUNCTION_MIXLY_RGB_SHOW;
|
||||
var code = 'rgb_show.mixly_rgb_show(' + (value_led - 1) + ', ' + value_rvalue + ', ' + value_gvalue + ', ' + value_bvalue + ')\n';
|
||||
}
|
||||
else {
|
||||
//generator.setups_['mixly_rgb_show_all'] = generator.FUNCTION_MIXLY_RGB_SHOW_ALL;
|
||||
var code = 'rgb_show.mixly_rgb_show_all(' + value_rvalue + ', ' + value_gvalue + ', ' + value_bvalue + ')\n';
|
||||
}
|
||||
return code;
|
||||
}
|
||||
|
||||
export const actuator_rgb_off = function (_, generator) {
|
||||
var value_led = this.getFieldValue('LED');
|
||||
var value_rvalue = 0;
|
||||
var value_gvalue = 0;
|
||||
var value_bvalue = 0;
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
generator.definitions_['import_neopixel'] = 'import neopixel';
|
||||
generator.definitions_['import_rgb_show'] = 'import rgb_show';
|
||||
//generator.setups_['mixly_rgb_init'] = 'np = neopixel.NeoPixel(pin12, 4)\n';
|
||||
if (value_led > 0) {
|
||||
//generator.setups_['mixly_rgb_show'] = generator.FUNCTION_MIXLY_RGB_SHOW;
|
||||
var code = 'rgb_show.mixly_rgb_show(' + (value_led - 1) + ', ' + value_rvalue + ', ' + value_gvalue + ', ' + value_bvalue + ')\n';
|
||||
} else {
|
||||
//generator.setups_['mixly_rgb_show_all'] = generator.FUNCTION_MIXLY_RGB_SHOW_ALL;
|
||||
var code = 'rgb_show.mixly_rgb_show_all(' + value_rvalue + ', ' + value_gvalue + ', ' + value_bvalue + ')\n';
|
||||
}
|
||||
return code;
|
||||
}
|
||||
|
||||
export const actuator_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';
|
||||
generator.definitions_['import_rgb_show'] = 'import rgb_show';
|
||||
//generator.setups_['mixly_rgb_init'] = 'np = neopixel.NeoPixel(pin12, 4)\n';
|
||||
//generator.setups_['mixly_rgb_show'] = generator.FUNCTION_MIXLY_RGB_SHOW;
|
||||
var code = 'rgb_show.mixly_rgb_show(' + value_led + ', ' + value_rvalue + ', ' + value_gvalue + ', ' + value_bvalue + ')\n';
|
||||
return code;
|
||||
}
|
||||
|
||||
export const actuator_motor_on = function (_, generator) {
|
||||
var n = this.getFieldValue('NUMBER');
|
||||
var v = generator.valueToCode(this, 'SPEED', generator.ORDER_ATOMIC);
|
||||
var d = this.getFieldValue('DIRECTION');
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
generator.definitions_['import_motor_control'] = 'import motor_control';
|
||||
if (n == 0) {
|
||||
//generator.setups_['mixly_motor1'] = generator.FUNCTION_MIXLY_MOTOR1;
|
||||
//generator.setups_['mixly_motor2'] = generator.FUNCTION_MIXLY_MOTOR2;
|
||||
//generator.setups_['mixly_motor3'] = generator.FUNCTION_MIXLY_MOTOR3;
|
||||
var code = 'motor_control.motor1(' + v + ', ' + d + ')\nmotor_control.motor2(' + v + ', ' + d + ')\nmotor_control.motor3(' + v + ', ' + d + ')\n';
|
||||
}
|
||||
else if (n == 1) {
|
||||
//generator.setups_['mixly_motor1'] = generator.FUNCTION_MIXLY_MOTOR1;
|
||||
var code = 'motor_control.motor1(' + v + ', ' + d + ')\n';
|
||||
}
|
||||
else if (n == 2) {
|
||||
//generator.setups_['mixly_motor2'] = generator.FUNCTION_MIXLY_MOTOR2;
|
||||
var code = 'motor_control.motor2(' + v + ', ' + d + ')\n';
|
||||
}
|
||||
else if (n == 3) {
|
||||
//generator.setups_['mixly_motor3'] = generator.FUNCTION_MIXLY_MOTOR3;
|
||||
var code = 'motor_control.motor3(' + v + ', ' + d + ')\n';
|
||||
}
|
||||
return code;
|
||||
}
|
||||
|
||||
export const actuator_motor_off = function (_, generator) {
|
||||
var n = this.getFieldValue('NUMBER');
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
generator.definitions_['import_motor_control'] = 'import motor_control';
|
||||
if (n == 0) {
|
||||
//generator.setups_['mixly_motor1'] = generator.FUNCTION_MIXLY_MOTOR1;
|
||||
//generator.setups_['mixly_motor2'] = generator.FUNCTION_MIXLY_MOTOR2;
|
||||
//generator.setups_['mixly_motor3'] = generator.FUNCTION_MIXLY_MOTOR3;
|
||||
var code = 'motor_control.motor1(0)\nmotor_control.motor2(0)\nmotor_control.motor3(0)\n';
|
||||
}
|
||||
else if (n == 1) {
|
||||
//generator.setups_['mixly_motor1'] = generator.FUNCTION_MIXLY_MOTOR1;
|
||||
var code = 'motor_control.motor1(0)\n';
|
||||
}
|
||||
else if (n == 2) {
|
||||
//generator.setups_['mixly_motor2'] = generator.FUNCTION_MIXLY_MOTOR2;
|
||||
var code = 'motor_control.motor2(0)\n';
|
||||
}
|
||||
else if (n == 3) {
|
||||
//generator.setups_['mixly_motor3'] = generator.FUNCTION_MIXLY_MOTOR3;
|
||||
var code = 'motor_control.motor3(0)\n';
|
||||
}
|
||||
return code;
|
||||
}
|
||||
|
||||
export const sensor_pin_near = function (_, generator) {
|
||||
var number = this.getFieldValue('NUMBER');
|
||||
var code = 'pin' + number + '.read_analog()';
|
||||
return [code, generator.ORDER_ATOMIC];
|
||||
}
|
||||
|
||||
export const sensor_while_btn_pressed = function (block, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
var btn = generator.valueToCode(this, 'btn', generator.ORDER_ATOMIC);
|
||||
generator.setups_['on_' + btn] = 'def on_' + btn + '():\n' +
|
||||
' while True:\n' +
|
||||
' if ' + btn + '.was_pressed():\n' +
|
||||
' yield callback_' + btn + '()\n' +
|
||||
' else:\n' +
|
||||
' yield\n' +
|
||||
'\n' +
|
||||
'func_' + btn + ' = on_' + btn + '()\n'
|
||||
var d = generator.statementToCode(block, "DO"),
|
||||
d = generator.addLoopTrap(d, block.id) || generator.PASS;
|
||||
generator.loops_[btn + '_loop'] = ' next(func_' + btn + ')\n';
|
||||
return "def callback_" + btn + "():\n" + d;
|
||||
}
|
||||
|
||||
export const sensor_while_is_gesture = function (block, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
var gesture = this.getFieldValue('gesture');
|
||||
generator.setups_['on_' + gesture] = 'def on_gesture_' + gesture + '():\n' +
|
||||
' while True:\n' +
|
||||
' if accelerometer.is_gesture("' + gesture + '"):\n' +
|
||||
' yield callback_gesture_' + gesture + '()\n' +
|
||||
' else:\n' +
|
||||
' yield\n' +
|
||||
'\n' +
|
||||
'func_gesture_' + gesture + ' = on_gesture_' + gesture + '()\n'
|
||||
var d = generator.statementToCode(block, "DO"),
|
||||
d = generator.addLoopTrap(d, block.id) || generator.PASS;
|
||||
generator.loops_[gesture + '_loop'] = ' next(func_gesture_' + gesture + ')\n';
|
||||
return "def callback_gesture_" + gesture + '():\n' + d;
|
||||
}
|
||||
|
||||
export const sensor_while_is_near = function (block, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
var near = this.getFieldValue('near');
|
||||
generator.setups_['on_' + near] = 'def on_near_' + near + '():\n' +
|
||||
' while True:\n' +
|
||||
' if not pin' + near + '.read_digital():\n' +
|
||||
' yield callback_near_' + near + '()\n' +
|
||||
' else:\n' +
|
||||
' yield\n' +
|
||||
'\n' +
|
||||
'func_near_' + near + ' = on_near_' + near + '()\n'
|
||||
var d = generator.statementToCode(block, "DO"),
|
||||
d = generator.addLoopTrap(d, block.id) || generator.PASS;
|
||||
generator.loops_[near + '_loop'] = ' next(func_near_' + near + ')\n';
|
||||
return "def callback_near_" + near + '():\n' + d;
|
||||
}
|
||||
|
||||
export const controls_repeat_ext = function (block, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
var times = generator.valueToCode(this, 'TIMES', generator.ORDER_ATOMIC);
|
||||
var d = generator.statementToCode(block, "DO"),
|
||||
d = generator.addLoopTrap(d, block.id) || generator.PASS;
|
||||
return 'for _my_variable in range(' + times + '):\n' + d;
|
||||
}
|
||||
@@ -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;
|
||||
@@ -0,0 +1,292 @@
|
||||
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];
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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];
|
||||
}
|
||||
125
boards/default_src/micropython_nrf51822_mithoncc/index.js
Normal file
125
boards/default_src/micropython_nrf51822_mithoncc/index.js
Normal file
@@ -0,0 +1,125 @@
|
||||
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 {
|
||||
MicropythonNRF51822MithonCCPins,
|
||||
MicropythonNRF51822MithonCCActuatorBlocks,
|
||||
MicropythonNRF51822MithonCCCommunicateBlocks,
|
||||
MicropythonNRF51822MithonCCDisplayBlocks,
|
||||
MicropythonNRF51822MithonCCFactoryBlocks,
|
||||
MicropythonNRF51822MithonCCInoutBlocks,
|
||||
MicropythonNRF51822MithonCCMithonBlocks,
|
||||
MicropythonNRF51822MithonCCPinsBlocks,
|
||||
MicropythonNRF51822MithonCCSensorBlocks,
|
||||
MicropythonNRF51822MithonCCSerialBlocks,
|
||||
MicropythonNRF51822MithonCCSystemBlocks,
|
||||
MicropythonNRF51822MithonCCActuatorGenerators,
|
||||
MicropythonNRF51822MithonCCCommunicateGenerators,
|
||||
MicropythonNRF51822MithonCCDisplayGenerators,
|
||||
MicropythonNRF51822MithonCCFactoryGenerators,
|
||||
MicropythonNRF51822MithonCCInoutGenerators,
|
||||
MicropythonNRF51822MithonCCMithonGenerators,
|
||||
MicropythonNRF51822MithonCCPinsGenerators,
|
||||
MicropythonNRF51822MithonCCSensorGenerators,
|
||||
MicropythonNRF51822MithonCCSerialGenerators,
|
||||
MicropythonNRF51822MithonCCSystemGenerators
|
||||
} from './';
|
||||
|
||||
import './css/color_mithon.css';
|
||||
|
||||
Object.assign(Blockly.Variables, Variables);
|
||||
Object.assign(Blockly.Procedures, Procedures);
|
||||
Blockly.Python = Python;
|
||||
Blockly.generator = Python;
|
||||
|
||||
Profile.default = {};
|
||||
Object.assign(Profile, MicropythonNRF51822MithonCCPins);
|
||||
Object.assign(Profile.default, MicropythonNRF51822MithonCCPins['microbit']);
|
||||
|
||||
Object.assign(
|
||||
Blockly.Blocks,
|
||||
PythonVariablesBlocks,
|
||||
PythonControlBlocks,
|
||||
PythonMathBlocks,
|
||||
PythonTextBlocks,
|
||||
PythonListsBlocks,
|
||||
PythonDictsBlocks,
|
||||
PythonLogicBlocks,
|
||||
PythonStorageBlocks,
|
||||
PythonProceduresBlocks,
|
||||
PythonTupleBlocks,
|
||||
PythonSetBlocks,
|
||||
PythonHtmlBlocks,
|
||||
PythonUtilityBlocks,
|
||||
MicropythonNRF51822MithonCCActuatorBlocks,
|
||||
MicropythonNRF51822MithonCCCommunicateBlocks,
|
||||
MicropythonNRF51822MithonCCDisplayBlocks,
|
||||
MicropythonNRF51822MithonCCDisplayBlocks,
|
||||
MicropythonNRF51822MithonCCFactoryBlocks,
|
||||
MicropythonNRF51822MithonCCInoutBlocks,
|
||||
MicropythonNRF51822MithonCCMithonBlocks,
|
||||
MicropythonNRF51822MithonCCPinsBlocks,
|
||||
MicropythonNRF51822MithonCCSensorBlocks,
|
||||
MicropythonNRF51822MithonCCSerialBlocks,
|
||||
MicropythonNRF51822MithonCCSystemBlocks
|
||||
);
|
||||
|
||||
Object.assign(
|
||||
Blockly.Python.forBlock,
|
||||
PythonVariablesGenerators,
|
||||
PythonControlGenerators,
|
||||
PythonMathGenerators,
|
||||
PythonTextGenerators,
|
||||
PythonListsGenerators,
|
||||
PythonDictsGenerators,
|
||||
PythonLogicGenerators,
|
||||
PythonStorageGenerators,
|
||||
PythonProceduresGenerators,
|
||||
PythonTupleGenerators,
|
||||
PythonSetGenerators,
|
||||
PythonHtmlGenerators,
|
||||
PythonUtilityGenerators,
|
||||
MicropythonNRF51822MithonCCActuatorGenerators,
|
||||
MicropythonNRF51822MithonCCCommunicateGenerators,
|
||||
MicropythonNRF51822MithonCCDisplayGenerators,
|
||||
MicropythonNRF51822MithonCCDisplayGenerators,
|
||||
MicropythonNRF51822MithonCCFactoryGenerators,
|
||||
MicropythonNRF51822MithonCCInoutGenerators,
|
||||
MicropythonNRF51822MithonCCMithonGenerators,
|
||||
MicropythonNRF51822MithonCCPinsGenerators,
|
||||
MicropythonNRF51822MithonCCSensorGenerators,
|
||||
MicropythonNRF51822MithonCCSerialGenerators,
|
||||
MicropythonNRF51822MithonCCSystemGenerators
|
||||
);
|
||||
@@ -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)
|
||||
@@ -0,0 +1,37 @@
|
||||
from microbit import *
|
||||
|
||||
def motor1(v,d=1):
|
||||
v = min(12,max(0,v))
|
||||
if v==0:
|
||||
pin8.write_analog(0)
|
||||
pin16.write_analog(0)
|
||||
elif d==1:
|
||||
pin8.write_analog(int(v/12*1023))
|
||||
pin16.write_analog(0)
|
||||
elif d==0:
|
||||
pin8.write_analog(0)
|
||||
pin16.write_analog(int(v/12*1023))
|
||||
|
||||
def motor2(v,d=1):
|
||||
v = min(12,max(0,v))
|
||||
if v==0:
|
||||
pin14.write_analog(0)
|
||||
pin13.write_analog(0)
|
||||
elif d==1:
|
||||
pin14.write_analog(int(v/12*1023))
|
||||
pin13.write_analog(0)
|
||||
elif d==0:
|
||||
pin14.write_analog(0)
|
||||
pin13.write_analog(int(v/12*1023))
|
||||
|
||||
def motor3(v,d=1):
|
||||
v = min(12,max(0,v))
|
||||
if v==0:
|
||||
pin0.write_analog(0)
|
||||
pin15.write_analog(0)
|
||||
elif d==1:
|
||||
pin0.write_analog(int(v/12*1023))
|
||||
pin15.write_analog(0)
|
||||
elif d==0:
|
||||
pin0.write_analog(0)
|
||||
pin15.write_analog(int(v/12*1023))
|
||||
@@ -0,0 +1,13 @@
|
||||
from microbit import *
|
||||
import neopixel
|
||||
|
||||
np = neopixel.NeoPixel(pin12, 4)
|
||||
|
||||
def mixly_rgb_show_all(r, g, b):
|
||||
for led in range(4):
|
||||
np[led] = (r, g, b)
|
||||
np.show()
|
||||
|
||||
def mixly_rgb_show(led, r, g, b):
|
||||
np[led] = (r, g, b)
|
||||
np.show()
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,54 @@
|
||||
{
|
||||
"language": "MicroPython",
|
||||
"burn": {
|
||||
"type": "volume",
|
||||
"volumeName": [
|
||||
"MICROBIT",
|
||||
"MITHONCC"
|
||||
],
|
||||
"filePath": "{indexPath}/build/microbit-micropython-v1.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": {
|
||||
"filePath": "./build/microbit-micropython-v1-lib.hex"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"七彩RGB灯.mix": {
|
||||
"__file__": true,
|
||||
"__name__": "七彩RGB灯.mix"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
<xml version="Mixly 2.0 Beta11" board="Mithon CC" xmlns="http://www.w3.org/1999/xhtml"><block type="base_loop" id="4=.AIPR~w(`[eSM4/qvJ" x="323" y="116"><statement name="DO"><block type="actuator_rgb_color" id="%cL7H]2DhT9rJy`ve.S("><field name="LED">0</field><field name="COLOR">255,0,0</field><next><block type="base_delay" id="7LB|Tyz)/GzZpZU#cG!5"><value name="DELAY_TIME"><shadow type="math_number" id=";M]nYI#.o^!d|c.T:@8/"><field name="NUM">100</field></shadow></value><next><block type="actuator_rgb_color" id="g-uD/8U]u`?v)s;.{ahI"><field name="LED">0</field><field name="COLOR">255,128,0</field><next><block type="base_delay" id="QXm8rm!L;no`{-!EZ8[7"><value name="DELAY_TIME"><shadow type="math_number" id="Wt,f}n5eGM|.Fi(/;N3W"><field name="NUM">100</field></shadow></value><next><block type="actuator_rgb_color" id="i(H([nWc7^}x1t0`y^k9"><field name="LED">0</field><field name="COLOR">255,255,0</field><next><block type="base_delay" id="R/,I39$L_F)H|Wo;-.Tu"><value name="DELAY_TIME"><shadow type="math_number" id="v^oK%L8!(L*88FA:#ZTV"><field name="NUM">100</field></shadow></value><next><block type="actuator_rgb_color" id="+^yYq^%@S[$c{M{=Wa"><field name="LED">0</field><field name="COLOR">0,255,0</field><next><block type="base_delay" id="_nPs2bAw)QX]RaG.o7l_"><value name="DELAY_TIME"><shadow type="math_number" id="~)IiUJDib~!f+j#0$btN"><field name="NUM">100</field></shadow></value><next><block type="actuator_rgb_color" id="bXNU0~uwFHh0AGe^9=JP"><field name="LED">0</field><field name="COLOR">0,255,255</field><next><block type="base_delay" id="^fnsHH*]W(DULX?3?{md"><value name="DELAY_TIME"><shadow type="math_number" id="#.nW!|:W:NqbIGSiBYu;"><field name="NUM">100</field></shadow></value><next><block type="actuator_rgb_color" id="R#ML|m%/`SUfGryK=#~:"><field name="LED">0</field><field name="COLOR">0,0,255</field><next><block type="base_delay" id="snJ##6LKrd:?m1k*SHJY"><value name="DELAY_TIME"><shadow type="math_number" id="*Ga$8Dve7ES^Lb|:UFWO"><field name="NUM">100</field></shadow></value><next><block type="actuator_rgb_color" id="il_0Nv--Z3$5DP5DI+E)"><field name="LED">0</field><field name="COLOR">128,0,255</field><next><block type="base_delay" id="^@ovJ-t8SGg67K30B@:8"><value name="DELAY_TIME"><shadow type="math_number" id="o{P]Q/!tVy!Ufo(u5j~D"><field name="NUM">100</field></shadow></value></block></next></block></next></block></next></block></next></block></next></block></next></block></next></block></next></block></next></block></next></block></next></block></next></block></next></block></statement></block></xml>
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 62 KiB |
@@ -0,0 +1,29 @@
|
||||
{
|
||||
"name": "@mixly/micropython-nrf51822-mithoncc",
|
||||
"version": "1.1.0",
|
||||
"description": "适用于mixly的micropython nrf51822 mithoncc模块",
|
||||
"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-mithoncc"
|
||||
],
|
||||
"homepage": "https://gitee.com/mixly2/mixly2.0_src/tree/develop/boards/default_src/micropython_nrf51822_mithoncc",
|
||||
"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_mithoncc"
|
||||
},
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
"license": "Apache 2.0"
|
||||
}
|
||||
1262
boards/default_src/micropython_nrf51822_mithoncc/template.xml
Normal file
1262
boards/default_src/micropython_nrf51822_mithoncc/template.xml
Normal file
File diff suppressed because it is too large
Load Diff
@@ -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')
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -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
|
||||
}),
|
||||
]
|
||||
});
|
||||
@@ -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,
|
||||
}
|
||||
})
|
||||
]
|
||||
}
|
||||
});
|
||||
Reference in New Issue
Block a user