初始化提交
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("TX#");
|
||||
this.appendValueInput("TX")
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField("RX#");
|
||||
this.setInputsInline(true);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setTooltip();
|
||||
this.setHelpUrl();
|
||||
}
|
||||
};
|
||||
|
||||
//MP3播放控制
|
||||
var MP3_CONTROL_TYPE = [
|
||||
[Blockly.Msg.MIXLY_MP3_PLAY, "play"],
|
||||
[Blockly.Msg.MIXLY_MP3_PAUSE, "pause"],
|
||||
[Blockly.Msg.MIXLY_MP3_NEXT, "next_track"],
|
||||
[Blockly.Msg.MIXLY_MP3_PREV, "prev_track"],
|
||||
[Blockly.Msg.MIXLY_MP3_VOL_UP, "inc_vol"],
|
||||
[Blockly.Msg.MIXLY_MP3_VOL_DOWN, "dec_vol"]
|
||||
];
|
||||
|
||||
//MP3模块
|
||||
export const MP3_CONTROL = {
|
||||
init: function () {
|
||||
this.setColour(ACTUATOR_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.QJ00X_MP3);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_STAT)
|
||||
.appendField(new Blockly.FieldDropdown(MP3_CONTROL_TYPE), "CONTROL_TYPE");
|
||||
this.setInputsInline(true);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setTooltip();
|
||||
this.setHelpUrl();
|
||||
}
|
||||
};
|
||||
|
||||
//MP3循环模式
|
||||
var MP3_LOOP_MODE_OPTIONS = [
|
||||
[Blockly.Msg.MIXLY_MP3_LOOP_ALL, "0"],
|
||||
[Blockly.Msg.MIXLY_MP3_LOOP_FOLDER, "1"],
|
||||
[Blockly.Msg.MIXLY_MP3_LOOP_ONE, "2"],
|
||||
[Blockly.Msg.MIXLY_MP3_LOOP_RAM, "3"]
|
||||
];
|
||||
|
||||
//MP3模块循环模式
|
||||
export const MP3_LOOP_MODE = {
|
||||
init: function () {
|
||||
this.setColour(ACTUATOR_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.QJ00X_MP3);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_MP3_LOOP_MODE)
|
||||
.appendField(Blockly.Msg.MIXLY_STAT)
|
||||
.appendField(new Blockly.FieldDropdown(MP3_LOOP_MODE_OPTIONS), "LOOP_MODE");
|
||||
this.setInputsInline(true);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setTooltip();
|
||||
this.setHelpUrl();
|
||||
}
|
||||
};
|
||||
|
||||
//MP3 设置EQ
|
||||
var MP3_EQ_MODE_OPTIONS = [
|
||||
[Blockly.Msg.MIXLY_MP3_EQ_NORMAL, "0"],
|
||||
[Blockly.Msg.MIXLY_MP3_EQ_POP, "1"],
|
||||
[Blockly.Msg.MIXLY_MP3_EQ_ROCK, "2"],
|
||||
[Blockly.Msg.MIXLY_MP3_EQ_JAZZ, "3"],
|
||||
[Blockly.Msg.MIXLY_MP3_EQ_CLASSIC, "4"],
|
||||
[Blockly.Msg.MIXLY_MP3_EQ_BASS, "5"]
|
||||
];
|
||||
|
||||
//MP3模块EQ模式
|
||||
export const MP3_EQ_MODE = {
|
||||
init: function () {
|
||||
this.setColour(ACTUATOR_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.QJ00X_MP3);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_MP3_EQ_MODE)
|
||||
.appendField(Blockly.Msg.MIXLY_STAT)
|
||||
.appendField(new Blockly.FieldDropdown(MP3_EQ_MODE_OPTIONS), "EQ_MODE");
|
||||
this.setInputsInline(true);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setTooltip();
|
||||
this.setHelpUrl();
|
||||
}
|
||||
};
|
||||
|
||||
//MP3模块设置音量
|
||||
export const MP3_VOL = {
|
||||
init: function () {
|
||||
this.setColour(ACTUATOR_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.QJ00X_MP3);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_MP3_VOL);
|
||||
this.appendValueInput("vol", Number)
|
||||
.appendField(Blockly.Msg.MIXLY_STAT)
|
||||
.setCheck(Number);
|
||||
this.setInputsInline(true);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setTooltip();
|
||||
this.setHelpUrl();
|
||||
}
|
||||
};
|
||||
|
||||
//MP3模块播放第N首
|
||||
export const MP3_PLAY_NUM = {
|
||||
init: function () {
|
||||
this.setColour(ACTUATOR_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.QJ00X_MP3);
|
||||
this.appendValueInput("NUM", Number)
|
||||
.appendField(Blockly.Msg.MIXLY_MP3_PLAY_NUM)
|
||||
.setCheck(Number);
|
||||
this.appendDummyInput("")
|
||||
.appendField("首");
|
||||
this.setInputsInline(true);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setTooltip();
|
||||
this.setHelpUrl();
|
||||
}
|
||||
};
|
||||
|
||||
export const MP3_PLAY_FOLDER = {
|
||||
init: function () {
|
||||
this.setColour(ACTUATOR_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.QJ00X_MP3);
|
||||
this.appendValueInput("FOLDER", Number)
|
||||
.appendField(Blockly.Msg.DFPLAYER_MINI_FOLDER)
|
||||
.setCheck(Number);
|
||||
this.appendValueInput("NUM", Number)
|
||||
.appendField(Blockly.Msg.MIXLY_MP3_PLAY_NUM)
|
||||
.setCheck(Number);
|
||||
this.appendDummyInput("")
|
||||
.appendField("首");
|
||||
this.setInputsInline(true);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setTooltip();
|
||||
this.setHelpUrl();
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,306 @@
|
||||
import * as Blockly from 'blockly/core';
|
||||
import { Profile } from 'mixly';
|
||||
|
||||
const COMMUNICATE_HUE = 140; //'#3288dd';
|
||||
|
||||
export const radio_ons = {
|
||||
init: function () {
|
||||
this.setColour(225);
|
||||
this.appendDummyInput()
|
||||
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_MICROBIT_PY_COMMUNICATE_ON, 'on'], [Blockly.Msg.MIXLY_MICROBIT_PY_COMMUNICATE_OFF, 'off'], [Blockly.Msg.HTML_RESET, 'reset']]), "type")
|
||||
.appendField(Blockly.Msg.MIXLY_MICROBIT_PY_COMMUNICATE_WIFI);
|
||||
this.setInputsInline(true);
|
||||
this.setOutput(false);
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
var thisBlock = this;
|
||||
this.setTooltip(function () {
|
||||
var mode = thisBlock.getFieldValue('type');
|
||||
var mode0 = Blockly.Msg.MIXLY_MICROBIT_PY_COMMUNICATE_WIFI;
|
||||
var TOOLTIPS = {
|
||||
'on': Blockly.Msg.MIXLY_MICROBIT_PY_COMMUNICATE_ON,
|
||||
'off': Blockly.Msg.MIXLY_MICROBIT_PY_COMMUNICATE_OFF,
|
||||
'reset': Blockly.Blockly.Msg.HTML_RESET
|
||||
};
|
||||
return TOOLTIPS[mode] + mode0;
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
export const microbit_radio_on = {
|
||||
init: function () {
|
||||
this.jsonInit({
|
||||
"colour": 225,
|
||||
"nextStatement": null,
|
||||
"previousStatement": null,
|
||||
"helpUrl": "https://microbit-micropython.readthedocs.io/en/latest/radio.html#radio.on",
|
||||
"tooltip": "Turn on the radio. This needs to be explicitly called since the radio draws power and takes up memory that you may otherwise need.",
|
||||
"message0": Blockly.Msg.MIXLY_MICROBIT_Switch_on_radio
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
export const microbit_radio_off = {
|
||||
init: function () {
|
||||
this.jsonInit({
|
||||
"colour": 225,
|
||||
"nextStatement": null,
|
||||
"previousStatement": null,
|
||||
"helpUrl": "https://microbit-micropython.readthedocs.io/en/latest/radio.html#radio.off",
|
||||
"tooltip": "Turn off the radio, thus saving power and memory.",
|
||||
"message0": Blockly.Msg.MIXLY_MICROBIT_Switch_off_radio
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
export const microbit_radio_config = {
|
||||
init: function () {
|
||||
this.jsonInit({
|
||||
"colour": 225,
|
||||
"nextStatement": null,
|
||||
"previousStatement": null,
|
||||
"helpUrl": "https://microbit-micropython.readthedocs.io/en/latest/radio.html#radio.config",
|
||||
"tooltip": Blockly.Msg.MIXLY_MICROBIT_Configure_radio1,
|
||||
"message0": Blockly.Msg.MIXLY_MICROBIT_Configure_radio,
|
||||
"args0": [{
|
||||
"min": 4,
|
||||
"value": 32,
|
||||
"type": "input_value",
|
||||
"max": 251,
|
||||
"name": "length"
|
||||
}, {
|
||||
"type": "input_dummy"
|
||||
}, {
|
||||
"min": 1,
|
||||
"value": 3,
|
||||
"type": "input_value",
|
||||
"max": 32,
|
||||
"name": "queue"
|
||||
}, {
|
||||
"type": "input_dummy"
|
||||
}, {
|
||||
"min": 0,
|
||||
"value": 7,
|
||||
"type": "input_value",
|
||||
"max": 100,
|
||||
"name": "channel"
|
||||
}, {
|
||||
"type": "input_dummy"
|
||||
}, {
|
||||
"name": "power",
|
||||
"type": "input_value"
|
||||
}, {
|
||||
"type": "input_dummy"
|
||||
}, {
|
||||
"name": "address",
|
||||
"type": "input_value"
|
||||
}, {
|
||||
"type": "input_dummy"
|
||||
}, {
|
||||
"name": "group",
|
||||
"type": "input_value"
|
||||
}, {
|
||||
"type": "input_dummy"
|
||||
}, {
|
||||
"name": "data_rate",
|
||||
"type": "input_value"
|
||||
}
|
||||
]
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
export const microbit_radio_reset = {
|
||||
init: function () {
|
||||
this.jsonInit({
|
||||
"colour": 225,
|
||||
"nextStatement": null,
|
||||
"previousStatement": null,
|
||||
"helpUrl": "https://microbit-micropython.readthedocs.io/en/latest/radio.html#radio.reset",
|
||||
"tooltip": "Reset the radio to default settings.",
|
||||
"message0": Blockly.Msg.MIXLY_MICROBIT_Reset_radio
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
export const microbit_radio_send_string = {
|
||||
init: function () {
|
||||
this.jsonInit({
|
||||
"colour": 225,
|
||||
"nextStatement": null,
|
||||
"previousStatement": null,
|
||||
"helpUrl": "https://microbit-micropython.readthedocs.io/en/latest/radio.html#radio.send",
|
||||
"tooltip": "Broadcast a text message.",
|
||||
"message0": Blockly.Msg.MIXLY_MICROBIT_Send_message,
|
||||
"args0": [{
|
||||
"check": "String",
|
||||
"type": "input_value",
|
||||
"name": "message"
|
||||
}
|
||||
]
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
export const radio_send_string = {
|
||||
init: function () {
|
||||
this.setColour(225);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_MICROBIT_RADIO_SEND);
|
||||
this.appendDummyInput()
|
||||
.appendField(new Blockly.FieldDropdown([
|
||||
[Blockly.Msg.MIXLY_MICROBIT_MSG, 'send'],
|
||||
[Blockly.Msg.MIXLY_MICROBIT_MSG_BYTE, 'send_bytes']]), "type")
|
||||
this.appendValueInput('data')
|
||||
// .setCheck(String)
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_Send_message1);
|
||||
}
|
||||
}
|
||||
|
||||
export const microbit_radio_receive = {
|
||||
init: function () {
|
||||
this.jsonInit({
|
||||
"colour": 225,
|
||||
"output": "String",
|
||||
"helpUrl": "https://microbit-micropython.readthedocs.io/en/latest/radio.html#radio.receive",
|
||||
"tooltip": Blockly.Msg.MIXLY_MICROBIT_Receive_message,
|
||||
"message0": Blockly.Msg.MIXLY_MICROBIT_Receive_message
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
export const radio_receive_string = {
|
||||
init: function () {
|
||||
this.setColour(225);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_MICROBIT_Receive_message);
|
||||
this.appendDummyInput()
|
||||
.appendField(new Blockly.FieldDropdown([
|
||||
[Blockly.Msg.MIXLY_MICROBIT_MSG, 'receive'],
|
||||
[Blockly.Msg.MIXLY_MICROBIT_MSG_BYTE, 'receive_bytes'],
|
||||
[Blockly.Msg.MIXLY_MICROBIT_MSG_FULL, 'receive_full']]), "type")
|
||||
this.setOutput(true);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_Receive_message);
|
||||
}
|
||||
}
|
||||
|
||||
export const i2c_init = {
|
||||
init: function () {
|
||||
this.setColour(COMMUNICATE_HUE);
|
||||
this.appendValueInput("RX", Number)
|
||||
//.appendField(Blockly.Msg.MIXLY_SETUP)
|
||||
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_I2C_SETUP)
|
||||
.appendField("sda")
|
||||
.setCheck(Number)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT);
|
||||
this.appendValueInput("TX", Number)
|
||||
.appendField("scl")
|
||||
.setCheck(Number)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT);
|
||||
this.appendValueInput('freq')
|
||||
.setCheck(Number)
|
||||
.appendField("频率")
|
||||
.setAlign(Blockly.inputs.Align.RIGHT);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setInputsInline(true);
|
||||
}
|
||||
};
|
||||
|
||||
export const i2c_read = {
|
||||
init: function () {
|
||||
this.setColour(COMMUNICATE_HUE);
|
||||
this.appendValueInput('address')
|
||||
.setCheck(Number)
|
||||
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_I2C_READ_ADDRESS);
|
||||
this.appendValueInput('data')
|
||||
.setCheck(Number)
|
||||
.appendField(Blockly.Msg.LANG_MATH_BYTE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.CONTROLS_REPEAT_TITLE_REPEAT)
|
||||
.appendField(new Blockly.FieldCheckbox(false), "is_repeated");
|
||||
this.setOutput(true);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_JS_I2C_READ);
|
||||
}
|
||||
}
|
||||
|
||||
export const i2c_write = {
|
||||
init: function () {
|
||||
this.setColour(COMMUNICATE_HUE);
|
||||
this.appendValueInput('address')
|
||||
.setCheck(Number)
|
||||
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_I2C_WRITE_ADDRESS);
|
||||
this.appendValueInput('data')
|
||||
.setCheck(Number)
|
||||
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_I2C_VALUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.CONTROLS_REPEAT_TITLE_REPEAT)
|
||||
.appendField(new Blockly.FieldCheckbox(false), "is_repeated");
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_JS_I2C_WRITE);
|
||||
}
|
||||
}
|
||||
|
||||
export const spi_init = {
|
||||
init: function () {
|
||||
this.jsonInit({
|
||||
"colour": COMMUNICATE_HUE,
|
||||
"nextStatement": null,
|
||||
"previousStatement": null,
|
||||
"message0": Blockly.Msg.MIXLY_MICROBIT_SPI_INIT,
|
||||
"args0": [{
|
||||
"value": 1000000,
|
||||
"type": "field_number",
|
||||
"name": "freq"
|
||||
}, {
|
||||
"type": "input_dummy"
|
||||
}, {
|
||||
"value": 8,
|
||||
"type": "field_number",
|
||||
"name": "bits"
|
||||
}, {
|
||||
"type": "input_dummy"
|
||||
}, {
|
||||
"value": 0,
|
||||
"type": "field_number",
|
||||
"name": "mode"
|
||||
}, {
|
||||
"type": "input_dummy"
|
||||
}, {
|
||||
"name": "mosi",
|
||||
"options": Profile.default.digital,
|
||||
"type": "field_dropdown"
|
||||
}, {
|
||||
"name": "miso",
|
||||
"options": Profile.default.digital,
|
||||
"type": "field_dropdown"
|
||||
}, {
|
||||
"name": "sck",
|
||||
"options": Profile.default.digital,
|
||||
"type": "field_dropdown"
|
||||
}
|
||||
]
|
||||
});
|
||||
this.setFieldValue("15", "mosi")
|
||||
this.setFieldValue("14", "miso")
|
||||
this.setFieldValue("13", "sck")
|
||||
}
|
||||
};
|
||||
|
||||
export const spi_write = {
|
||||
init: function () {
|
||||
this.setColour(COMMUNICATE_HUE);
|
||||
this.appendValueInput('data')
|
||||
.setCheck(Number)
|
||||
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_SPI_WRITE);
|
||||
this.setOutput(true, Number);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_JS_SPI_WRITE);
|
||||
}
|
||||
}
|
||||
@@ -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_microbit/blocks/inout.js
Normal file
104
boards/default_src/micropython_nrf51822_microbit/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["BBC micro:bit"] = pins["microbit"];
|
||||
|
||||
export default pins;
|
||||
121
boards/default_src/micropython_nrf51822_microbit/blocks/pins.js
Normal file
121
boards/default_src/micropython_nrf51822_microbit/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,672 @@
|
||||
import * as Blockly from 'blockly/core';
|
||||
import { Profile } from 'mixly';
|
||||
|
||||
const SENSOR_HUE = 40; //'#9e77c9'//40;
|
||||
|
||||
export const sensor_button_is_pressed = {
|
||||
init: function () {
|
||||
this.setColour(SENSOR_HUE);
|
||||
this.appendValueInput('btn')
|
||||
.appendField(Blockly.Msg.MIXLY_BUTTON)
|
||||
.setCheck(Number);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_IS_PRESSED);
|
||||
this.setOutput(true, Boolean);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_SENOR_IS_PRESSED);
|
||||
}
|
||||
};
|
||||
|
||||
export const sensor_button_was_pressed = {
|
||||
init: function () {
|
||||
this.setColour(SENSOR_HUE);
|
||||
this.appendValueInput('btn')
|
||||
.appendField(Blockly.Msg.MIXLY_BUTTON)
|
||||
.setCheck(Number);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_WAS_PRESSED);
|
||||
this.setOutput(true, Boolean);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_SENOR_WAS_PRESSED);
|
||||
}
|
||||
};
|
||||
|
||||
export const sensor_button_get_presses = {
|
||||
init: function () {
|
||||
this.setColour(SENSOR_HUE);
|
||||
this.appendValueInput('btn')
|
||||
.appendField(Blockly.Msg.MIXLY_BUTTON)
|
||||
.setCheck(Number);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_GET_PRESSES);
|
||||
this.setOutput(true, Number);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN + Blockly.Msg.MIXLY_BUTTON + Blockly.Msg.MIXLY_GET_PRESSES);
|
||||
}
|
||||
};
|
||||
|
||||
export const sensor_current_gesture1 = {
|
||||
init: function () {
|
||||
this.setColour(SENSOR_HUE);
|
||||
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_MICROBIT_Current_gesture)
|
||||
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_MICROBIT_shake, "shake"], [Blockly.Msg.MIXLY_UP, "up"], [Blockly.Msg.MIXLY_DOWN, "down"], [Blockly.Msg.MIXLY_LEFT, "left"], [Blockly.Msg.MIXLY_RIGHT, "right"], [Blockly.Msg.MIXLY_MICROBIT_face_up, "face up"], [Blockly.Msg.MIXLY_MICROBIT_face_down, "face down"], [Blockly.Msg.MIXLY_MICROBIT_freefall, "freefall"], ["3g", "3g"], ["6g", "6g"], ["8g", "8g"]]), "gesture");
|
||||
this.setOutput(true);
|
||||
var thisBlock = this;
|
||||
this.setTooltip(function () {
|
||||
var mode = thisBlock.getFieldValue('gesture');
|
||||
var mode0 = Blockly.Msg.MIXLY_MICROBIT_JS_CURRENT;
|
||||
var mode1 = Blockly.Msg.MSG.catSensor;
|
||||
var mode2 = Blockly.Msg.MIXLY_MICROBIT_JS_STATE;
|
||||
var mode3 = Blockly.Msg.MIXLY_MICROBIT_PERFORMANCE
|
||||
var TOOLTIPS = {
|
||||
'shake': Blockly.Msg.MIXLY_MICROBIT_shake,
|
||||
'up': Blockly.Msg.MIXLY_UP,
|
||||
'down': Blockly.Msg.MIXLY_DOWN,
|
||||
'left': Blockly.Msg.MIXLY_LEFT,
|
||||
'right': Blockly.Msg.MIXLY_RIGHT,
|
||||
'face up': Blockly.Msg.MIXLY_MICROBIT_face_up,
|
||||
'face down': Blockly.Msg.MIXLY_MICROBIT_face_down,
|
||||
'freefall': Blockly.Msg.MIXLY_MICROBIT_freefall,
|
||||
'3g': '3g',
|
||||
'6g': '6g',
|
||||
'8g': '8g'
|
||||
};
|
||||
return mode0 + mode1 + mode2 + TOOLTIPS[mode] + mode3;
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
export const sensor_current_gesture2 = {
|
||||
init: function () {
|
||||
this.setColour(SENSOR_HUE);
|
||||
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_WAS_GESTURE)
|
||||
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_MICROBIT_shake, "shake"], [Blockly.Msg.MIXLY_UP, "up"], [Blockly.Msg.MIXLY_DOWN, "down"], [Blockly.Msg.MIXLY_LEFT, "left"], [Blockly.Msg.MIXLY_RIGHT, "right"], [Blockly.Msg.MIXLY_MICROBIT_face_up, "face up"], [Blockly.Msg.MIXLY_MICROBIT_face_down, "face down"], [Blockly.Msg.MIXLY_MICROBIT_freefall, "freefall"], ["3g", "3g"], ["6g", "6g"], ["8g", "8g"]]), "gesture");
|
||||
this.setOutput(true);
|
||||
var thisBlock = this;
|
||||
this.setTooltip(function () {
|
||||
var mode = thisBlock.getFieldValue('gesture');
|
||||
var mode0 = Blockly.Msg.MIXLY_MICROBIT_JS_CURRENT;
|
||||
var mode1 = Blockly.Msg.MSG.catSensor;
|
||||
var mode2 = Blockly.Msg.MIXLY_MICROBIT_JS_STATE;
|
||||
var mode3 = Blockly.Msg.MIXLY_MICROBIT_PERFORMANCE
|
||||
var TOOLTIPS = {
|
||||
'shake': Blockly.Msg.MIXLY_MICROBIT_shake,
|
||||
'up': Blockly.Msg.MIXLY_UP,
|
||||
'down': Blockly.Msg.MIXLY_DOWN,
|
||||
'left': Blockly.Msg.MIXLY_LEFT,
|
||||
'right': Blockly.Msg.MIXLY_RIGHT,
|
||||
'face up': Blockly.Msg.MIXLY_MICROBIT_face_up,
|
||||
'face down': Blockly.Msg.MIXLY_MICROBIT_face_down,
|
||||
'freefall': Blockly.Msg.MIXLY_MICROBIT_freefall,
|
||||
'3g': '3g',
|
||||
'6g': '6g',
|
||||
'8g': '8g'
|
||||
};
|
||||
return mode0 + mode1 + mode2 + TOOLTIPS[mode] + mode3;
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
export const controls_attachGestureInterrupt = {
|
||||
init: function () {
|
||||
this.setColour(SENSOR_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_CURRENT_GESTURE)
|
||||
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_MICROBIT_shake, "shake"], [Blockly.Msg.MIXLY_UP, "up"], [Blockly.Msg.MIXLY_DOWN, "down"], [Blockly.Msg.MIXLY_LEFT, "left"], [Blockly.Msg.MIXLY_RIGHT, "right"], [Blockly.Msg.MIXLY_MICROBIT_face_up, "face up"], [Blockly.Msg.MIXLY_MICROBIT_face_down, "face down"], [Blockly.Msg.MIXLY_MICROBIT_freefall, "freefall"], ["3g", "3g"], ["6g", "6g"], ["8g", "8g"]]), "gesture");
|
||||
this.appendStatementInput('DO')
|
||||
.appendField(Blockly.Msg.MIXLY_DO);
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
var thisBlock = this;
|
||||
this.setTooltip(function () {
|
||||
var mode = thisBlock.getFieldValue('gesture');
|
||||
var mode0 = Blockly.Msg.MIXLY_MICROBIT_JS_CURRENT;
|
||||
var mode1 = Blockly.Msg.MSG.catSensor;
|
||||
var mode2 = Blockly.Msg.MIXLY_MICROBIT_JS_STATE;
|
||||
var mode3 = Blockly.Msg.MIXLY_MICROBIT_PERFORMANCE
|
||||
var TOOLTIPS = {
|
||||
'shake': Blockly.Msg.MIXLY_MICROBIT_shake,
|
||||
'up': Blockly.Msg.MIXLY_UP,
|
||||
'down': Blockly.Msg.MIXLY_DOWN,
|
||||
'left': Blockly.Msg.MIXLY_LEFT,
|
||||
'right': Blockly.Msg.MIXLY_RIGHT,
|
||||
'face up': Blockly.Msg.MIXLY_MICROBIT_face_up,
|
||||
'face down': Blockly.Msg.MIXLY_MICROBIT_face_down,
|
||||
'freefall': Blockly.Msg.MIXLY_MICROBIT_freefall,
|
||||
'3g': '3g',
|
||||
'6g': '6g',
|
||||
'8g': '8g'
|
||||
};
|
||||
return mode0 + mode1 + mode2 + TOOLTIPS[mode] + mode3;
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
export const controls_GestureLists = {
|
||||
init: function () {
|
||||
this.setColour(SENSOR_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_MICROBIT_shake, "shake"], [Blockly.Msg.MIXLY_UP, "up"], [Blockly.Msg.MIXLY_DOWN, "down"], [Blockly.Msg.MIXLY_LEFT, "left"], [Blockly.Msg.MIXLY_RIGHT, "right"], [Blockly.Msg.MIXLY_MICROBIT_face_up, "face up"], [Blockly.Msg.MIXLY_MICROBIT_face_down, "face down"], [Blockly.Msg.MIXLY_MICROBIT_freefall, "freefall"], ["3g", "3g"], ["6g", "6g"], ["8g", "8g"]]), "gesture");
|
||||
this.setInputsInline(true);
|
||||
this.setOutput(true);
|
||||
var thisBlock = this;
|
||||
this.setTooltip(function () {
|
||||
var mode = thisBlock.getFieldValue('gesture');
|
||||
var TOOLTIPS = {
|
||||
'shake': Blockly.Msg.MIXLY_MICROBIT_shake,
|
||||
'up': Blockly.Msg.MIXLY_UP,
|
||||
'down': Blockly.Msg.MIXLY_DOWN,
|
||||
'left': Blockly.Msg.MIXLY_LEFT,
|
||||
'right': Blockly.Msg.MIXLY_RIGHT,
|
||||
'face up': Blockly.Msg.MIXLY_MICROBIT_face_up,
|
||||
'face down': Blockly.Msg.MIXLY_MICROBIT_face_down,
|
||||
'freefall': Blockly.Msg.MIXLY_MICROBIT_freefall,
|
||||
'3g': '3g',
|
||||
'6g': '6g',
|
||||
'8g': '8g'
|
||||
};
|
||||
return TOOLTIPS[mode];
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
export const controls_attachGestureInterrupt2 = {
|
||||
init: function () {
|
||||
this.setColour(SENSOR_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_WAS_GESTURE)
|
||||
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_MICROBIT_shake, "shake"], [Blockly.Msg.MIXLY_UP, "up"], [Blockly.Msg.MIXLY_DOWN, "down"], [Blockly.Msg.MIXLY_LEFT, "left"], [Blockly.Msg.MIXLY_RIGHT, "right"], [Blockly.Msg.MIXLY_MICROBIT_face_up, "face up"], [Blockly.Msg.MIXLY_MICROBIT_face_down, "face down"], [Blockly.Msg.MIXLY_MICROBIT_freefall, "freefall"], ["3g", "3g"], ["6g", "6g"], ["8g", "8g"]]), "gesture");
|
||||
this.appendStatementInput('DO')
|
||||
.appendField(Blockly.Msg.MIXLY_DO);
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
var thisBlock = this;
|
||||
this.setTooltip(function () {
|
||||
var mode = thisBlock.getFieldValue('gesture');
|
||||
var mode0 = Blockly.Msg.CONTROLS_IF_MSG_IF;
|
||||
var mode1 = Blockly.Msg.MSG.catSensor;
|
||||
var mode2 = Blockly.Msg.MIXLY_MICROBIT_JS_WAS_GESTURE;
|
||||
var mode3 = Blockly.Msg.MIXLY_MICROBIT_PERFORMANCE;
|
||||
var TOOLTIPS = {
|
||||
'shake': Blockly.Msg.MIXLY_MICROBIT_shake,
|
||||
'up': Blockly.Msg.MIXLY_UP,
|
||||
'down': Blockly.Msg.MIXLY_DOWN,
|
||||
'left': Blockly.Msg.MIXLY_LEFT,
|
||||
'right': Blockly.Msg.MIXLY_RIGHT,
|
||||
'face up': Blockly.Msg.MIXLY_MICROBIT_face_up,
|
||||
'face down': Blockly.Msg.MIXLY_MICROBIT_face_down,
|
||||
'freefall': Blockly.Msg.MIXLY_MICROBIT_freefall,
|
||||
'3g': '3g',
|
||||
'6g': '6g',
|
||||
'8g': '8g'
|
||||
};
|
||||
return mode0 + mode1 + mode2 + TOOLTIPS[mode] + mode3;
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
export const sensor_get_acceleration = {
|
||||
init: function () {
|
||||
this.setColour(SENSOR_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_ACCELERATION)
|
||||
.appendField(new Blockly.FieldDropdown([
|
||||
["x", "x"],
|
||||
["y", "y"],
|
||||
["z", "z"],
|
||||
["(x,y,z)", "values"]
|
||||
]), "key");
|
||||
this.setOutput(true, Number);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_JS_ACCELERATION);
|
||||
var thisBlock = this;
|
||||
this.setTooltip(function () {
|
||||
var mode = thisBlock.getFieldValue('key');
|
||||
var mode0 = Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET;
|
||||
var mode1 = Blockly.Msg.MIXLY_MICROBIT_Direction;
|
||||
var mode2 = Blockly.Msg.MIXLY_MICROBIT_JS_ACCELERATION1;
|
||||
var TOOLTIPS = {
|
||||
'x': 'x',
|
||||
'y': 'y',
|
||||
'z': 'z',
|
||||
'(x,y,z)': Blockly.Msg.MIXLY_MICROBIT_Shiliang_Direction,
|
||||
};
|
||||
return mode0 + TOOLTIPS[mode] + mode1 + mode2;
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
export const sensor_set_acceleration = {
|
||||
init: function () {
|
||||
this.setColour(SENSOR_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_SET_ACCELERATION)
|
||||
.appendField(new Blockly.FieldDropdown([
|
||||
["1g", "AcceleratorRange.OneG"],
|
||||
["2g", "AcceleratorRange.TwoG"],
|
||||
["4g", "AcceleratorRange.FourG"],
|
||||
["8g", "AcceleratorRange.EightG"]
|
||||
]), "key");
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_JS_SET_ACCELERATION);
|
||||
}
|
||||
};
|
||||
|
||||
export const sensor_get_gestures = {
|
||||
init: function () {
|
||||
this.setColour(SENSOR_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_GET)
|
||||
.appendField(new Blockly.FieldDropdown([
|
||||
[Blockly.Msg.MIXLY_MICROBIT_JS_GET_GESTURE, 'all'],
|
||||
[Blockly.Msg.MIXLY_MICROBIT_JS_CURRENT_GESTURE, 'current']
|
||||
]), 'GES')
|
||||
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_GESTURE);
|
||||
this.setOutput(true, Number);
|
||||
this.setInputsInline(true);
|
||||
var thisBlock = this;
|
||||
this.setTooltip(function () {
|
||||
var mode = thisBlock.getFieldValue('GES');
|
||||
var mode0 = Blockly.Msg.MIXLY_MICROBIT_JS_GET;
|
||||
var mode1 = Blockly.Msg.MIXLY_MICROBIT_JS_GESTURE;
|
||||
var TOOLTIPS = {
|
||||
'all': Blockly.Msg.MIXLY_MICROBIT_JS_GET_GESTURE,
|
||||
'current': Blockly.Msg.MIXLY_MICROBIT_JS_CURRENT_GESTURE
|
||||
};
|
||||
return mode0 + TOOLTIPS[mode] + mode1;
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
export const sensor_current_gesture = {
|
||||
init: function () {
|
||||
this.setColour(SENSOR_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_CURRENT_GESTURE)
|
||||
this.setOutput(true, Number);
|
||||
this.setInputsInline(true);
|
||||
}
|
||||
};
|
||||
|
||||
export const sensor_light_level = {
|
||||
init: function () {
|
||||
this.setColour(SENSOR_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_LIGHT_LEVEL)
|
||||
this.setOutput(true, Number);
|
||||
this.setInputsInline(true);
|
||||
}
|
||||
};
|
||||
export const sensor_calibrate_compass = {
|
||||
init: function () {
|
||||
this.setColour(SENSOR_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_CALIBRATE_COMPASS)
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_JS_CALIBRATE_COMPASS);
|
||||
}
|
||||
};
|
||||
export const sensor_is_compass_calibrated = {
|
||||
init: function () {
|
||||
this.setColour(SENSOR_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_IS_COMPASS_CALIBRATED)
|
||||
this.setOutput(true, Number);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_JS_IS_COMPASS_CALIBRATED1);
|
||||
}
|
||||
};
|
||||
export const sensor_compass_heading = {
|
||||
init: function () {
|
||||
this.setColour(SENSOR_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_BY_ANGLE)
|
||||
this.setOutput(true, Number);
|
||||
this.setInputsInline(true);
|
||||
}
|
||||
};
|
||||
export const sensor_temperature = {
|
||||
init: function () {
|
||||
this.setColour(SENSOR_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_MICROBIT_Board_temperature)
|
||||
this.setOutput(true, Number);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_Board_temperature);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
export const sensor_field_strength = {
|
||||
init: function () {
|
||||
this.setColour(SENSOR_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_GET_COMPASS)
|
||||
.appendField(new Blockly.FieldDropdown([
|
||||
[Blockly.Msg.MIXLY_MICROBIT_JS_FIELD_STRENGTH, 'get_field_strength'],
|
||||
[Blockly.Msg.MIXLY_MICROBIT_JS_BY_ANGLE, 'heading'],
|
||||
["x", "get_x"],
|
||||
["y", "get_y"],
|
||||
["z", "get_z"]
|
||||
]), 'compass');
|
||||
this.setOutput(true, Number);
|
||||
this.setInputsInline(true);
|
||||
var thisBlock = this;
|
||||
this.setTooltip(function () {
|
||||
var mode = thisBlock.getFieldValue('compass');
|
||||
var mode0 = Blockly.Msg.MIXLY_MICROBIT_JS_GET_COMPASS;
|
||||
var TOOLTIPS = {
|
||||
'strength': Blockly.Msg.MIXLY_MICROBIT_JS_FIELD_STRENGTH,
|
||||
'heading': Blockly.Msg.MIXLY_MICROBIT_JS_BY_ANGLE
|
||||
};
|
||||
return mode0 + TOOLTIPS[mode];
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
export const sensor_rotation = {
|
||||
init: function () {
|
||||
this.setColour(SENSOR_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_ROTATION)
|
||||
.appendField(new Blockly.FieldDropdown([
|
||||
["pitch", "Rotation.Pitch"],
|
||||
["roll", "Rotation.Roll"]
|
||||
]), "key");
|
||||
this.setOutput(true, Number);
|
||||
this.setInputsInline(true);
|
||||
}
|
||||
};
|
||||
export const sensor_magnetic = {
|
||||
init: function () {
|
||||
this.setColour(SENSOR_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_MAGETIC_FORCE)
|
||||
.appendField(new Blockly.FieldDropdown([
|
||||
["x", "Dimension.X"],
|
||||
["y", "Dimension.Y"],
|
||||
["z", "Dimension.Z"],
|
||||
["strength", "Dimension.Strength"]
|
||||
]), "key");
|
||||
this.setOutput(true, Number);
|
||||
this.setInputsInline(true);
|
||||
}
|
||||
};
|
||||
|
||||
export const sensor_distance_hrsc04 = {
|
||||
init: function () {
|
||||
this.setColour(SENSOR_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_CHAOSHENGBO)
|
||||
.appendField("Trig")
|
||||
.appendField(new Blockly.FieldDropdown([["P0", "0"], ["P1", "1"], ["P2", "2"], ["P3", "3"], ["P4", "4"], ["P5", "5"], ["P6", "6"], ["P7", "7"], ["P8", "8"], ["P9", "9"], ["P10", "10"], ["P11", "11"], ["P12", "12"], ["P13", "13"], ["P14", "14"], ["P15", "15"], ["P16", "16"], ["P19", "19"], ["P20", "20"]]), "Trig")
|
||||
.appendField("Echo")
|
||||
.appendField(new Blockly.FieldDropdown([["P0", "0"], ["P1", "1"], ["P2", "2"], ["P3", "3"], ["P4", "4"], ["P5", "5"], ["P6", "6"], ["P7", "7"], ["P8", "8"], ["P9", "9"], ["P10", "10"], ["P11", "11"], ["P12", "12"], ["P13", "13"], ["P14", "14"], ["P15", "15"], ["P16", "16"], ["P19", "19"], ["P20", "20"]]), "Echo");
|
||||
this.setOutput(true, Number);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip("");
|
||||
}
|
||||
};
|
||||
|
||||
export const sensor_distance_hrsc04_ = {
|
||||
init: function () {
|
||||
this.setColour(SENSOR_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_CHAOSHENGBO)
|
||||
.appendField("Trig")
|
||||
.appendField(new Blockly.FieldDropdown([["P0", "0"], ["P1", "1"], ["P2", "2"], ["P3", "3"], ["P4", "4"], ["P5", "5"], ["P6", "6"], ["P7", "7"], ["P8", "8"], ["P9", "9"], ["P10", "10"], ["P11", "11"], ["P12", "12"], ["P13", "13"], ["P14", "14"], ["P15", "15"], ["P16", "16"], ["P19", "19"], ["P20", "20"]]), "Trig")
|
||||
.appendField("Echo")
|
||||
.appendField(new Blockly.FieldDropdown([["P0", "0"], ["P1", "1"], ["P2", "2"], ["P3", "3"], ["P4", "4"], ["P5", "5"], ["P6", "6"], ["P7", "7"], ["P8", "8"], ["P9", "9"], ["P10", "10"], ["P11", "11"], ["P12", "12"], ["P13", "13"], ["P14", "14"], ["P15", "15"], ["P16", "16"], ["P19", "19"], ["P20", "20"]]), "Echo");
|
||||
this.setOutput(true, Number);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip();
|
||||
}
|
||||
};
|
||||
|
||||
export const DS1307_init = {
|
||||
init: function () {
|
||||
this.setColour(SENSOR_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_RTCINIT);
|
||||
//this.appendDummyInput("").setAlign(Blockly.inputs.Align.RIGHT).appendField(new Blockly.FieldDropdown(RTCTypeList), 'RTCType');
|
||||
this.appendDummyInput("")
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField('myRTC');
|
||||
this.appendValueInput("SDA")
|
||||
.appendField("SDA#")
|
||||
.setCheck(Number);
|
||||
this.appendValueInput("SCL")
|
||||
.appendField("SCL#")
|
||||
.setCheck(Number);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_RTCINIT);
|
||||
},
|
||||
//mutation有问题,暂时弃用
|
||||
/*mutationToDom: function() {
|
||||
var container = document.createElement('mutation');
|
||||
var RTCType = (this.getFieldValue('RTCType') == 'DS1302');
|
||||
console.log('======change in mutationToDom==========')
|
||||
console.log(RTCType);
|
||||
container.setAttribute('RTCType', RTCType);
|
||||
return container;
|
||||
},
|
||||
domToMutation: function(xmlElement) {
|
||||
var type = (xmlElement.getAttribute('RTCType') == 'true');
|
||||
console.log('======change in domToMutation==========')
|
||||
console.log(type);
|
||||
this.updateShape_(type);
|
||||
},
|
||||
updateShape_: function(type) {
|
||||
// Add or remove reset pin.
|
||||
console.log('======change in updateShape_==========')
|
||||
console.log(type);
|
||||
if (type) {
|
||||
console.log('why not me?')
|
||||
this.appendValueInput("RST")
|
||||
.appendField("RST#")
|
||||
.setCheck(Number);
|
||||
} else{
|
||||
/*if (this.childBlocks_.length > 0) {
|
||||
if (this.childBlocks_[length-1].type == 'Number') {
|
||||
this.childBlocks_[length-1].unplug();
|
||||
break;
|
||||
}
|
||||
}
|
||||
this.removeInput('RST');
|
||||
}
|
||||
}*/
|
||||
|
||||
};
|
||||
|
||||
var RTC_TIME_TYPE = [
|
||||
[Blockly.Msg.MIXLY_YEAR, "Year"],
|
||||
[Blockly.Msg.MIXLY_MONTH, "Month"],
|
||||
[Blockly.Msg.MIXLY_DAY, "Day"],
|
||||
[Blockly.Msg.MIXLY_HOUR, "Hour"],
|
||||
[Blockly.Msg.MIXLY_MINUTE, "Minute"],
|
||||
[Blockly.Msg.MIXLY_SECOND, "Second"],
|
||||
[Blockly.Msg.MIXLY_WEEK, "Week"],
|
||||
[Blockly.Msg.MIXLY_MIX1, "Mix1"],
|
||||
[Blockly.Msg.MIXLY_MIX2, "Mix2"],
|
||||
];
|
||||
|
||||
|
||||
//传感器-实时时钟块_获取时间
|
||||
export const RTC_get_time = {
|
||||
init: function () {
|
||||
this.setColour(SENSOR_HUE);
|
||||
this.appendDummyInput("")
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(Blockly.Msg.MIXLY_RTCGETTIME);
|
||||
this.appendDummyInput("")
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField('myRTC');
|
||||
this.appendDummyInput("")
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(new Blockly.FieldDropdown(RTC_TIME_TYPE), "TIME_TYPE");
|
||||
this.setInputsInline(true);
|
||||
this.setOutput(true, Number);
|
||||
var thisBlock = this;
|
||||
this.setTooltip(function () {
|
||||
var mode = thisBlock.getFieldValue('TIME_TYPE');
|
||||
var mode0 = Blockly.Msg.MIXLY_RTCGETTIME;
|
||||
var TOOLTIPS = {
|
||||
'Year': Blockly.Msg.MIXLY_YEAR,
|
||||
'Month': Blockly.Msg.MIXLY_MONTH,
|
||||
'Day': Blockly.Msg.MIXLY_DAY,
|
||||
'Hour': Blockly.Msg.MIXLY_HOUR,
|
||||
'Minute': Blockly.Msg.MIXLY_MINUTE,
|
||||
'Second': Blockly.Msg.MIXLY_SECOND,
|
||||
'Week': Blockly.Msg.MIXLY_WEEK,
|
||||
'Mix1': Blockly.Msg.MIXLY_MIX1,
|
||||
'Mix2': Blockly.Msg.MIXLY_MIX2
|
||||
};
|
||||
return mode0 + TOOLTIPS[mode];
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
export const RTC_set_time = {
|
||||
init: function () {
|
||||
this.setColour(SENSOR_HUE);
|
||||
this.appendDummyInput("")
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(Blockly.Msg.MIXLY_RTCSETTIME)
|
||||
.appendField('myRTC');
|
||||
this.appendValueInput("hour")
|
||||
.setCheck(Number)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(" " + Blockly.Msg.MIXLY_HOUR);
|
||||
this.appendValueInput("minute")
|
||||
.setCheck(Number)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(" " + Blockly.Msg.MIXLY_MINUTE);
|
||||
this.appendValueInput("second")
|
||||
.setCheck(Number)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(" " + Blockly.Msg.MIXLY_SECOND);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setInputsInline(false);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_RTCSETTIME + Blockly.Msg.MIXLY_MIX2);
|
||||
}
|
||||
};
|
||||
|
||||
export const RTC_set_date = {
|
||||
init: function () {
|
||||
this.setColour(SENSOR_HUE);
|
||||
this.appendDummyInput("")
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(Blockly.Msg.MIXLY_RTCSETDATE)
|
||||
.appendField('myRTC');
|
||||
this.appendValueInput("year")
|
||||
.setCheck(Number)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(" " + Blockly.Msg.MIXLY_YEAR);
|
||||
this.appendValueInput("month")
|
||||
.setCheck(Number)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(" " + Blockly.Msg.MIXLY_MONTH);
|
||||
this.appendValueInput("day")
|
||||
.setCheck(Number)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(" " + Blockly.Msg.MIXLY_DAY);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_RTCSETDATE + Blockly.Msg.MIXLY_MIX1);
|
||||
}
|
||||
};
|
||||
|
||||
export const sensor_compass_reset = {
|
||||
init: function () {
|
||||
this.jsonInit({
|
||||
"colour": SENSOR_HUE,
|
||||
"nextStatement": null,
|
||||
"previousStatement": null,
|
||||
"helpUrl": "https://microbit-micropython.readthedocs.io/en/latest/music.html#music.reset",
|
||||
"message0": Blockly.Msg.MIXLY_MICROBIT_Reset_COMPASS
|
||||
});
|
||||
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_Reset_COMPASS);
|
||||
}
|
||||
};
|
||||
|
||||
export const sensor_light = {
|
||||
init: function () {
|
||||
this.setColour(SENSOR_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_ESP32_LIGHT);
|
||||
this.setOutput(true, Number);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip(Blockly.Msg.MICROBIT_SENSOR_LIGHT_TOOLTIP);
|
||||
}
|
||||
};
|
||||
|
||||
export const sensor_hrsc04_init = {
|
||||
init: function () {
|
||||
this.setColour(SENSOR_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_HCSR04_INIT)
|
||||
//.appendField("sonar")
|
||||
.appendField("Trig")
|
||||
.appendField(new Blockly.FieldDropdown([["P0", "0"], ["P1", "1"], ["P2", "2"], ["P3", "3"], ["P4", "4"], ["P5", "5"], ["P6", "6"], ["P7", "7"], ["P8", "8"], ["P9", "9"], ["P10", "10"], ["P11", "11"], ["P12", "12"], ["P13", "13"], ["P14", "14"], ["P15", "15"], ["P16", "16"], ["P19", "19"], ["P20", "20"]]), "Trig")
|
||||
.appendField("Echo")
|
||||
.appendField(new Blockly.FieldDropdown([["P0", "0"], ["P1", "1"], ["P2", "2"], ["P3", "3"], ["P4", "4"], ["P5", "5"], ["P6", "6"], ["P7", "7"], ["P8", "8"], ["P9", "9"], ["P10", "10"], ["P11", "11"], ["P12", "12"], ["P13", "13"], ["P14", "14"], ["P15", "15"], ["P16", "16"], ["P19", "19"], ["P20", "20"]]), "Echo");
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip();
|
||||
}
|
||||
};
|
||||
|
||||
var TCS34725_GETRGB = [
|
||||
[Blockly.Msg.COLOUR_RGB_RED, "0"],
|
||||
[Blockly.Msg.COLOUR_RGB_GREEN, "1"],
|
||||
[Blockly.Msg.COLOUR_RGB_BLUE, "2"]
|
||||
];
|
||||
|
||||
export const TCS34725_Get_RGB = {
|
||||
init: function () {
|
||||
this.setColour(SENSOR_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.TCS34725_Get_RGB)
|
||||
.appendField(new Blockly.FieldDropdown(TCS34725_GETRGB), "TCS34725_COLOR");
|
||||
this.setInputsInline(true);
|
||||
this.setOutput(true);
|
||||
}
|
||||
};
|
||||
|
||||
//NTC电阻
|
||||
export const NTC_TEMP = {
|
||||
init: function () {
|
||||
this.setColour(SENSOR_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField("NTC")
|
||||
.appendField(Blockly.Msg.MIXLY_TEMP);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_PIN)
|
||||
.appendField(new Blockly.FieldDropdown(Profile.default.analog), "PIN");
|
||||
this.appendValueInput("NominalResistance")
|
||||
.setCheck(Number)
|
||||
.appendField(Blockly.Msg.MIXLY_NominalResistance);
|
||||
this.appendValueInput("betaCoefficient")
|
||||
.setCheck(Number)
|
||||
.appendField(Blockly.Msg.MIXLY_betaCoefficient);
|
||||
this.appendValueInput("seriesResistor")
|
||||
.setCheck(Number)
|
||||
.appendField(Blockly.Msg.MIXLY_seriesResistor);
|
||||
this.setInputsInline(false);
|
||||
this.setOutput(true, Number);
|
||||
this.setTooltip();
|
||||
}
|
||||
};
|
||||
@@ -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,66 @@
|
||||
import * as Blockly from 'blockly/core';
|
||||
|
||||
const SYSTEM_HUE = 120;
|
||||
|
||||
export const base_delay = {
|
||||
init: function () {
|
||||
this.setColour(SYSTEM_HUE);
|
||||
this.appendValueInput("DELAY_TIME", Number)
|
||||
.appendField(Blockly.Msg.MIXLY_DELAY + '(' + Blockly.Msg.MIXLY_MILLIS + ')')
|
||||
.setCheck(Number);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_CONTROL_DELAY);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
export const controls_millis = {
|
||||
init: function () {
|
||||
this.setColour(SYSTEM_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_RUNTIME + "(" + Blockly.Msg.MIXLY_MILLIS + ")");
|
||||
this.setOutput(true, Number);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_CONTROL_MILLIS);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
export const Panic_with_status_code = {
|
||||
init: function () {
|
||||
this.setColour(SYSTEM_HUE);
|
||||
this.appendValueInput("STATUS_CODE", Number)
|
||||
.appendField(Blockly.Msg.MIXLY_MICROBIT_Panic_with_status_code)
|
||||
.setCheck(Number);
|
||||
this.setPreviousStatement(true, null);
|
||||
// this.setNextStatement(true, null);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_Panic_with_status_code);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
export const reset = {
|
||||
init: function () {
|
||||
this.setColour(SYSTEM_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_MICROBIT_Reset_micro);
|
||||
this.setPreviousStatement(true);
|
||||
// this.setNextStatement(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_Reset_micro);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
export const controls_uname = {
|
||||
init: function () {
|
||||
this.setColour(SYSTEM_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_MICROBIT_PY_CONTORL_UNAME);
|
||||
|
||||
this.setInputsInline(true);
|
||||
this.setOutput(true);
|
||||
this.setTooltip(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN + Blockly.Msg.MIXLY_MICROBIT_PY_CONTORL_UNAME);
|
||||
}
|
||||
};
|
||||
@@ -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,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,152 @@
|
||||
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(1) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
|
||||
background:url('../../../../common/media/mark/inout.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(1) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
|
||||
background:url('../../../../common/media/mark/inout2.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(2) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
|
||||
background:url('../../../../common/media/mark/ctrl.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(2) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
|
||||
background:url('../../../../common/media/mark/ctrl2.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(3) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
|
||||
background:url('../../../../common/media/mark/math.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(3) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
|
||||
background:url('../../../../common/media/mark/math2.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(4) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
|
||||
background:url('../../../../common/media/mark/logic.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(4) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
|
||||
background:url('../../../../common/media/mark/logic2.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(5) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
|
||||
background:url('../../../../common/media/mark/text.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(5) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
|
||||
background:url('../../../../common/media/mark/text2.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(6) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
|
||||
background:url('../../../../common/media/mark/list3.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(6) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
|
||||
background:url('../../../../common/media/mark/list4.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(7) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
|
||||
background:url('../../../../common/media/mark/tuple.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(7) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
|
||||
background:url('../../../../common/media/mark/tuple2.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(8) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
|
||||
background:url('../../../../common/media/mark/dict.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(8) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
|
||||
background:url('../../../../common/media/mark/dict2.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(9) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
|
||||
background:url('../../../../common/media/mark/set.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(9) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
|
||||
background:url('../../../../common/media/mark/set2.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(10) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
|
||||
background:url('../../../../common/media/mark/var.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(10) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
|
||||
background:url('../../../../common/media/mark/var2.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(11) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
|
||||
background:url('../../../../common/media/mark/func.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(11) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
|
||||
background:url('../../../../common/media/mark/func2.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(12) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
|
||||
background:url('../../../../common/media/mark/port.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(12) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
|
||||
background:url('../../../../common/media/mark/port2.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(13) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
|
||||
background:url('../../../../common/media/mark/sensor.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(13) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
|
||||
background:url('../../../../common/media/mark/sensor2.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(14) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
|
||||
background:url('../../../../common/media/mark/act.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(14) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
|
||||
background:url('../../../../common/media/mark/act2.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(15) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
|
||||
background:url('../../../../common/media/mark/monitor.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(15) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
|
||||
background:url('../../../../common/media/mark/monitor2.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(16) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
|
||||
background:url('../../../../common/media/mark/file.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(16) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
|
||||
background:url('../../../../common/media/mark/file2.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(17) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
|
||||
background:url('../../../../common/media/mark/comuni.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(17) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
|
||||
background:url('../../../../common/media/mark/comuni2.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(18) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
|
||||
background:url('../../../../common/media/mark/net.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(18) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
|
||||
background:url('../../../../common/media/mark/net2.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(19) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
|
||||
background:url('../../../../common/media/mark/factory3.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(19) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
|
||||
background:url('../../../../common/media/mark/factory4.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
43
boards/default_src/micropython_nrf51822_microbit/export.js
Normal file
43
boards/default_src/micropython_nrf51822_microbit/export.js
Normal file
@@ -0,0 +1,43 @@
|
||||
import MicropythonNRF51822MicrobitPins from './blocks/microbit_profile';
|
||||
|
||||
import * as MicropythonNRF51822MicrobitActuatorBlocks from './blocks/actuator';
|
||||
import * as MicropythonNRF51822MicrobitCommunicateBlocks from './blocks/communicate';
|
||||
import * as MicropythonNRF51822MicrobitDisplayBlocks from './blocks/display';
|
||||
import * as MicropythonNRF51822MicrobitFactoryBlocks from './blocks/factory';
|
||||
import * as MicropythonNRF51822MicrobitInoutBlocks from './blocks/inout';
|
||||
import * as MicropythonNRF51822MicrobitPinsBlocks from './blocks/pins';
|
||||
import * as MicropythonNRF51822MicrobitSensorBlocks from './blocks/sensor';
|
||||
import * as MicropythonNRF51822MicrobitSerialBlocks from './blocks/serial';
|
||||
import * as MicropythonNRF51822MicrobitSystemBlocks from './blocks/system';
|
||||
|
||||
import * as MicropythonNRF51822MicrobitActuatorGenerators from './generators/actuator';
|
||||
import * as MicropythonNRF51822MicrobitCommunicateGenerators from './generators/communicate';
|
||||
import * as MicropythonNRF51822MicrobitDisplayGenerators from './generators/display';
|
||||
import * as MicropythonNRF51822MicrobitFactoryGenerators from './generators/factory';
|
||||
import * as MicropythonNRF51822MicrobitInoutGenerators from './generators/inout';
|
||||
import * as MicropythonNRF51822MicrobitPinsGenerators from './generators/pins';
|
||||
import * as MicropythonNRF51822MicrobitSensorGenerators from './generators/sensor';
|
||||
import * as MicropythonNRF51822MicrobitSerialGenerators from './generators/serial';
|
||||
import * as MicropythonNRF51822MicrobitSystemGenerators from './generators/system';
|
||||
|
||||
export {
|
||||
MicropythonNRF51822MicrobitPins,
|
||||
MicropythonNRF51822MicrobitActuatorBlocks,
|
||||
MicropythonNRF51822MicrobitCommunicateBlocks,
|
||||
MicropythonNRF51822MicrobitDisplayBlocks,
|
||||
MicropythonNRF51822MicrobitFactoryBlocks,
|
||||
MicropythonNRF51822MicrobitInoutBlocks,
|
||||
MicropythonNRF51822MicrobitPinsBlocks,
|
||||
MicropythonNRF51822MicrobitSensorBlocks,
|
||||
MicropythonNRF51822MicrobitSerialBlocks,
|
||||
MicropythonNRF51822MicrobitSystemBlocks,
|
||||
MicropythonNRF51822MicrobitActuatorGenerators,
|
||||
MicropythonNRF51822MicrobitCommunicateGenerators,
|
||||
MicropythonNRF51822MicrobitDisplayGenerators,
|
||||
MicropythonNRF51822MicrobitFactoryGenerators,
|
||||
MicropythonNRF51822MicrobitInoutGenerators,
|
||||
MicropythonNRF51822MicrobitPinsGenerators,
|
||||
MicropythonNRF51822MicrobitSensorGenerators,
|
||||
MicropythonNRF51822MicrobitSerialGenerators,
|
||||
MicropythonNRF51822MicrobitSystemGenerators
|
||||
};
|
||||
@@ -0,0 +1,284 @@
|
||||
export const microbit_music_play_built_in = function (block, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
generator.definitions_['import_music'] = 'import music';
|
||||
var dropdown_melody = block.getFieldValue('melody');
|
||||
var pin = generator.valueToCode(block, 'PIN', generator.ORDER_ATOMIC);
|
||||
var checkbox_wait = block.getFieldValue('wait') == 'TRUE' ? 'True' : 'False';
|
||||
var checkbox_loop = block.getFieldValue('loop') == 'TRUE' ? 'True' : 'False';
|
||||
var code = 'music.play(music.' + dropdown_melody + ', pin=pin' + pin + ', wait=' + checkbox_wait + ', loop=' + checkbox_loop + ')\n';
|
||||
return code;
|
||||
}
|
||||
|
||||
export const microbit_music_play_built_in_easy = function (block, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
generator.definitions_['import_music'] = 'import music';
|
||||
var dropdown_melody = block.getFieldValue('melody');
|
||||
var pin = generator.valueToCode(block, 'PIN', generator.ORDER_ATOMIC);
|
||||
var code = 'music.play(music.' + dropdown_melody + ', pin=pin' + pin + ')\n';
|
||||
return code;
|
||||
}
|
||||
|
||||
export const microbit_music_pitch_delay = function (block, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
generator.definitions_['import_music'] = 'import music';
|
||||
generator.definitions_['import_math'] = 'import math';
|
||||
var number_pitch = generator.valueToCode(block, 'pitch', generator.ORDER_ATOMIC);
|
||||
var number_duration = generator.valueToCode(block, 'duration', generator.ORDER_ATOMIC);
|
||||
var pin = generator.valueToCode(block, 'PIN', generator.ORDER_ATOMIC);
|
||||
var checkbox_wait = block.getFieldValue('wait') == 'TRUE' ? 'True' : 'False';
|
||||
var code = 'music.pitch(round(' + number_pitch + '), round(' + number_duration + '), pin' + pin + ', wait = ' + checkbox_wait + ')\n';
|
||||
return code;
|
||||
}
|
||||
|
||||
export const microbit_music_pitch = function (block, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
generator.definitions_['import_music'] = 'import music';
|
||||
generator.definitions_['import_math'] = 'import math';
|
||||
var number_pitch = generator.valueToCode(block, 'pitch', generator.ORDER_ATOMIC);
|
||||
// var number_duration = generator.valueToCode(block, 'duration', generator.ORDER_ATOMIC);
|
||||
var pin = generator.valueToCode(block, 'PIN', generator.ORDER_ATOMIC);
|
||||
var code = 'music.pitch(round(' + number_pitch + '), pin=pin' + pin + ')\n';
|
||||
return code;
|
||||
}
|
||||
|
||||
export const microbit_music_play_list_of_notes = function (block, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
generator.definitions_['import_music'] = 'import music';
|
||||
var pin = generator.valueToCode(block, 'PIN', generator.ORDER_ATOMIC);
|
||||
var value_notes = generator.valueToCode(block, 'notes', generator.ORDER_ATOMIC) || '[]';
|
||||
var checkbox_wait = block.getFieldValue('wait') == 'TRUE' ? 'True' : 'False';
|
||||
var checkbox_loop = block.getFieldValue('loop') == 'TRUE' ? 'True' : 'False';
|
||||
var code = 'music.play(' + value_notes + ', pin=pin' + pin + ', wait=' + checkbox_wait + ', loop=' + checkbox_loop + ')\n';
|
||||
return code;
|
||||
}
|
||||
|
||||
export const microbit_music_reset = function (_, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
generator.definitions_['import_music'] = 'import music';
|
||||
var code = 'music.reset()\n';
|
||||
return code;
|
||||
}
|
||||
|
||||
export const microbit_music_stop = function (_, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
generator.definitions_['import_music'] = 'import music';
|
||||
var pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
|
||||
var code = 'music.stop(pin' + pin + ')\n';
|
||||
return code;
|
||||
}
|
||||
|
||||
export const microbit_music_get_tempo = function (_, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
generator.definitions_['import_music'] = 'import music';
|
||||
var code = 'music.get_tempo()';
|
||||
return [code, generator.ORDER_ATOMIC];
|
||||
}
|
||||
|
||||
export const tone_set_tempo = function (_, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
var bpm = generator.valueToCode(this, 'BPM', generator.ORDER_ASSIGNMENT);
|
||||
var ticks = generator.valueToCode(this, 'TICKS', generator.ORDER_ASSIGNMENT);
|
||||
var code = "music.set_tempo(ticks=" + ticks + ", bpm=" + bpm + ")\n";
|
||||
return code;
|
||||
}
|
||||
|
||||
export const speech_translate = function (_, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
generator.definitions_['import_speech'] = 'import speech';
|
||||
var text = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
|
||||
var code = ["speech.translate(" + text + ")", generator.ORDER_ATOMIC];
|
||||
return code
|
||||
}
|
||||
|
||||
export const speech_say = function (_, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
generator.definitions_['import_speech'] = 'import speech';
|
||||
var mode = this.getFieldValue("MODE");
|
||||
var text = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
|
||||
var pitch = generator.valueToCode(this, 'pitch', generator.ORDER_ATOMIC);
|
||||
var speed = generator.valueToCode(this, 'speed', generator.ORDER_ATOMIC);
|
||||
var mouth = generator.valueToCode(this, 'mouth', generator.ORDER_ATOMIC);
|
||||
var throat = generator.valueToCode(this, 'throat', generator.ORDER_ATOMIC);
|
||||
var code = "speech." + mode + "(" + text + ", pitch=" + pitch + ", speed=" + speed + ", mouth=" + mouth + ", throat=" + throat + ")\n";
|
||||
return code
|
||||
}
|
||||
|
||||
// export const speech_sing = function(){
|
||||
// generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
// generator.definitions_['import_speech'] = 'import speech';
|
||||
// var text = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
|
||||
// var pitch = generator.valueToCode(this, 'pitch', generator.ORDER_ATOMIC);
|
||||
// var speed = generator.valueToCode(this, 'speed', generator.ORDER_ATOMIC);
|
||||
// var mouth = generator.valueToCode(this, 'mouth', generator.ORDER_ATOMIC);
|
||||
// var throat = generator.valueToCode(this, 'throat', generator.ORDER_ATOMIC);
|
||||
// var code = "speech.sing("+ text +", pitch="+pitch+", speed="+speed+", mouth="+mouth+", throat="+throat+")\n";
|
||||
// return code
|
||||
// }
|
||||
|
||||
// export const speech_prenounce = function(){
|
||||
// generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
// generator.definitions_['import_speech'] = 'import speech';
|
||||
// var text = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
|
||||
// var pitch = generator.valueToCode(this, 'pitch', generator.ORDER_ATOMIC);
|
||||
// var speed = generator.valueToCode(this, 'speed', generator.ORDER_ATOMIC);
|
||||
// var mouth = generator.valueToCode(this, 'mouth', generator.ORDER_ATOMIC);
|
||||
// var throat = generator.valueToCode(this, 'throat', generator.ORDER_ATOMIC);
|
||||
// var code = "speech.pronounce("+ text +", pitch="+pitch+", speed="+speed+", mouth="+mouth+", throat="+throat+")\n";
|
||||
// return code
|
||||
// }
|
||||
|
||||
export const speech_say_easy = function (_, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
generator.definitions_['import_speech'] = 'import speech';
|
||||
var text = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
|
||||
var code = "speech.say(" + text + ")\n";
|
||||
return code
|
||||
}
|
||||
|
||||
export const speech_sing_easy = function (_, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
generator.definitions_['import_speech'] = 'import speech';
|
||||
var text = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
|
||||
var code = "speech.sing(" + text + ")\n";
|
||||
return code
|
||||
}
|
||||
|
||||
export const speech_pronounce_easy = function (_, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
generator.definitions_['import_speech'] = 'import speech';
|
||||
var text = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
|
||||
var code = "speech.pronounce(" + text + ")\n";
|
||||
return code
|
||||
}
|
||||
|
||||
export const servo_move = function (_, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
generator.definitions_['import_Servolib'] = 'import Servo';
|
||||
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
|
||||
var value_degree = generator.valueToCode(this, 'DEGREE', generator.ORDER_ATOMIC);
|
||||
if (!isNaN(parseInt(dropdown_pin)))
|
||||
var code = 'Servo.angle(pin' + dropdown_pin + ', ' + value_degree + ')\n';
|
||||
else
|
||||
var code = 'Servo.angle(' + dropdown_pin + ', ' + value_degree + ')\n';
|
||||
return code;
|
||||
}
|
||||
|
||||
export const bit_motor_control = function (_, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
generator.definitions_['import_motor_control'] = 'import motor_control';
|
||||
|
||||
var Motor = this.getFieldValue('Motor');
|
||||
var mode = this.getFieldValue('mode');
|
||||
var speed = generator.valueToCode(this, 'speed', generator.ORDER_ATOMIC);
|
||||
|
||||
var code = 'motor_control.MotorRun(' + Motor + ', ' + mode + '' + speed + ')\n';
|
||||
return code;
|
||||
}
|
||||
|
||||
export const display_rgb_init = function (_, generator) {
|
||||
var dropdown_rgbpin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
|
||||
var value_ledcount = generator.valueToCode(this, 'LEDCOUNT', generator.ORDER_ATOMIC);
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
generator.definitions_['import_neopixel'] = 'import neopixel';
|
||||
// generator.definitions_['include_display'] = '#include "Mixly.h"';
|
||||
generator.setups_['var_rgb_display' + dropdown_rgbpin] = 'np = neopixel.NeoPixel(pin' + dropdown_rgbpin + ', ' + value_ledcount + ')\n';
|
||||
// generator.setups_['setup_rgb_display_begin_' + dropdown_rgbpin] = 'rgb_display_' + dropdown_rgbpin + '.begin();';
|
||||
// generator.setups_['setup_rgb_display_setpin' + dropdown_rgbpin] = 'rgb_display_' + dropdown_rgbpin + '.setPin(' + dropdown_rgbpin + ');';
|
||||
return '';
|
||||
}
|
||||
|
||||
export const display_rgb = function (_, generator) {
|
||||
var value_led = generator.valueToCode(this, '_LED_', generator.ORDER_ATOMIC);
|
||||
var value_rvalue = generator.valueToCode(this, 'RVALUE', generator.ORDER_ATOMIC);
|
||||
var value_gvalue = generator.valueToCode(this, 'GVALUE', generator.ORDER_ATOMIC);
|
||||
var value_bvalue = generator.valueToCode(this, 'BVALUE', generator.ORDER_ATOMIC);
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
generator.definitions_['import_neopixel'] = 'import neopixel';
|
||||
var code = 'np[' + value_led + '] = (' + value_rvalue + ', ' + value_gvalue + ', ' + value_bvalue + ')\n';
|
||||
return code;
|
||||
}
|
||||
|
||||
export const display_rgb2 = function (_, generator) {
|
||||
var value_led = generator.valueToCode(this, '_LED_', generator.ORDER_ATOMIC);
|
||||
var colour_rgb_led_color = this.getFieldValue('RGB_LED_COLOR');
|
||||
var color = colour_rgb_led_color;
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
generator.definitions_['import_neopixel'] = 'import neopixel';
|
||||
var code = 'np[' + value_led + '] = (' + color + ')\n';
|
||||
code += 'np.show()\n';
|
||||
return code;
|
||||
}
|
||||
|
||||
export const display_rgb_show = function (_, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
generator.definitions_['import_neopixel'] = 'import neopixel';
|
||||
var code = 'np.show()\n';
|
||||
return code;
|
||||
}
|
||||
|
||||
export const MP3_INIT = function (_, generator) {
|
||||
var dropdown_pin1 = generator.valueToCode(this, 'RX', generator.ORDER_ATOMIC);
|
||||
var dropdown_pin2 = generator.valueToCode(this, 'TX', generator.ORDER_ATOMIC);
|
||||
if (!isNaN(parseInt(dropdown_pin1)))
|
||||
dropdown_pin1 = "pin" + dropdown_pin1;
|
||||
if (!isNaN(parseInt(dropdown_pin2)))
|
||||
dropdown_pin2 = "pin" + dropdown_pin2;
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
generator.definitions_['import_QJ00X_MP3'] = 'from MP3 import QJ00X_MP3';
|
||||
var code = 'mp3' + ' = ' + 'QJ00X_MP3(mp3_rx=' + dropdown_pin1 + ', mp3_tx=' + dropdown_pin2 + ')\n';
|
||||
return code;
|
||||
}
|
||||
|
||||
// mp3 控制播放
|
||||
export const MP3_CONTROL = function (_, generator) {
|
||||
var CONTROL_TYPE = this.getFieldValue('CONTROL_TYPE');
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
generator.definitions_['import_QJ00X_MP3'] = 'from MP3 import QJ00X_MP3';
|
||||
var code = 'mp3' + '.' + CONTROL_TYPE + '()\n';
|
||||
return code;
|
||||
}
|
||||
|
||||
// mp3 循环模式
|
||||
export const MP3_LOOP_MODE = function (_, generator) {
|
||||
var LOOP_MODE = this.getFieldValue('LOOP_MODE');
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
generator.definitions_['import_QJ00X_MP3'] = 'from MP3 import QJ00X_MP3';
|
||||
var code = 'mp3' + '.set_loop(' + LOOP_MODE + ')\n';
|
||||
return code;
|
||||
}
|
||||
|
||||
// mp3 EQ模式
|
||||
export const MP3_EQ_MODE = function (_, generator) {
|
||||
var EQ_MODE = this.getFieldValue('EQ_MODE');
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
generator.definitions_['import_QJ00X_MP3'] = 'from MP3 import QJ00X_MP3';
|
||||
var code = 'mp3' + '.set_eq(' + EQ_MODE + ')\n';
|
||||
return code;
|
||||
}
|
||||
|
||||
// mp3 设置音量
|
||||
export const MP3_VOL = function (_, generator) {
|
||||
var vol = generator.valueToCode(this, 'vol', generator.ORDER_ATOMIC);
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
generator.definitions_['import_QJ00X_MP3'] = 'from MP3 import QJ00X_MP3';
|
||||
var code = 'mp3' + '.set_vol(' + vol + ')\n';
|
||||
return code;
|
||||
}
|
||||
|
||||
// mp3 播放第N首
|
||||
export const MP3_PLAY_NUM = function (_, generator) {
|
||||
var NUM = generator.valueToCode(this, 'NUM', generator.ORDER_ATOMIC);
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
generator.definitions_['import_QJ00X_MP3'] = 'from MP3 import QJ00X_MP3';
|
||||
var code = 'mp3' + '.playFileByIndexNumber(' + NUM + ')\n';
|
||||
return code;
|
||||
}
|
||||
|
||||
export const MP3_PLAY_FOLDER = function (_, generator) {
|
||||
var FOLDER = generator.valueToCode(this, 'FOLDER', generator.ORDER_ATOMIC);
|
||||
var NUM = generator.valueToCode(this, 'NUM', generator.ORDER_ATOMIC);
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
generator.definitions_['import_QJ00X_MP3'] = 'from MP3 import QJ00X_MP3';
|
||||
var code = 'mp3' + '.set_folder(' + FOLDER + ', ' + NUM + ')\n';
|
||||
return code;
|
||||
}
|
||||
@@ -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,279 @@
|
||||
export const microbit_display_clear = function (_, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
var code = 'display.clear()\n';
|
||||
return code;
|
||||
}
|
||||
|
||||
export const monitor_get_pixel = function (block, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
var value_x = generator.valueToCode(block, 'x', generator.ORDER_ATOMIC);
|
||||
var value_y = generator.valueToCode(block, 'y', generator.ORDER_ATOMIC);
|
||||
var code = 'display.get_pixel(int(' + value_x + '), int(' + value_y + '))';
|
||||
return [code, generator.ORDER_ATOMIC];
|
||||
}
|
||||
|
||||
export const microbit_display_set_pixel = function (block, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
var value_x = generator.valueToCode(block, 'x', generator.ORDER_ATOMIC);
|
||||
var value_y = generator.valueToCode(block, 'y', generator.ORDER_ATOMIC);
|
||||
var value_value = generator.valueToCode(block, 'value', generator.ORDER_ATOMIC);
|
||||
var code = 'display.set_pixel(int(' + value_x + '), int(' + value_y + '), ' + value_value + ')\n';
|
||||
return code;
|
||||
}
|
||||
|
||||
export const monitor_bright_point = function (_, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
var x = generator.valueToCode(this, 'x', generator.ORDER_ASSIGNMENT);
|
||||
var y = generator.valueToCode(this, 'y', generator.ORDER_ASSIGNMENT);
|
||||
var brightness = generator.valueToCode(this, 'brightness', generator.ORDER_ASSIGNMENT);
|
||||
var code = 'display.set_pixel(int(' + x + '), int(' + y + '), ' + brightness + ")\n";
|
||||
return code;
|
||||
}
|
||||
|
||||
export const monitor_show_image_or_string = function (_, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
|
||||
var code = "display.show(" + data + ")\n";
|
||||
return code;
|
||||
}
|
||||
|
||||
export const monitor_scroll_string = function (_, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
|
||||
var code = "display.scroll(" + data + ")\n";
|
||||
return code;
|
||||
}
|
||||
|
||||
export const monitor_scroll_string_with_delay = function (_, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
|
||||
var delay = generator.valueToCode(this, 'delay', generator.ORDER_ASSIGNMENT);
|
||||
var code = "display.scroll(" + data + ", delay=" + delay + ")\n";
|
||||
return code;
|
||||
}
|
||||
|
||||
export const microbit_display_show_image = function (_, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
var value_image = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
|
||||
var code = 'display.show(' + value_image + ')\n';
|
||||
return code;
|
||||
}
|
||||
|
||||
export const microbit_display_show_default_image = function (block, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
var dropdown_image = block.getFieldValue('image');
|
||||
var value_image = 'Image.' + dropdown_image;
|
||||
var code = 'display.show(' + value_image + ')\n';
|
||||
return code;
|
||||
}
|
||||
|
||||
export const microbit_display_show_animation = function (block, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
var value_images = generator.valueToCode(block, 'images', generator.ORDER_ATOMIC);
|
||||
var number_delay = generator.valueToCode(block, 'delay', generator.ORDER_ATOMIC);
|
||||
var checkbox_wait = block.getFieldValue('wait') == 'TRUE' ? 'True' : 'False';
|
||||
var checkbox_loop = block.getFieldValue('loop') == 'TRUE' ? 'True' : 'False';
|
||||
var checkbox_clear = block.getFieldValue('clear') == 'TRUE' ? 'True' : 'False';
|
||||
var code = 'display.show(' + value_images + ', delay=' + number_delay + ', wait=' + checkbox_wait + ', loop=' + checkbox_loop + ', clear=' + checkbox_clear + ')\n';
|
||||
return code;
|
||||
}
|
||||
|
||||
export const microbit_display_scroll = function (block, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
var value_message = generator.valueToCode(block, 'message', generator.ORDER_ATOMIC);
|
||||
var code = 'display.scroll(' + value_message + ')\n';
|
||||
return code;
|
||||
}
|
||||
|
||||
export const microbit_display_on = function (block, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
var mode = block.getFieldValue('on_off');
|
||||
var code = 'display.' + mode + '()\n';
|
||||
return code;
|
||||
}
|
||||
|
||||
// export const microbit_display_off = function(block) {
|
||||
// generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
// var code = 'display.off()\n';
|
||||
// return code;
|
||||
// }
|
||||
|
||||
export const microbit_display_is_on = function (_, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
var code = 'display.is_on()';
|
||||
return [code, generator.ORDER_ATOMIC];
|
||||
}
|
||||
|
||||
export const microbit_image_builtins = function (block, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
var dropdown_image = block.getFieldValue('image');
|
||||
var code = 'Image.' + dropdown_image;
|
||||
return [code, generator.ORDER_ATOMIC];
|
||||
}
|
||||
|
||||
export const microbit_image_copy = function (block, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
var value_image = generator.valueToCode(block, 'image', generator.ORDER_ATOMIC);
|
||||
var code = value_image + '.copy()';
|
||||
return [code, generator.ORDER_ATOMIC];
|
||||
}
|
||||
|
||||
export const microbit_image_invert = function (block, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
var value_image = generator.valueToCode(block, 'image', generator.ORDER_ATOMIC);
|
||||
var code = value_image + '.invert()';
|
||||
return [code, generator.ORDER_ATOMIC];
|
||||
}
|
||||
|
||||
export const microbit_image_create = function (block, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
var colours = {
|
||||
"#000000": "0",
|
||||
"#440000": "1",
|
||||
"#660000": "2",
|
||||
"#880000": "3",
|
||||
"#aa0000": "4",
|
||||
"#bb0000": "5",
|
||||
"#cc0000": "6",
|
||||
"#dd0000": "7",
|
||||
"#ee0000": "8",
|
||||
"#ff0000": "9"
|
||||
}
|
||||
var colour_00 = colours[block.getFieldValue('00')];
|
||||
var colour_01 = colours[block.getFieldValue('01')];
|
||||
var colour_02 = colours[block.getFieldValue('02')];
|
||||
var colour_03 = colours[block.getFieldValue('03')];
|
||||
var colour_04 = colours[block.getFieldValue('04')];
|
||||
var colour_10 = colours[block.getFieldValue('10')];
|
||||
var colour_11 = colours[block.getFieldValue('11')];
|
||||
var colour_12 = colours[block.getFieldValue('12')];
|
||||
var colour_13 = colours[block.getFieldValue('13')];
|
||||
var colour_14 = colours[block.getFieldValue('14')];
|
||||
var colour_20 = colours[block.getFieldValue('20')];
|
||||
var colour_21 = colours[block.getFieldValue('21')];
|
||||
var colour_22 = colours[block.getFieldValue('22')];
|
||||
var colour_23 = colours[block.getFieldValue('23')];
|
||||
var colour_24 = colours[block.getFieldValue('24')];
|
||||
var colour_30 = colours[block.getFieldValue('30')];
|
||||
var colour_31 = colours[block.getFieldValue('31')];
|
||||
var colour_32 = colours[block.getFieldValue('32')];
|
||||
var colour_33 = colours[block.getFieldValue('33')];
|
||||
var colour_34 = colours[block.getFieldValue('34')];
|
||||
var colour_40 = colours[block.getFieldValue('40')];
|
||||
var colour_41 = colours[block.getFieldValue('41')];
|
||||
var colour_42 = colours[block.getFieldValue('42')];
|
||||
var colour_43 = colours[block.getFieldValue('43')];
|
||||
var colour_44 = colours[block.getFieldValue('44')];
|
||||
var code = 'Image("' + colour_00 + colour_01 + colour_02 + colour_03 + colour_04 + ':' + colour_10 + colour_11 + colour_12 + colour_13 + colour_14 + ':' + colour_20 + colour_21 + colour_22 + colour_23 + colour_24 + ':' + colour_30 + colour_31 + colour_32 + colour_33 + colour_34 + ':' + colour_40 + colour_41 + colour_42 + colour_43 + colour_44 + '")';
|
||||
return [code, generator.ORDER_ATOMIC];
|
||||
}
|
||||
|
||||
|
||||
export const image_shift = function (block, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
var op = block.getFieldValue("OP");
|
||||
var image = generator.valueToCode(block, 'img', generator.ORDER_ATOMIC);
|
||||
var value = generator.valueToCode(block, 'val', generator.ORDER_ATOMIC);
|
||||
var code = image + '.shift_' + op + '(' + value + ')';
|
||||
return [code, generator.ORDER_ATOMIC];
|
||||
}
|
||||
|
||||
export const image_arithmetic = function (block, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
var op = block.getFieldValue("OP");
|
||||
var imga = generator.valueToCode(block, 'A', generator.ORDER_ATOMIC);
|
||||
var imgb = generator.valueToCode(block, 'B', generator.ORDER_ATOMIC);
|
||||
if (op == 'INTERSECTION') {
|
||||
var code = imga + '-(' + imga + '-' + imgb + ')';
|
||||
} else {
|
||||
var code = imga + op + imgb;
|
||||
}
|
||||
return [code, generator.ORDER_ATOMIC];
|
||||
}
|
||||
|
||||
export const microbit_display_scroll_string_animation = function (block, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
var value_images = generator.valueToCode(block, 'images', generator.ORDER_ATOMIC) || 'hello';
|
||||
var number_delay = generator.valueToCode(block, 'delay', generator.ORDER_ATOMIC);
|
||||
var checkbox_wait = block.getFieldValue('wait') == 'TRUE' ? 'True' : 'False';
|
||||
var checkbox_loop = block.getFieldValue('loop') == 'TRUE' ? 'True' : 'False';
|
||||
var checkbox_clear = block.getFieldValue('clear') == 'TRUE' ? 'True' : 'False';
|
||||
var code = 'display.scroll' + '(' + value_images + ', delay=' + number_delay + ', wait=' + checkbox_wait + ', loop=' + checkbox_loop + ', clear=' + checkbox_clear + ')\n';
|
||||
return code;
|
||||
}
|
||||
|
||||
// export const microbit_display_scroll_string = function(block) {
|
||||
// generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
// var value_images = generator.valueToCode(block, 'images', generator.ORDER_MEMBER) || 'hello';
|
||||
// var number_delay = generator.valueToCode(block, 'delay', generator.ORDER_ATOMIC);
|
||||
// var checkbox_wait = block.getFieldValue('wait') == 'TRUE' ? 'True' : 'False';
|
||||
// var checkbox_loop = block.getFieldValue('loop') == 'TRUE' ? 'True' : 'False';
|
||||
// var checkbox_clear = block.getFieldValue('clear') == 'TRUE' ? 'True' : 'False';
|
||||
// var code = 'display.show(' + value_images + ', delay=' + number_delay + ', wait=' + checkbox_wait + ', loop=' + checkbox_loop + ', clear=' + checkbox_clear + ')\n';
|
||||
// return code;
|
||||
// }
|
||||
|
||||
export const group_lcd_print = function (_, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
generator.definitions_['import_lcd1602'] = 'import lcd1602';
|
||||
var str1 = generator.valueToCode(this, 'TEXT', generator.ORDER_ASSIGNMENT);
|
||||
var str2 = generator.valueToCode(this, 'TEXT2', generator.ORDER_ASSIGNMENT);
|
||||
//generator.setups_['class_LCD1602'] = generator.CLASS_LCD1602_INIT;//python.js
|
||||
var code = 'mylcd.mixly_puts_two_lines(' + str1 + ', ' + str2 + ')\n';
|
||||
return code;
|
||||
}
|
||||
|
||||
export const group_lcd_init = function (_, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
generator.definitions_['import_lcd1602'] = 'import lcd1602';
|
||||
var device = generator.valueToCode(this, 'device', generator.ORDER_ASSIGNMENT) || '0x27';
|
||||
//generator.setups_['class_LCD1602'] = generator.CLASS_LCD1602_INIT;//python.js
|
||||
return 'mylcd = lcd1602.LCD1602(' + device + ')\n';
|
||||
}
|
||||
|
||||
export const group_lcd_print2 = function (_, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
generator.definitions_['import_lcd1602'] = 'import lcd1602';
|
||||
var str = generator.valueToCode(this, 'TEXT', generator.ORDER_ASSIGNMENT) || 'String("")';
|
||||
var row = generator.valueToCode(this, 'row', generator.ORDER_ASSIGNMENT) || '1';
|
||||
var column = generator.valueToCode(this, 'column', generator.ORDER_ASSIGNMENT) || '1';
|
||||
//generator.setups_['class_LCD1602'] = generator.CLASS_LCD1602_INIT;//python.js
|
||||
var code = 'mylcd.mixly_puts(' + str + ', ' + column + ', ' + row + ')\n'
|
||||
return code;
|
||||
}
|
||||
|
||||
export const group_lcd_power = function (_, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
generator.definitions_['import_lcd1602'] = 'import lcd1602';
|
||||
var dropdown_stat = this.getFieldValue('STAT');
|
||||
var code = 'mylcd.' + dropdown_stat + '\n';
|
||||
return code;
|
||||
}
|
||||
|
||||
export const lp2i_u8g_draw_4strings = function (_, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
generator.definitions_['import_oled'] = 'import oled';
|
||||
var value_text_line1 = generator.valueToCode(this, 'Text_line1', generator.ORDER_ASSIGNMENT) || '\'\'';
|
||||
var value_text_line2 = generator.valueToCode(this, 'Text_line2', generator.ORDER_ASSIGNMENT) || '\'\'';
|
||||
var value_text_line3 = generator.valueToCode(this, 'Text_line3', generator.ORDER_ASSIGNMENT) || '\'\'';
|
||||
var value_text_line4 = generator.valueToCode(this, 'Text_line4', generator.ORDER_ASSIGNMENT) || '\'\'';
|
||||
//generator.setups_["class_OLED12864_I2C"] = generator.CLASS_OLED12864_I2C_INIT;
|
||||
return 'mixly_oled_text(' + value_text_line1 + ', ' + value_text_line2 + ', ' + value_text_line3 + ', ' + value_text_line4 + ')\n';
|
||||
}
|
||||
|
||||
export const display_image_size = function (_, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
var data = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
|
||||
var size = this.getFieldValue('OP');
|
||||
var code = ["Image." + size + "(" + data + ")", generator.ORDER_ATOMIC];
|
||||
return code;
|
||||
}
|
||||
|
||||
export const display_fill = function (_, generator) {
|
||||
var varName = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
generator.definitions_['import_oled'] = 'import oled';
|
||||
var key = this.getFieldValue('key');
|
||||
var code = varName + '.show_fill(' + key + ')\n';
|
||||
return code;
|
||||
}
|
||||
@@ -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,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,304 @@
|
||||
export const sensor_button_is_pressed = function (_, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
var btn = generator.valueToCode(this, 'btn', generator.ORDER_ATOMIC);
|
||||
var code = btn + '.is_pressed()';
|
||||
return [code, generator.ORDER_ATOMIC];
|
||||
}
|
||||
|
||||
export const sensor_button_was_pressed = function (_, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
var btn = generator.valueToCode(this, 'btn', generator.ORDER_ATOMIC);
|
||||
var code = btn + '.was_pressed()';
|
||||
return [code, generator.ORDER_ATOMIC];
|
||||
}
|
||||
|
||||
export const sensor_button_get_presses = function (_, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
var btn = generator.valueToCode(this, 'btn', generator.ORDER_ATOMIC);
|
||||
var code = btn + '.get_presses()';
|
||||
return [code, generator.ORDER_ATOMIC];
|
||||
}
|
||||
|
||||
export const controls_GestureLists = function (_, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
var gesture = this.getFieldValue('gesture');
|
||||
// generator.definitions_['func_gesture' + gesture] = code;
|
||||
return ['"' + gesture + '"', generator.ORDER_ATOMIC];
|
||||
}
|
||||
|
||||
export const controls_attachGestureInterrupt = function (_, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
var gesture = this.getFieldValue('gesture');
|
||||
var branch = generator.statementToCode(this, 'DO');
|
||||
var d = branch || generator.PASS;
|
||||
var code = 'if accelerometer.is_gesture("' + gesture + '"):\n' + d;
|
||||
// generator.definitions_['func_gesture' + gesture] = code;
|
||||
return code;
|
||||
}
|
||||
|
||||
export const sensor_current_gesture1 = function (_, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
var gesture = this.getFieldValue('gesture');
|
||||
|
||||
var code = 'accelerometer.is_gesture("' + gesture + '")';
|
||||
return [code, generator.ORDER_ATOMIC];
|
||||
}
|
||||
|
||||
export const sensor_current_gesture2 = function (_, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
var gesture = this.getFieldValue('gesture');
|
||||
|
||||
var code = 'accelerometer.was_gesture("' + gesture + '")';
|
||||
return [code, generator.ORDER_ATOMIC];
|
||||
}
|
||||
|
||||
export const controls_attachGestureInterrupt2 = function (_, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
var gesture = this.getFieldValue('gesture');
|
||||
var branch = generator.statementToCode(this, 'DO');
|
||||
var d = branch || generator.PASS;
|
||||
var code = 'if accelerometer.was_gesture("' + gesture + '"):\n' + d;
|
||||
// generator.definitions_['func_gesture' + gesture] = code;
|
||||
return code;
|
||||
}
|
||||
|
||||
export const sensor_get_gestures = function (_, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
var gesture = this.getFieldValue('GES');
|
||||
var a;
|
||||
if (gesture == 'all') {
|
||||
a = 'accelerometer.get_gestures()';
|
||||
}
|
||||
else if (gesture == 'current') {
|
||||
a = 'accelerometer.current_gesture()';
|
||||
}
|
||||
return [a, generator.ORDER_ATOMIC];
|
||||
}
|
||||
|
||||
export const sensor_current_gesture = function (_, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
return ['accelerometer.current_gesture()', generator.ORDER_ATOMIC];
|
||||
}
|
||||
|
||||
export const sensor_get_acceleration = function (_, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
var key = this.getFieldValue('key')
|
||||
var code = 'accelerometer.get_' + key + '()';
|
||||
return [code, generator.ORDER_ATOMIC];
|
||||
}
|
||||
|
||||
export const sensor_set_acceleration = function () {
|
||||
var key = this.getFieldValue('key')
|
||||
var code = 'input.setAccelerometerRange(' + key + ')\n';
|
||||
return code;
|
||||
}
|
||||
|
||||
// undefined?!?!?!?!
|
||||
export const sensor_light_level = function (_, generator) {
|
||||
return ['input.lightLevel()', generator.ORDER_ATOMIC];
|
||||
}
|
||||
|
||||
export const sensor_calibrate_compass = function (_, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
return 'compass.calibrate()\n';
|
||||
}
|
||||
|
||||
export const sensor_is_compass_calibrated = function (_, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
return ['compass.is_calibrated()', generator.ORDER_ATOMIC];
|
||||
}
|
||||
|
||||
export const sensor_compass_heading = function (_, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
return ['compass.heading()', generator.ORDER_ATOMIC];
|
||||
}
|
||||
|
||||
export const sensor_temperature = function (_, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
return ['temperature()', generator.ORDER_ATOMIC];
|
||||
}
|
||||
|
||||
export const sensor_field_strength = function (_, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
var compass = this.getFieldValue('compass');
|
||||
var code = 'compass.' + compass + '()'
|
||||
return [code, generator.ORDER_ATOMIC];
|
||||
}
|
||||
|
||||
export const sensor_rotation = function (_, generator) {
|
||||
var key = this.getFieldValue('key')
|
||||
var code = 'input.rotation(' + key + ')';
|
||||
return [code, generator.ORDER_ATOMIC];
|
||||
}
|
||||
|
||||
export const sensor_magnetic = function (_, generator) {
|
||||
var key = this.getFieldValue('key')
|
||||
var code = 'input.magneticForce(' + key + ')';
|
||||
return [code, generator.ORDER_ATOMIC];
|
||||
}
|
||||
|
||||
export const sensor_distance_hrsc04 = function (_, generator) {
|
||||
var Trig = this.getFieldValue('Trig');
|
||||
var Echo = this.getFieldValue('Echo');
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
generator.definitions_['import_ultrasonic'] = 'import ultrasonic';
|
||||
return ['ultrasonic.distance_cm(t_pin=pin' + Trig + ', e_pin=pin' + Echo + ')', generator.ORDER_ATOMIC];
|
||||
}
|
||||
|
||||
export const sensor_distance_hrsc04_ = function (_, generator) {
|
||||
var Trig = this.getFieldValue('Trig');
|
||||
var Echo = this.getFieldValue('Echo');
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
generator.setups_['class_hrsc04_'] =
|
||||
'class HCSR04:\n' +
|
||||
' def __init__(self, tpin=pin' + Trig + ', epin=pin' + Echo + ', spin=pin13):\n' +
|
||||
' self.trigger_pin = tpin\n' +
|
||||
' self.echo_pin = epin\n' +
|
||||
' self.sclk_pin = spin\n' +
|
||||
'\n' +
|
||||
' def distance_mm(self):\n' +
|
||||
' spi.init(baudrate=125000, sclk=self.sclk_pin,\n' +
|
||||
' mosi=self.trigger_pin, miso=self.echo_pin)\n' +
|
||||
' pre = 0\n' +
|
||||
' post = 0\n' +
|
||||
' k = -1\n' +
|
||||
' length = 500\n' +
|
||||
' resp = bytearray(length)\n' +
|
||||
' resp[0] = 0xFF\n' +
|
||||
' spi.write_readinto(resp, resp)\n' +
|
||||
' # find first non zero value\n' +
|
||||
' try:\n' +
|
||||
' i, value = next((ind, v) for ind, v in enumerate(resp) if v)\n' +
|
||||
' except StopIteration:\n' +
|
||||
' i = -1\n' +
|
||||
' if i > 0:\n' +
|
||||
' pre = bin(value).count("1")\n' +
|
||||
' # find first non full high value afterwards\n' +
|
||||
' try:\n' +
|
||||
' k, value = next((ind, v)\n' +
|
||||
' for ind, v in enumerate(resp[i:length - 2]) if resp[i + ind + 1] == 0)\n' +
|
||||
' post = bin(value).count("1") if k else 0\n' +
|
||||
' k = k + i\n' +
|
||||
' except StopIteration:\n' +
|
||||
' i = -1\n' +
|
||||
' dist= -1 if i < 0 else round((pre + (k - i) * 8. + post) * 8 * 0.172)\n' +
|
||||
' return dist\n' +
|
||||
'\n' +
|
||||
' def distance_cm(self):\n' +
|
||||
' return self.distance_mm() / 10.0\n' +
|
||||
'\n' +
|
||||
'sonar=HCSR04()\n' +
|
||||
'\n'
|
||||
return ['sonar.distance_cm()', generator.ORDER_ATOMIC];
|
||||
}
|
||||
|
||||
export const DS1307_init = function (_, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
generator.definitions_['import_RTC'] = 'from RTC import *';
|
||||
//var RTCName = this.getFieldValue('RTCName');
|
||||
//generator.definitions_['include_Mixly'] = '#include "Mixly.h"';
|
||||
//generator.setups_['class_DS1307'] = generator.CLASS_DS1307_INIT;
|
||||
//generator.definitions_['DS1307'+RTCName] = 'DS1307 ' + RTCName + '('+SDA+','+SCL+');';
|
||||
//return 'DS1307' + '('+SDA+','+SCL+')\n';
|
||||
}
|
||||
|
||||
export const RTC_get_time = function (_, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
generator.definitions_['import_RTC'] = 'from RTC import *';
|
||||
//var RTCName = this.getFieldValue('RTCName');
|
||||
var timeType = this.getFieldValue('TIME_TYPE');
|
||||
//generator.setups_['class_DS1307'] = generator.CLASS_DS1307_INIT;
|
||||
|
||||
switch (timeType) {
|
||||
//
|
||||
case "Year":
|
||||
var code = 'ds.' + timeType + '()';
|
||||
return [code, generator.ORDER_ASSIGNMENT];
|
||||
case "Month":
|
||||
var code = 'ds.' + timeType + '()';
|
||||
return [code, generator.ORDER_ASSIGNMENT];
|
||||
case "Day":
|
||||
var code = 'ds.' + timeType + '()';
|
||||
return [code, generator.ORDER_ASSIGNMENT];
|
||||
case "Hour":
|
||||
var code = 'ds.' + timeType + '()';
|
||||
return [code, generator.ORDER_ASSIGNMENT];
|
||||
case "Minute":
|
||||
var code = 'ds.' + timeType + '()';
|
||||
return [code, generator.ORDER_ASSIGNMENT];
|
||||
case "Second":
|
||||
var code = 'ds.' + timeType + '()';
|
||||
return [code, generator.ORDER_ASSIGNMENT];
|
||||
case "Week":
|
||||
var code = 'ds.' + timeType + '()';
|
||||
return [code, generator.ORDER_ASSIGNMENT];
|
||||
case "Mix1":
|
||||
var code = 'ds.get_date()';
|
||||
return [code, generator.ORDER_ASSIGNMENT];
|
||||
case "Mix2":
|
||||
var code = 'ds.get_time()';
|
||||
return [code, generator.ORDER_ASSIGNMENT];
|
||||
}
|
||||
}
|
||||
|
||||
export const RTC_set_time = function (_, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
generator.definitions_['import_RTC'] = 'from RTC import *';
|
||||
//var RTCName = this.getFieldValue('RTCName');
|
||||
var hour = generator.valueToCode(this, "hour", generator.ORDER_ASSIGNMENT);
|
||||
var minute = generator.valueToCode(this, "minute", generator.ORDER_ASSIGNMENT);
|
||||
var second = generator.valueToCode(this, "second", generator.ORDER_ASSIGNMENT);
|
||||
//generator.setups_['class_DS1307'] = generator.CLASS_DS1307_INIT;
|
||||
|
||||
var code = 'ds.set_time(' + hour + ', ' + minute + ', ' + second + ')\n';
|
||||
return code;
|
||||
}
|
||||
|
||||
export const RTC_set_date = function (_, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
generator.definitions_['import_RTC'] = 'from RTC import *';
|
||||
//var RTCName = this.getFieldValue('RTCName');
|
||||
var year = generator.valueToCode(this, "year", generator.ORDER_ASSIGNMENT);
|
||||
var month = generator.valueToCode(this, "month", generator.ORDER_ASSIGNMENT);
|
||||
var day = generator.valueToCode(this, "day", generator.ORDER_ASSIGNMENT);
|
||||
//generator.setups_['class_DS1307'] = generator.CLASS_DS1307_INIT;
|
||||
var code = 'ds.set_date(' + year + ', ' + month + ', ' + day + ')\n';
|
||||
return code;
|
||||
}
|
||||
|
||||
export const sensor_compass_reset = function (_, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
return 'compass.clear_calibration()\n';
|
||||
}
|
||||
|
||||
export const sensor_light = function (_, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
return ['display.read_light_level()', generator.ORDER_ATOMIC];
|
||||
}
|
||||
|
||||
export const sensor_hrsc04_init = function (_, generator) {
|
||||
var Trig = this.getFieldValue('Trig');
|
||||
var Echo = this.getFieldValue('Echo');
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
generator.definitions_['import_ultrasonic'] = 'from ultrasonic import *';
|
||||
return "sonar = HCSR04(tpin=pin" + Trig + ", epin=pin" + Echo + ")\n"
|
||||
}
|
||||
|
||||
export const TCS34725_Get_RGB = function (_, generator) {
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
generator.definitions_['import_TCS'] = 'from TCS import *';
|
||||
|
||||
var RGB = this.getFieldValue('TCS34725_COLOR');
|
||||
return ["tcs.getRawRGBData(" + RGB + ")", generator.ORDER_ATOMIC];
|
||||
}
|
||||
|
||||
export const NTC_TEMP = function (_, generator) {
|
||||
var PIN = this.getFieldValue('PIN');
|
||||
var NominalResistance = generator.valueToCode(this, 'NominalResistance', generator.ORDER_ATOMIC);
|
||||
var betaCoefficient = generator.valueToCode(this, 'betaCoefficient', generator.ORDER_ATOMIC);
|
||||
var seriesResistor = generator.valueToCode(this, 'seriesResistor', generator.ORDER_ATOMIC);
|
||||
generator.definitions_['import_microbit_*'] = 'from microbit import *';
|
||||
generator.definitions_['import_ntc'] = 'import ntc';
|
||||
var code = 'ntc.read(pin' + PIN + ', ' + NominalResistance + ', ' + betaCoefficient + ', ' + seriesResistor + ')';
|
||||
return [code, generator.ORDER_ATOMIC];
|
||||
}
|
||||
@@ -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];
|
||||
}
|
||||
119
boards/default_src/micropython_nrf51822_microbit/index.js
Normal file
119
boards/default_src/micropython_nrf51822_microbit/index.js
Normal file
@@ -0,0 +1,119 @@
|
||||
import * as Blockly from 'blockly/core';
|
||||
import { Profile } from 'mixly';
|
||||
|
||||
import {
|
||||
PythonVariablesBlocks,
|
||||
PythonControlBlocks,
|
||||
PythonMathBlocks,
|
||||
PythonTextBlocks,
|
||||
PythonListsBlocks,
|
||||
PythonDictsBlocks,
|
||||
PythonLogicBlocks,
|
||||
PythonStorageBlocks,
|
||||
PythonProceduresBlocks,
|
||||
PythonTupleBlocks,
|
||||
PythonSetBlocks,
|
||||
PythonHtmlBlocks,
|
||||
PythonUtilityBlocks,
|
||||
PythonVariablesGenerators,
|
||||
PythonControlGenerators,
|
||||
PythonMathGenerators,
|
||||
PythonTextGenerators,
|
||||
PythonListsGenerators,
|
||||
PythonDictsGenerators,
|
||||
PythonLogicGenerators,
|
||||
PythonStorageGenerators,
|
||||
PythonProceduresGenerators,
|
||||
PythonTupleGenerators,
|
||||
PythonSetGenerators,
|
||||
PythonHtmlGenerators,
|
||||
PythonUtilityGenerators,
|
||||
Procedures,
|
||||
Variables,
|
||||
Python
|
||||
} from '@mixly/python';
|
||||
|
||||
import {
|
||||
MicropythonNRF51822MicrobitPins,
|
||||
MicropythonNRF51822MicrobitActuatorBlocks,
|
||||
MicropythonNRF51822MicrobitCommunicateBlocks,
|
||||
MicropythonNRF51822MicrobitDisplayBlocks,
|
||||
MicropythonNRF51822MicrobitFactoryBlocks,
|
||||
MicropythonNRF51822MicrobitInoutBlocks,
|
||||
MicropythonNRF51822MicrobitPinsBlocks,
|
||||
MicropythonNRF51822MicrobitSensorBlocks,
|
||||
MicropythonNRF51822MicrobitSerialBlocks,
|
||||
MicropythonNRF51822MicrobitSystemBlocks,
|
||||
MicropythonNRF51822MicrobitActuatorGenerators,
|
||||
MicropythonNRF51822MicrobitCommunicateGenerators,
|
||||
MicropythonNRF51822MicrobitDisplayGenerators,
|
||||
MicropythonNRF51822MicrobitFactoryGenerators,
|
||||
MicropythonNRF51822MicrobitInoutGenerators,
|
||||
MicropythonNRF51822MicrobitPinsGenerators,
|
||||
MicropythonNRF51822MicrobitSensorGenerators,
|
||||
MicropythonNRF51822MicrobitSerialGenerators,
|
||||
MicropythonNRF51822MicrobitSystemGenerators
|
||||
} from './';
|
||||
|
||||
import './css/color_microbit_python_advance.css';
|
||||
|
||||
Object.assign(Blockly.Variables, Variables);
|
||||
Object.assign(Blockly.Procedures, Procedures);
|
||||
Blockly.Python = Python;
|
||||
Blockly.generator = Python;
|
||||
|
||||
Profile.default = {};
|
||||
Object.assign(Profile, MicropythonNRF51822MicrobitPins);
|
||||
Object.assign(Profile.default, MicropythonNRF51822MicrobitPins['microbit']);
|
||||
|
||||
Object.assign(
|
||||
Blockly.Blocks,
|
||||
PythonVariablesBlocks,
|
||||
PythonControlBlocks,
|
||||
PythonMathBlocks,
|
||||
PythonTextBlocks,
|
||||
PythonListsBlocks,
|
||||
PythonDictsBlocks,
|
||||
PythonLogicBlocks,
|
||||
PythonStorageBlocks,
|
||||
PythonProceduresBlocks,
|
||||
PythonTupleBlocks,
|
||||
PythonSetBlocks,
|
||||
PythonHtmlBlocks,
|
||||
PythonUtilityBlocks,
|
||||
MicropythonNRF51822MicrobitActuatorBlocks,
|
||||
MicropythonNRF51822MicrobitCommunicateBlocks,
|
||||
MicropythonNRF51822MicrobitDisplayBlocks,
|
||||
MicropythonNRF51822MicrobitFactoryBlocks,
|
||||
MicropythonNRF51822MicrobitInoutBlocks,
|
||||
MicropythonNRF51822MicrobitPinsBlocks,
|
||||
MicropythonNRF51822MicrobitSensorBlocks,
|
||||
MicropythonNRF51822MicrobitSerialBlocks,
|
||||
MicropythonNRF51822MicrobitSystemBlocks
|
||||
);
|
||||
|
||||
Object.assign(
|
||||
Blockly.Python.forBlock,
|
||||
PythonVariablesGenerators,
|
||||
PythonControlGenerators,
|
||||
PythonMathGenerators,
|
||||
PythonTextGenerators,
|
||||
PythonListsGenerators,
|
||||
PythonDictsGenerators,
|
||||
PythonLogicGenerators,
|
||||
PythonStorageGenerators,
|
||||
PythonProceduresGenerators,
|
||||
PythonTupleGenerators,
|
||||
PythonSetGenerators,
|
||||
PythonHtmlGenerators,
|
||||
PythonUtilityGenerators,
|
||||
MicropythonNRF51822MicrobitActuatorGenerators,
|
||||
MicropythonNRF51822MicrobitCommunicateGenerators,
|
||||
MicropythonNRF51822MicrobitDisplayGenerators,
|
||||
MicropythonNRF51822MicrobitFactoryGenerators,
|
||||
MicropythonNRF51822MicrobitInoutGenerators,
|
||||
MicropythonNRF51822MicrobitPinsGenerators,
|
||||
MicropythonNRF51822MicrobitSensorGenerators,
|
||||
MicropythonNRF51822MicrobitSerialGenerators,
|
||||
MicropythonNRF51822MicrobitSystemGenerators
|
||||
);
|
||||
@@ -0,0 +1,72 @@
|
||||
from microbit import *
|
||||
|
||||
class QJ00X_MP3:
|
||||
def __init__(self, mp3_rx=pin2, mp3_tx=pin16, volume=0x16, mode=0x01):
|
||||
uart.init(rx=mp3_rx, tx=mp3_tx, baudrate=9600)
|
||||
self.set_eq(1)
|
||||
self.set_vol(volume)
|
||||
self.set_mode(mode)
|
||||
self.pause()
|
||||
|
||||
def _send_cmd(self, length, cmd, data_high=None, data_low=None):
|
||||
uart.write(b'\x7E')
|
||||
uart.write(bytes([length]))
|
||||
uart.write(bytes([cmd]))
|
||||
if data_high != None:
|
||||
uart.write(bytes([data_high]))
|
||||
if data_low != None:
|
||||
uart.write(bytes([data_low]))
|
||||
uart.write(b'\xEF')
|
||||
sleep(200)
|
||||
|
||||
#下一曲
|
||||
def next_track(self):
|
||||
self._send_cmd(0x02, 0x03)
|
||||
|
||||
#上一曲
|
||||
def prev_track(self):
|
||||
self._send_cmd(0x02, 0x04)
|
||||
|
||||
#选择曲目
|
||||
def sel_track(self, track_index):
|
||||
self._send_cmd(0x03, track_index)
|
||||
|
||||
#音量+
|
||||
def inc_vol(self):
|
||||
self._send_cmd(0x02, 0x05)
|
||||
|
||||
#音量-
|
||||
def dec_vol(self):
|
||||
self._send_cmd(0x02, 0x06)
|
||||
|
||||
#设置音量
|
||||
def set_vol(self, volume):
|
||||
self._send_cmd(0x03, 0x31, data_high=volume)
|
||||
|
||||
#设置音效
|
||||
def set_eq(self, equalizer):
|
||||
self._send_cmd(0x03, 0x32, data_high=equalizer)
|
||||
|
||||
#设置播放设备
|
||||
def set_mode(self, mode):
|
||||
self._send_cmd(0x03, 0x35, data_high=mode)
|
||||
|
||||
#播放
|
||||
def play(self):
|
||||
self._send_cmd(0x02, 0x01)
|
||||
|
||||
#终止播放
|
||||
def pause(self):
|
||||
self._send_cmd(0x02, 0x02)
|
||||
|
||||
#设置文件夹播放
|
||||
def set_folder(self, folder_index, music_index):
|
||||
self._send_cmd(0x04, 0x42, data_high=folder_index, data_low=music_index)
|
||||
|
||||
#设置曲目播放
|
||||
def playFileByIndexNumber(self, music_index):
|
||||
self._send_cmd(0x04, 0x41, data_high=0x00, data_low=music_index)
|
||||
|
||||
#设置循环
|
||||
def set_loop(self, mode):
|
||||
self._send_cmd(0x03, 0x33, data_high=mode)
|
||||
@@ -0,0 +1,128 @@
|
||||
from microbit import *
|
||||
|
||||
DS1307_I2C_ADDRESS = (104)
|
||||
DS1307_REG_SECOND = (0)
|
||||
DS1307_REG_MINUTE = (1)
|
||||
DS1307_REG_HOUR = (2)
|
||||
DS1307_REG_WEEKDAY = (3)
|
||||
DS1307_REG_DAY = (4)
|
||||
DS1307_REG_MONTH = (5)
|
||||
DS1307_REG_YEAR = (6)
|
||||
DS1307_REG_CTRL = (7)
|
||||
DS1307_REG_RAM = (8)
|
||||
class DS1307():
|
||||
# set reg
|
||||
def setReg(self, reg, dat):
|
||||
i2c.write(DS1307_I2C_ADDRESS, bytearray([reg, dat]))
|
||||
|
||||
# get reg
|
||||
def getReg(self, reg):
|
||||
i2c.write(DS1307_I2C_ADDRESS, bytearray([reg]))
|
||||
t = i2c.read(DS1307_I2C_ADDRESS, 1)
|
||||
return t[0]
|
||||
|
||||
def start(self):
|
||||
t = self.getReg(DS1307_REG_SECOND)
|
||||
self.setReg(DS1307_REG_SECOND, t&0x7F)
|
||||
|
||||
def stop(self):
|
||||
t = self.getReg(DS1307_REG_SECOND)
|
||||
self.setReg(DS1307_REG_SECOND, t|0x80)
|
||||
|
||||
def DecToHex(self, dat):
|
||||
return (dat//10) * 16 + (dat%10)
|
||||
|
||||
def HexToDec(self, dat):
|
||||
return (dat//16) * 10 + (dat%16)
|
||||
|
||||
def DateTime(self, DT=None):
|
||||
if DT == None:
|
||||
i2c.write(DS1307_I2C_ADDRESS, bytearray([0]))
|
||||
buf = i2c.read(DS1307_I2C_ADDRESS, 7)
|
||||
DT = [0] * 8
|
||||
DT[0] = self.HexToDec(buf[6]) + 2000
|
||||
DT[1] = self.HexToDec(buf[5])
|
||||
DT[2] = self.HexToDec(buf[4])
|
||||
DT[3] = self.HexToDec(buf[3])
|
||||
DT[4] = self.HexToDec(buf[2])
|
||||
DT[5] = self.HexToDec(buf[1])
|
||||
DT[6] = self.HexToDec(buf[0])
|
||||
DT[7] = 0
|
||||
return DT
|
||||
else:
|
||||
buf = bytearray(8)
|
||||
buf[0] = 0
|
||||
buf[1] = self.DecToHex(DT[6]%60) # second
|
||||
buf[2] = self.DecToHex(DT[5]%60) # minute
|
||||
buf[3] = self.DecToHex(DT[4]%24) # hour
|
||||
buf[4] = self.DecToHex(DT[3]%8) # week day
|
||||
buf[5] = self.DecToHex(DT[2]%32) # date
|
||||
buf[6] = self.DecToHex(DT[1]%13) # month
|
||||
buf[7] = self.DecToHex(DT[0]%100) # year
|
||||
i2c.write(DS1307_I2C_ADDRESS, buf)
|
||||
|
||||
def Year(self, year = None):
|
||||
if year == None:
|
||||
return self.HexToDec(self.getReg(DS1307_REG_YEAR)) + 2000
|
||||
else:
|
||||
self.setReg(DS1307_REG_YEAR, self.DecToHex(year%100))
|
||||
|
||||
def Month(self, month = None):
|
||||
if month == None:
|
||||
return self.HexToDec(self.getReg(DS1307_REG_MONTH))
|
||||
else:
|
||||
self.setReg(DS1307_REG_MONTH, self.DecToHex(month%13))
|
||||
|
||||
def Day(self, day = None):
|
||||
if day == None:
|
||||
return self.HexToDec(self.getReg(DS1307_REG_DAY))
|
||||
else:
|
||||
self.setReg(DS1307_REG_DAY, self.DecToHex(day%32))
|
||||
|
||||
def Weekday(self, weekday = None):
|
||||
if weekday == None:
|
||||
return self.HexToDec(self.getReg(DS1307_REG_WEEKDAY))
|
||||
else:
|
||||
self.setReg(DS1307_REG_WEEKDAY, self.DecToHex(weekday%8))
|
||||
|
||||
def Hour(self, hour = None):
|
||||
if hour == None:
|
||||
return self.HexToDec(self.getReg(DS1307_REG_HOUR))
|
||||
else:
|
||||
self.setReg(DS1307_REG_HOUR, self.DecToHex(hour%24))
|
||||
|
||||
def Minute(self, minute = None):
|
||||
if minute == None:
|
||||
return self.HexToDec(self.getReg(DS1307_REG_MINUTE))
|
||||
else:
|
||||
self.setReg(DS1307_REG_MINUTE, self.DecToHex(minute%60))
|
||||
|
||||
def Second(self, second = None):
|
||||
if second == None:
|
||||
return self.HexToDec(self.getReg(DS1307_REG_SECOND))
|
||||
else:
|
||||
self.setReg(DS1307_REG_SECOND, self.DecToHex(second%60))
|
||||
|
||||
def ram(self, reg, dat = None):
|
||||
if dat == None:
|
||||
return self.getReg(DS1307_REG_RAM + (reg%56))
|
||||
else:
|
||||
self.setReg(DS1307_REG_RAM + (reg%56), dat)
|
||||
|
||||
def get_time(self):
|
||||
return self.Hour() + self.Minute() + self.Second()
|
||||
|
||||
def get_date(self):
|
||||
return self.Year() + self.Month() + self.Day()
|
||||
|
||||
def set_time(self, hour, minute, second):
|
||||
self.Hour(hour)
|
||||
self.Minute(minute)
|
||||
self.Second(second)
|
||||
|
||||
def set_date(self, year, month, day):
|
||||
self.Year(year)
|
||||
self.Month(month)
|
||||
self.Day(day)
|
||||
|
||||
ds = DS1307()
|
||||
@@ -0,0 +1,6 @@
|
||||
from microbit import *
|
||||
|
||||
def angle(pin, angle):
|
||||
pin.set_analog_period(round((1/50) * 1000))
|
||||
duty = 26 + (angle * 102) / 180
|
||||
pin.write_analog(duty)
|
||||
@@ -0,0 +1,148 @@
|
||||
from microbit import *
|
||||
|
||||
class TCS34725():
|
||||
|
||||
TCS34725_ADDRESS = 0x29
|
||||
|
||||
TCS34725_COMMAND_BIT = 0x80
|
||||
|
||||
TCS34725_ENABLE = 0x00
|
||||
TCS34725_ENABLE_AIEN = 0x10 # RGBC Interrupt Enable
|
||||
TCS34725_ENABLE_WEN = 0x08 # Wait enable - Writing 1 activates the wait timer
|
||||
TCS34725_ENABLE_AEN = 0x02 # RGBC Enable - Writing 1 actives the ADC, 0 disables it
|
||||
TCS34725_ENABLE_PON = 0x01 # Power on - Writing 1 activates the internal oscillator, 0 disables it
|
||||
TCS34725_ATIME = 0x01 # Integration time
|
||||
TCS34725_WTIME = 0x03 # Wait time (if TCS34725_ENABLE_WEN is asserted
|
||||
TCS34725_WTIME_2_4MS = 0xFF # WLONG0 = 2.4ms WLONG1 = 0.029s
|
||||
TCS34725_WTIME_204MS = 0xAB # WLONG0 = 204ms WLONG1 = 2.45s
|
||||
TCS34725_WTIME_614MS = 0x00 # WLONG0 = 614ms WLONG1 = 7.4s
|
||||
TCS34725_AILTL = 0x04 # Clear channel lower interrupt threshold
|
||||
TCS34725_AILTH = 0x05
|
||||
TCS34725_AIHTL = 0x06 # Clear channel upper interrupt threshold
|
||||
TCS34725_AIHTH = 0x07
|
||||
TCS34725_PERS = 0x0C # Persistence register - basic SW filtering mechanism for interrupts
|
||||
TCS34725_PERS_NONE = 0b0000 # Every RGBC cycle generates an interrupt
|
||||
TCS34725_PERS_1_CYCLE = 0b0001 # 1 clean channel value outside threshold range generates an interrupt
|
||||
TCS34725_PERS_2_CYCLE = 0b0010 # 2 clean channel values outside threshold range generates an interrupt
|
||||
TCS34725_PERS_3_CYCLE = 0b0011 # 3 clean channel values outside threshold range generates an interrupt
|
||||
TCS34725_PERS_5_CYCLE = 0b0100 # 5 clean channel values outside threshold range generates an interrupt
|
||||
TCS34725_PERS_10_CYCLE = 0b0101 # 10 clean channel values outside threshold range generates an interrupt
|
||||
TCS34725_PERS_15_CYCLE = 0b0110 # 15 clean channel values outside threshold range generates an interrupt
|
||||
TCS34725_PERS_20_CYCLE = 0b0111 # 20 clean channel values outside threshold range generates an interrupt
|
||||
TCS34725_PERS_25_CYCLE = 0b1000 # 25 clean channel values outside threshold range generates an interrupt
|
||||
TCS34725_PERS_30_CYCLE = 0b1001 # 30 clean channel values outside threshold range generates an interrupt
|
||||
TCS34725_PERS_35_CYCLE = 0b1010 # 35 clean channel values outside threshold range generates an interrupt
|
||||
TCS34725_PERS_40_CYCLE = 0b1011 # 40 clean channel values outside threshold range generates an interrupt
|
||||
TCS34725_PERS_45_CYCLE = 0b1100 # 45 clean channel values outside threshold range generates an interrupt
|
||||
TCS34725_PERS_50_CYCLE = 0b1101 # 50 clean channel values outside threshold range generates an interrupt
|
||||
TCS34725_PERS_55_CYCLE = 0b1110 # 55 clean channel values outside threshold range generates an interrupt
|
||||
TCS34725_PERS_60_CYCLE = 0b1111 # 60 clean channel values outside threshold range generates an interrupt
|
||||
TCS34725_CONFIG = 0x0D
|
||||
TCS34725_CONFIG_WLONG = 0x02 # Choose between short and long (12x wait times via TCS34725_WTIME
|
||||
TCS34725_CONTROL = 0x0F # Set the gain level for the sensor
|
||||
TCS34725_ID = 0x12 # 0x44 = TCS34721/TCS34725, 0x4D = TCS34723/TCS34727
|
||||
TCS34725_STATUS = 0x13
|
||||
TCS34725_STATUS_AINT = 0x10 # RGBC Clean channel interrupt
|
||||
TCS34725_STATUS_AVALID = 0x01 # Indicates that the RGBC channels have completed an integration cycle
|
||||
TCS34725_CDATAL = 0x14 # Clear channel data
|
||||
TCS34725_CDATAH = 0x15
|
||||
TCS34725_RDATAL = 0x16 # Red channel data
|
||||
TCS34725_RDATAH = 0x17
|
||||
TCS34725_GDATAL = 0x18 # Green channel data
|
||||
TCS34725_GDATAH = 0x19
|
||||
TCS34725_BDATAL = 0x1A # Blue channel data
|
||||
TCS34725_BDATAH = 0x1B
|
||||
|
||||
# TCS34725_INTEGRATIONTIME_2_4MS = 0xFF, /**< 2.4ms - 1 cycle - Max Count: 1024
|
||||
# TCS34725_INTEGRATIONTIME_24MS = 0xF6, /**< 24ms - 10 cycles - Max Count: 10240
|
||||
# TCS34725_INTEGRATIONTIME_50MS = 0xEB, /**< 50ms - 20 cycles - Max Count: 20480
|
||||
# TCS34725_INTEGRATIONTIME_101MS = 0xD5, /**< 101ms - 42 cycles - Max Count: 43008
|
||||
# TCS34725_INTEGRATIONTIME_154MS = 0xC0, /**< 154ms - 64 cycles - Max Count: 65535
|
||||
# TCS34725_INTEGRATIONTIME_700MS = 0x00 /**< 700ms - 256 cycles - Max Count: 65535
|
||||
|
||||
_tcs34725Initialised = False
|
||||
_tcs34725Gain = 0
|
||||
_tcs34725IntegrationTime = 0x00
|
||||
|
||||
def __init__(self, i2c):
|
||||
self.i2c = i2c
|
||||
#pass
|
||||
|
||||
def write8(self, reg, val):
|
||||
self.i2c.write(self.TCS34725_ADDRESS, bytearray([self.TCS34725_COMMAND_BIT | reg, val & 0xFF]))
|
||||
|
||||
def read16(self, reg):
|
||||
self.i2c.write(self.TCS34725_ADDRESS, bytearray([self.TCS34725_COMMAND_BIT | reg]))
|
||||
list_bytes = self.i2c.read(self.TCS34725_ADDRESS, 2)
|
||||
bytes = list_bytes[1]<<8 | list_bytes[0]
|
||||
#return [ hex(x) for x in bytes ][0]
|
||||
return bytes
|
||||
|
||||
def read8(self, reg):
|
||||
self.i2c.write(self.TCS34725_ADDRESS, bytearray([self.TCS34725_COMMAND_BIT | reg]))
|
||||
return i2c.read(self.TCS34725_ADDRESS, 1)[0] - 0
|
||||
|
||||
def begin(self):
|
||||
x = self.read8(self.TCS34725_ID)
|
||||
#print(x)
|
||||
if x != 68: # code I was basing this on expects 0x44, not sure why. Got 0x12
|
||||
print('did not get the expected response from sensor: ', x)
|
||||
return False
|
||||
self._tcs34725Initialised = True
|
||||
self.setIntegrationTime(self._tcs34725IntegrationTime)
|
||||
self.setGain(0)
|
||||
self.enable()
|
||||
return True
|
||||
|
||||
def setIntegrationTime(self, theTime):
|
||||
if theTime not in [0xFF,0xF6,0xEB,0xD5,0xC0,0x00]:
|
||||
print('setting integration time to 0x00, %s is illegal' % theTime)
|
||||
theTime = 0x00
|
||||
self.write8(self.TCS34725_ATIME, theTime)
|
||||
# self.i2c.write8(self.TCS34725_ATIME, theTime)
|
||||
self._tcs34725IntegrationTime = theTime
|
||||
|
||||
def setGain(self, gain):
|
||||
# TCS34725_GAIN_1X = 0x00, /**< No gain
|
||||
# TCS34725_GAIN_4X = 0x01, /**< 2x gain
|
||||
# TCS34725_GAIN_16X = 0x02, /**< 16x gain
|
||||
# TCS34725_GAIN_60X = 0x03 /**< 60x gain
|
||||
if gain not in [0,1,2,3]:
|
||||
print('setting gain to 0, %s is illegal' % gain)
|
||||
gain = 0
|
||||
self.write8(self.TCS34725_CONTROL, gain)
|
||||
self._tcs34725Gain = gain
|
||||
|
||||
def enable(self):
|
||||
self.write8(self.TCS34725_ENABLE, self.TCS34725_ENABLE_PON)
|
||||
sleep(0.003)
|
||||
self.write8(self.TCS34725_ENABLE, (self.TCS34725_ENABLE_PON | self.TCS34725_ENABLE_AEN))
|
||||
|
||||
def getRawRGBData(self, type):
|
||||
if not self._tcs34725Initialised:
|
||||
self.begin()
|
||||
r = self.read16(self.TCS34725_RDATAL)
|
||||
g = self.read16(self.TCS34725_GDATAL)
|
||||
b = self.read16(self.TCS34725_BDATAL)
|
||||
if self._tcs34725IntegrationTime == 0xFF:
|
||||
sleep(0.0024)
|
||||
elif self._tcs34725IntegrationTime == 0xF6:
|
||||
sleep(0.024)
|
||||
elif self._tcs34725IntegrationTime == 0xEB:
|
||||
sleep(0.050)
|
||||
elif self._tcs34725IntegrationTime == 0xD5:
|
||||
sleep(0.101)
|
||||
elif self._tcs34725IntegrationTime == 0xC0:
|
||||
sleep(0.154)
|
||||
elif self._tcs34725IntegrationTime == 0x00:
|
||||
sleep(0.700)
|
||||
else:
|
||||
sleep(0.700)
|
||||
if type == 0:
|
||||
return r
|
||||
elif type == 1:
|
||||
return g
|
||||
else:
|
||||
return b
|
||||
|
||||
tcs = TCS34725(i2c)
|
||||
@@ -0,0 +1,86 @@
|
||||
from microbit import *
|
||||
|
||||
class LCD1602():
|
||||
def __init__(self, lcd_i2c_addr):
|
||||
self.buf = bytearray(1)
|
||||
self.BK = 0x08
|
||||
self.RS = 0x00
|
||||
self.E = 0x04
|
||||
self.setcmd(0x33)
|
||||
sleep(5)
|
||||
self.send(0x30)
|
||||
sleep(5)
|
||||
self.send(0x20)
|
||||
sleep(5)
|
||||
self.setcmd(0x28)
|
||||
self.setcmd(0x0C)
|
||||
self.setcmd(0x06)
|
||||
self.setcmd(0x01)
|
||||
self.version='1.0'
|
||||
self.lcd_i2c_addr=lcd_i2c_addr
|
||||
|
||||
def setReg(self, dat):
|
||||
self.buf[0] = dat
|
||||
i2c.write(self.lcd_i2c_addr, self.buf)
|
||||
sleep(1)
|
||||
|
||||
def send(self, dat):
|
||||
d=dat&0xF0
|
||||
d|=self.BK
|
||||
d|=self.RS
|
||||
self.setReg(d)
|
||||
self.setReg(d|0x04)
|
||||
self.setReg(d)
|
||||
|
||||
def setcmd(self, cmd):
|
||||
self.RS=0
|
||||
self.send(cmd)
|
||||
self.send(cmd<<4)
|
||||
|
||||
def setdat(self, dat):
|
||||
self.RS=1
|
||||
self.send(dat)
|
||||
self.send(dat<<4)
|
||||
|
||||
def clear(self):
|
||||
self.setcmd(1)
|
||||
|
||||
def backlight(self, on):
|
||||
if on:
|
||||
self.BK=0x08
|
||||
else:
|
||||
self.BK=0
|
||||
self.setdat(0)
|
||||
|
||||
def on(self):
|
||||
self.setcmd(0x0C)
|
||||
|
||||
def off(self):
|
||||
self.setcmd(0x08)
|
||||
|
||||
def char(self, ch, x=-1, y=0):
|
||||
if x>=0:
|
||||
a=0x80
|
||||
if y>0:
|
||||
a=0xC0
|
||||
a+=x
|
||||
self.setcmd(a)
|
||||
self.setdat(ch)
|
||||
|
||||
def puts(self, s, x=0, y=0):
|
||||
if len(s)>0:
|
||||
self.char(ord(s[0]),x,y)
|
||||
for i in range(1, len(s)):
|
||||
self.char(ord(s[i]))
|
||||
|
||||
def mixly_puts(self, s, x=1, y=1):
|
||||
s = str(s)
|
||||
x = x - 1
|
||||
y = y - 1
|
||||
self.puts(self, s, x, y)
|
||||
|
||||
def mixly_puts_two_lines(self, line1, line2):
|
||||
line1 = str(line1)
|
||||
line2 = str(line2)
|
||||
self.puts(self, line1, 0, 0)
|
||||
self.puts(self, line2, 0, 1)
|
||||
@@ -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,65 @@
|
||||
from microbit import *
|
||||
|
||||
def initPCA9685():
|
||||
i2c.write(0x40, bytearray([0x00, 0x00]))
|
||||
setFreq(50)
|
||||
for idx in range(0, 16, 1):
|
||||
setPwm(idx, 0 ,0)
|
||||
def MotorRun(Motors, speed):
|
||||
speed = speed * 16
|
||||
if (speed >= 4096):
|
||||
speed = 4095
|
||||
if (speed <= -4096):
|
||||
speed = -4095
|
||||
if (Motors <= 4 and Motors > 0):
|
||||
pp = (Motors - 1) * 2
|
||||
pn = (Motors - 1) * 2 + 1
|
||||
if (speed >= 0):
|
||||
setPwm(pp, 0, speed)
|
||||
setPwm(pn, 0, 0)
|
||||
else :
|
||||
setPwm(pp, 0, 0)
|
||||
setPwm(pn, 0, -speed)
|
||||
def Servo(Servos, degree):
|
||||
v_us = (degree * 1800 / 180 + 600)
|
||||
value = int(v_us * 4096 / 20000)
|
||||
setPwm(Servos + 7, 0, value)
|
||||
def setFreq(freq):
|
||||
prescaleval = int(25000000/(4096*freq)) - 1
|
||||
i2c.write(0x40, bytearray([0x00]))
|
||||
oldmode = i2c.read(0x40, 1)
|
||||
newmode = (oldmode[0] & 0x7F) | 0x10
|
||||
i2c.write(0x40, bytearray([0x00, newmode]))
|
||||
i2c.write(0x40, bytearray([0xfe, prescaleval]))
|
||||
i2c.write(0x40, bytearray([0x00, oldmode[0]]))
|
||||
sleep(4)
|
||||
i2c.write(0x40, bytearray([0x00, oldmode[0] | 0xa1]))
|
||||
def setPwm(channel, on, off):
|
||||
if (channel >= 0 and channel <= 15):
|
||||
buf = bytearray([0X06 + 4 * channel, on & 0xff, (on >> 8) & 0xff, off & 0xff, (off >> 8) & 0xff])
|
||||
i2c.write(0x40, buf)
|
||||
def setStepper(stpMotors, dir, speed):
|
||||
spd = speed
|
||||
setFreq(spd)
|
||||
if (stpMotors == 1):
|
||||
if (dir):
|
||||
setPwm(0, 2047, 4095)
|
||||
setPwm(1, 1, 2047)
|
||||
setPwm(2, 1023, 3071)
|
||||
setPwm(3, 3071, 1023)
|
||||
else:
|
||||
setPwm(3, 2047, 4095)
|
||||
setPwm(2, 1, 2047)
|
||||
setPwm(1, 1023, 3071)
|
||||
setPwm(0, 3071, 1023)
|
||||
elif (stpMotors == 2):
|
||||
if (dir):
|
||||
setPwm(4, 2047, 4095)
|
||||
setPwm(5, 1, 2047)
|
||||
setPwm(6, 1023, 3071)
|
||||
setPwm(7, 3071, 1023)
|
||||
else:
|
||||
setPwm(7, 2047, 4095)
|
||||
setPwm(6, 1, 2047)
|
||||
setPwm(4, 1023, 3071)
|
||||
setPwm(5, 3071, 1023)
|
||||
@@ -0,0 +1,27 @@
|
||||
from microbit import *
|
||||
import math
|
||||
|
||||
_VOLTAGE_POWER = 5
|
||||
_RS = 10
|
||||
_B = 3950
|
||||
_T1 = 273.15 + 25
|
||||
_R1 = 100
|
||||
|
||||
def read(pin, r1, b, rs):
|
||||
r1 = r1 / 1000
|
||||
rs = rs / 1000
|
||||
|
||||
# print("rs:" + str(rs))
|
||||
|
||||
_analogValue = pin.read_analog()
|
||||
_voltageValue = (_analogValue / 1545) * _VOLTAGE_POWER
|
||||
|
||||
# print("voltageValue:" + str(_voltageValue))
|
||||
|
||||
_rt = ((_VOLTAGE_POWER - _voltageValue) * rs) / _voltageValue
|
||||
|
||||
# print("rt:" + str(_rt))
|
||||
|
||||
_tempValue = (((_T1 * b) / (b + _T1 * math.log(_rt / r1))) - 273.15)
|
||||
|
||||
return _tempValue
|
||||
@@ -0,0 +1,105 @@
|
||||
from microbit import *
|
||||
|
||||
class OLED12864_I2C():
|
||||
def __init__(self):
|
||||
cmd = [
|
||||
[0xAE], # SSD1306_DISPLAYOFF
|
||||
[0xA4], # SSD1306_DISPLAYALLON_RESUME
|
||||
[0xD5, 0xF0], # SSD1306_SETDISPLAYCLOCKDIV
|
||||
[0xA8, 0x3F], # SSD1306_SETMULTIPLEX
|
||||
[0xD3, 0x00], # SSD1306_SETDISPLAYOFFSET
|
||||
[0 | 0x0], # line #SSD1306_SETSTARTLINE
|
||||
[0x8D, 0x14], # SSD1306_CHARGEPUMP
|
||||
[0x20, 0x00], # SSD1306_MEMORYMODE
|
||||
[0x21, 0, 127], # SSD1306_COLUMNADDR
|
||||
[0x22, 0, 63], # SSD1306_PAGEADDR
|
||||
[0xa0 | 0x1], # SSD1306_SEGREMAP
|
||||
[0xc8], # SSD1306_COMSCANDEC
|
||||
[0xDA, 0x12], # SSD1306_SETCOMPINS
|
||||
[0x81, 0xCF], # SSD1306_SETCONTRAST
|
||||
[0xd9, 0xF1], # SSD1306_SETPRECHARGE
|
||||
[0xDB, 0x40], # SSD1306_SETVCOMDETECT
|
||||
[0xA6], # SSD1306_NORMALDISPLAY
|
||||
[0xd6, 1], # zoom on
|
||||
[0xaf] # SSD1306_DISPLAYON
|
||||
]
|
||||
|
||||
for c in cmd:
|
||||
self.command(c)
|
||||
self._ZOOM = 1
|
||||
self.ADDR = 0x3C
|
||||
self.screen = bytearray(1025) # send byte plus pixels
|
||||
self.screen[0] = 0x40
|
||||
|
||||
def command(self, c):
|
||||
i2c.write(self.ADDR, b'·' + bytearray(c))
|
||||
|
||||
def set_pos(self, col=0, page=0):
|
||||
self.command([0xb0 | page]) # page number
|
||||
# take upper and lower value of col * 2
|
||||
c = col * (self._ZOOM+1)
|
||||
c1, c2 = c & 0x0F, c >> 4
|
||||
self.command([0x00 | c1]) # lower start column address
|
||||
self.command([0x10 | c2]) # upper start column address
|
||||
|
||||
def pixel(self, x, y, color=1, draw=1):
|
||||
page, shift_page = divmod(y, 8)
|
||||
ind = x * (self._ZOOM+1) + page * 128 + 1
|
||||
b = self.screen[ind] | (1 << shift_page) if color else self.screen[ind] & ~ (1 << shift_page)
|
||||
self.screen[ind] = b
|
||||
self.set_pos(x, page)
|
||||
if self._ZOOM:
|
||||
self.screen[ind+1]=b
|
||||
i2c.write(0x3c, bytearray([0x40, b, b]))
|
||||
else:
|
||||
i2c.write(0x3c, bytearray([0x40, b]))
|
||||
|
||||
def zoom(self, d=1):
|
||||
self._ZOOM = 1 if d else 0
|
||||
self.command([0xd6, self._ZOOM])
|
||||
|
||||
def invert(self, v=1):
|
||||
n = 0xa7 if v else 0xa6
|
||||
self.command([n])
|
||||
|
||||
def clear(self, c=0):
|
||||
for i in range(1, 1025):
|
||||
self.screen[i] = 0
|
||||
self.draw()
|
||||
|
||||
def draw(self):
|
||||
self.set_pos()
|
||||
i2c.write(self.ADDR, self.screen)
|
||||
|
||||
def text(self, x, y, s, draw=1):
|
||||
for i in range(0, min(len(s), 12 - x)):
|
||||
for c in range(0, 5):
|
||||
col = 0
|
||||
for r in range(1, 6):
|
||||
p = Image(s[i]).get_pixel(c, r - 1)
|
||||
col = col | (1 << r) if (p != 0) else col
|
||||
ind = (x + i) * 5 * (self._ZOOM+1) + y * 128 + c*(self._ZOOM+1) + 1
|
||||
self.screen[ind] = col
|
||||
if self._ZOOM:
|
||||
self.screen[ind + 1] = col
|
||||
self.set_pos(x * 5, y)
|
||||
ind0 = x * 5 * (self._ZOOM+1) + y * 128 + 1
|
||||
i2c.write(self.ADDR, b'@' + self.screen[ind0:ind + 1])
|
||||
|
||||
def hline(self, x, y, l,c=1):
|
||||
d = 1 if l>0 else -1
|
||||
for i in range(x, x+l, d):
|
||||
self.pixel(i,y,c)
|
||||
|
||||
def vline(self, x, y, l,c=1):
|
||||
d = 1 if l>0 else -1
|
||||
for i in range(y, y+l,d):
|
||||
self.pixel(x,i,c,0)
|
||||
|
||||
def rect(self, x1,y1,x2,y2,c=1):
|
||||
self.hline(x1,y1,x2-x1+1,c)
|
||||
self.hline(x1,y2,x2-x1+1,c)
|
||||
self.vline(x1,y1,y2-y1+1,c)
|
||||
self.vline(x2,y1,y2-y1+1,c)
|
||||
|
||||
oled = OLED12864_I2C()
|
||||
@@ -0,0 +1,5 @@
|
||||
from microbit import *
|
||||
|
||||
def show(object, led, r, g, b):
|
||||
object[led] = (r, g, b)
|
||||
object.show()
|
||||
@@ -0,0 +1,32 @@
|
||||
from microbit import *
|
||||
|
||||
def distance_mm(tpin=pin16, epin=pin15):
|
||||
spi.init(baudrate=125000, sclk=pin13,
|
||||
mosi=tpin, miso=epin)
|
||||
pre = 0
|
||||
post = 0
|
||||
k = -1
|
||||
length = 500
|
||||
resp = bytearray(length)
|
||||
resp[0] = 0xFF
|
||||
spi.write_readinto(resp, resp)
|
||||
# find first non zero value
|
||||
try:
|
||||
i, value = next((ind, v) for ind, v in enumerate(resp) if v)
|
||||
except StopIteration:
|
||||
i = -1
|
||||
if i > 0:
|
||||
pre = bin(value).count("1")
|
||||
# find first non full high value afterwards
|
||||
try:
|
||||
k, value = next((ind, v)
|
||||
for ind, v in enumerate(resp[i:length - 2]) if resp[i + ind + 1] == 0)
|
||||
post = bin(value).count("1") if k else 0
|
||||
k = k + i
|
||||
except StopIteration:
|
||||
i = -1
|
||||
dist= -1 if i < 0 else round((pre + (k - i) * 8. + post) * 8 * 0.172)
|
||||
return dist
|
||||
|
||||
def distance_cm(t_pin=pin16, e_pin=pin15):
|
||||
return distance_mm(tpin=t_pin, epin=e_pin) / 10.0
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,65 @@
|
||||
{
|
||||
"board": {
|
||||
"micro:bit v1": "micropython:nrf51822:v1",
|
||||
"micro:bit v2": "micropython:nrf51822:v2"
|
||||
},
|
||||
"language": "MicroPython",
|
||||
"burn": {
|
||||
"type": "volume",
|
||||
"volumeName": "MICROBIT",
|
||||
"micropython:nrf51822:v1": {
|
||||
"filePath": "{indexPath}/build/microbit-micropython-v1.hex"
|
||||
},
|
||||
"micropython:nrf51822:v2": {
|
||||
"filePath": "{indexPath}/build/microbit-micropython-v2.hex"
|
||||
}
|
||||
},
|
||||
"upload": {
|
||||
"type": "command",
|
||||
"portSelect": [
|
||||
{
|
||||
"vendorId": "0D28",
|
||||
"productId": "0204"
|
||||
}
|
||||
],
|
||||
"libPath": [
|
||||
"{indexPath}/build/lib"
|
||||
],
|
||||
"command": "\"{ampy}\" -p {com} -d 1 -r \"{reset}\" put \"{indexPath}/build/upload\"",
|
||||
"filePath": "{indexPath}/build/upload/main.py",
|
||||
"copyLib": true,
|
||||
"reset": []
|
||||
},
|
||||
"nav": {
|
||||
"burn": true,
|
||||
"upload": true,
|
||||
"save": {
|
||||
"py": true
|
||||
},
|
||||
"setting": {
|
||||
"pythonToBlockly": true
|
||||
}
|
||||
},
|
||||
"serial": {
|
||||
"ctrlCBtn": true,
|
||||
"ctrlDBtn": true,
|
||||
"baudRates": 115200,
|
||||
"yMax": 100,
|
||||
"yMin": 0,
|
||||
"pointNum": 100,
|
||||
"rts": true,
|
||||
"dtr": true
|
||||
},
|
||||
"pythonToBlockly": false,
|
||||
"web": {
|
||||
"com": "usb",
|
||||
"burn": {
|
||||
"micropython:nrf51822:v1": {
|
||||
"filePath": "./build/microbit-micropython-v1-lib.hex"
|
||||
},
|
||||
"micropython:nrf51822:v2": {
|
||||
"filePath": "./build/microbit-micropython-v2-lib.hex"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
{}
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 72 KiB |
@@ -0,0 +1,29 @@
|
||||
{
|
||||
"name": "@mixly/micropython-nrf51822-microbit",
|
||||
"version": "1.2.0",
|
||||
"description": "适用于mixly的micropython nrf51822 microbit模块",
|
||||
"scripts": {
|
||||
"build:dev": "webpack --config=webpack.dev.js",
|
||||
"build:prod": "webpack --config=webpack.prod.js"
|
||||
},
|
||||
"main": "./export.js",
|
||||
"author": "Mixly Team",
|
||||
"keywords": [
|
||||
"mixly",
|
||||
"mixly-plugin",
|
||||
"micropython-nrf51822-microbit"
|
||||
],
|
||||
"homepage": "https://gitee.com/mixly2/mixly2.0_src/tree/develop/boards/default_src/micropython_nrf51822_microbit",
|
||||
"bugs": {
|
||||
"url": "https://gitee.com/mixly2/mixly2.0_src/issues"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://gitee.com/mixly2/mixly2.0_src.git",
|
||||
"directory": "default_src/micropython_nrf51822_microbit"
|
||||
},
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
"license": "Apache 2.0"
|
||||
}
|
||||
1893
boards/default_src/micropython_nrf51822_microbit/template.xml
Normal file
1893
boards/default_src/micropython_nrf51822_microbit/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