2024-05-27 14:00:31 +00:00
|
|
|
|
// Color Picker : ビルトインのブロックがウチの環境でどうもうまく働かないので自作
|
|
|
|
|
registerFieldColour();
|
|
|
|
|
Blockly.defineBlocksWithJsonArray([
|
|
|
|
|
{
|
|
|
|
|
type: 'colour_picker',
|
|
|
|
|
message0: '%1',
|
|
|
|
|
"output": "Colour",
|
|
|
|
|
"tooltip": "パレットから色を選んでください",
|
|
|
|
|
"helpUrl": "",
|
|
|
|
|
"style": "colour_blocks",
|
|
|
|
|
args0: [
|
|
|
|
|
{
|
|
|
|
|
type: 'field_colour',
|
|
|
|
|
name: 'COLOUR',
|
|
|
|
|
colour: '#ff0000',
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
]);
|
|
|
|
|
javascript.javascriptGenerator.forBlock['colour_picker'] = function (block, generator) {
|
|
|
|
|
const code = generator.quote_(block.getFieldValue('COLOUR'));
|
|
|
|
|
return [code, Blockly.JavaScript.ORDER_ATOMIC];
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Blockly.defineBlocksWithJsonArray([
|
|
|
|
|
{
|
|
|
|
|
type: 'coupycolor_picker',
|
|
|
|
|
message0: 'クーピー30色: %1',
|
|
|
|
|
"output": "Colour",
|
|
|
|
|
"tooltip": "サクラクーピーペンシル30色のカラーチャートによる",
|
|
|
|
|
"helpUrl": "https://www.craypas.co.jp/products/painting-school/013/0031/182945.html#color-chart",
|
|
|
|
|
"style": "colour_blocks",
|
|
|
|
|
args0: [
|
|
|
|
|
{
|
|
|
|
|
type: 'field_colour',
|
|
|
|
|
name: 'COLOUR',
|
|
|
|
|
colour: '#E281A0',
|
|
|
|
|
colourOptions: [
|
|
|
|
|
'#F5ED68',
|
|
|
|
|
'#F6E92B',
|
|
|
|
|
'#EEB818',
|
|
|
|
|
'#EA9D13',
|
|
|
|
|
'#F2C198',
|
|
|
|
|
'#FBF5C5',
|
|
|
|
|
'#7E422A',
|
|
|
|
|
'#B8591F',
|
|
|
|
|
'#CD9711',
|
|
|
|
|
'#4F371D',
|
|
|
|
|
'#D83A2F',
|
|
|
|
|
'#D61242',
|
|
|
|
|
'#E281A0',
|
|
|
|
|
'#A41759',
|
|
|
|
|
'#E0BED6',
|
|
|
|
|
'#1D2973',
|
|
|
|
|
'#1794CE',
|
|
|
|
|
'#0FA275',
|
|
|
|
|
'#8ABC29',
|
|
|
|
|
'#0C834D',
|
|
|
|
|
'#0C834D',
|
|
|
|
|
'#0A68AE',
|
|
|
|
|
'#096CB0',
|
|
|
|
|
'#0F3460',
|
|
|
|
|
'#9CA5A4',
|
|
|
|
|
'#277565',
|
|
|
|
|
'#3F3939',
|
|
|
|
|
'#FFFFFF',
|
|
|
|
|
'#AE901E',
|
|
|
|
|
'#A5AEB3',
|
|
|
|
|
],
|
|
|
|
|
colourTitles: [
|
|
|
|
|
'レモンいろ',
|
|
|
|
|
'きいろ',
|
|
|
|
|
'やまぶきいろ',
|
|
|
|
|
'だいだいいろ',
|
|
|
|
|
'うすだいだい',
|
|
|
|
|
'たまごいろ',
|
|
|
|
|
'ちゃいろ',
|
|
|
|
|
'あかちゃいろ',
|
|
|
|
|
'おうどいろ',
|
|
|
|
|
'こげちゃいろ',
|
|
|
|
|
'しゅいろ',
|
|
|
|
|
'あか',
|
|
|
|
|
'ももいろ',
|
|
|
|
|
'あかむらさき',
|
|
|
|
|
'うすむらさき',
|
|
|
|
|
'むらさき',
|
|
|
|
|
'みずいろ',
|
|
|
|
|
'エメラルドいろ',
|
|
|
|
|
'きみどり',
|
|
|
|
|
'みどり',
|
|
|
|
|
'ふかみどり',
|
|
|
|
|
'あお',
|
|
|
|
|
'ぐんじょういろ',
|
|
|
|
|
'あいいろ',
|
|
|
|
|
'ねずみいろ',
|
|
|
|
|
'はいみどり',
|
|
|
|
|
'くろ',
|
|
|
|
|
'しろ',
|
|
|
|
|
'きんいろ',
|
|
|
|
|
'ぎんいろ',
|
|
|
|
|
],
|
|
|
|
|
columns: 5,
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
]);
|
|
|
|
|
javascript.javascriptGenerator.forBlock['coupycolor_picker'] = function (block, generator) {
|
|
|
|
|
const code = generator.quote_(block.getFieldValue('COLOUR'));
|
|
|
|
|
return [code, Blockly.JavaScript.ORDER_ATOMIC];
|
|
|
|
|
};
|
2020-01-21 07:10:10 +00:00
|
|
|
|
|
2021-09-07 12:18:50 +00:00
|
|
|
|
/** Additional Basic Blocks********************************************************************************* */
|
2023-06-25 12:18:33 +00:00
|
|
|
|
Blockly.defineBlocksWithJsonArray([{
|
|
|
|
|
"type": "oc_text_to_number",
|
|
|
|
|
"message0": "%1 を整数に変換",
|
|
|
|
|
"args0": [
|
|
|
|
|
{
|
|
|
|
|
"type": "input_value",
|
|
|
|
|
"name": "text",
|
|
|
|
|
"check": "String"
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"inputsInline": true,
|
|
|
|
|
"output": null,
|
|
|
|
|
"tooltip": "数字のテキストを整数に変換します。数字以外の文字が含まれているとエラーになります。",
|
|
|
|
|
"helpUrl": "",
|
|
|
|
|
"style": "math_blocks"
|
|
|
|
|
}]);
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['oc_text_to_number'] = function (block, generator) {
|
2023-06-25 12:18:33 +00:00
|
|
|
|
var value_text = Blockly.JavaScript.valueToCode(block, 'text', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var code = `Number(${value_text})`;
|
|
|
|
|
return [code, Blockly.JavaScript.ORDER_NONE];
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
python.pythonGenerator.forBlock['oc_text_to_number'] = function (block, generator) {
|
2023-06-25 12:18:33 +00:00
|
|
|
|
var value_text = Blockly.Python.valueToCode(block, 'text', Blockly.Python.ORDER_ATOMIC);
|
|
|
|
|
var code = `int(${value_text})`;
|
|
|
|
|
return [code, Blockly.Python.ORDER_NONE];
|
|
|
|
|
};
|
|
|
|
|
|
2021-09-09 14:38:25 +00:00
|
|
|
|
var ugjCodecharDefinition = {
|
|
|
|
|
"type": "ugj_codechar",
|
|
|
|
|
"message0": "%{BKY_UGJ_CODECHAR_TITLE}",
|
|
|
|
|
"args0": [
|
|
|
|
|
{
|
|
|
|
|
"type": "input_value",
|
|
|
|
|
"name": "code",
|
|
|
|
|
"check": "Number"
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"inputsInline": true,
|
|
|
|
|
"output": "String",
|
|
|
|
|
"tooltip": "%{BKY_UGJ_CODECHAR_TOOLTIP}",
|
|
|
|
|
"helpUrl": "",
|
|
|
|
|
"style": "text_blocks"
|
|
|
|
|
};
|
|
|
|
|
Blockly.Blocks['ugj_codechar'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.jsonInit(ugjCodecharDefinition);
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_codechar'] = function (block, generator) {
|
2021-09-09 14:38:25 +00:00
|
|
|
|
var value_code = Blockly.JavaScript.valueToCode(block, 'code', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var code = `String.fromCharCode(${value_code})`;
|
|
|
|
|
return [code, Blockly.JavaScript.ORDER_NONE];
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
python.pythonGenerator.forBlock['ugj_codechar'] = function (block, generator) {
|
2021-09-09 14:38:25 +00:00
|
|
|
|
var value_code = Blockly.Python.valueToCode(block, 'code', Blockly.Python.ORDER_ATOMIC);
|
|
|
|
|
var code = `chr(${value_code})`;
|
|
|
|
|
return [code, Blockly.Python.ORDER_NONE];
|
|
|
|
|
};
|
|
|
|
|
|
2021-09-07 12:18:50 +00:00
|
|
|
|
var ugjCharcodeDefinition = {
|
|
|
|
|
"type": "ugj_charcode",
|
|
|
|
|
"message0": "%{BKY_UGJ_CHARCODE_TITLE}",
|
|
|
|
|
"args0": [
|
|
|
|
|
{
|
|
|
|
|
"type": "input_value",
|
|
|
|
|
"name": "char",
|
|
|
|
|
"check": "String"
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"inputsInline": true,
|
|
|
|
|
"output": "Number",
|
|
|
|
|
"tooltip": "%{BKY_UGJ_CHARCODE_TOOLTIP}",
|
|
|
|
|
"helpUrl": "",
|
|
|
|
|
"style": "text_blocks"
|
|
|
|
|
};
|
|
|
|
|
Blockly.Blocks['ugj_charcode'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.jsonInit(ugjCharcodeDefinition);
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_charcode'] = function (block, generator) {
|
2021-09-07 12:18:50 +00:00
|
|
|
|
var value_char = Blockly.JavaScript.valueToCode(block, 'char', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var code = `${value_char}.charCodeAt(0)`;
|
|
|
|
|
return [code, Blockly.JavaScript.ORDER_NONE];
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
python.pythonGenerator.forBlock['ugj_charcode'] = function (block, generator) {
|
2021-09-07 12:18:50 +00:00
|
|
|
|
var value_char = Blockly.Python.valueToCode(block, 'char', Blockly.Python.ORDER_ATOMIC);
|
|
|
|
|
var code = `ord(${value_char})`;
|
|
|
|
|
return [code, Blockly.Python.ORDER_NONE];
|
|
|
|
|
};
|
|
|
|
|
|
2022-06-07 11:14:29 +00:00
|
|
|
|
Blockly.Blocks['ugj_bintodec'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.appendValueInput("bin")
|
|
|
|
|
.setCheck("String")
|
|
|
|
|
.appendField("0b");
|
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setOutput(true, "Number");
|
|
|
|
|
this.setTooltip("2進数を10進数に変換します");
|
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
this.setStyle('math_blocks');
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_bintodec'] = function (block, generator) {
|
2022-06-07 11:14:29 +00:00
|
|
|
|
var value_bin = Blockly.JavaScript.valueToCode(block, 'bin', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var code = `parseInt (${value_bin}, 2)`;
|
|
|
|
|
return [code, Blockly.JavaScript.ORDER_NONE];
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
python.pythonGenerator.forBlock['ugj_bintodec'] = function (block, generator) {
|
2022-07-26 08:09:53 +00:00
|
|
|
|
var value_bin = Blockly.Python.valueToCode(block, 'bin', Blockly.Python.ORDER_ATOMIC);
|
|
|
|
|
var code = `int(${value_bin}, 2)`;
|
|
|
|
|
return [code, Blockly.Python.ORDER_NONE];
|
|
|
|
|
};
|
2021-09-07 12:18:50 +00:00
|
|
|
|
|
|
|
|
|
var ugjHextodecDefinition = {
|
|
|
|
|
"type": "ugj_hextodec",
|
|
|
|
|
"message0": "%{BKY_UGJ_HEXTODEC_TITLE}",
|
|
|
|
|
"args0": [
|
|
|
|
|
{
|
|
|
|
|
"type": "input_value",
|
|
|
|
|
"name": "hex",
|
|
|
|
|
"check": "String"
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"inputsInline": true,
|
|
|
|
|
"output": "Number",
|
|
|
|
|
"tooltip": "%{BKY_UGJ_HEXTODEC_TOOLTIP}",
|
|
|
|
|
"helpUrl": "",
|
|
|
|
|
"style": "math_blocks"
|
|
|
|
|
};
|
|
|
|
|
Blockly.Blocks['ugj_hextodec'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.jsonInit(ugjHextodecDefinition);
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_hextodec'] = function (block, generator) {
|
2021-09-07 12:18:50 +00:00
|
|
|
|
var value_hex = Blockly.JavaScript.valueToCode(block, 'hex', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var code = `parseInt (${value_hex}, 16)`;
|
|
|
|
|
return [code, Blockly.JavaScript.ORDER_ATOMIC];
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
python.pythonGenerator.forBlock['ugj_hextodec'] = function (block, generator) {
|
2021-09-07 12:18:50 +00:00
|
|
|
|
var value_hex = Blockly.Python.valueToCode(block, 'hex', Blockly.Python.ORDER_ATOMIC);
|
|
|
|
|
var code = `int(${value_hex}, 16)`;
|
|
|
|
|
return [code, Blockly.Python.ORDER_NONE];
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var ugjDectohexDefinition = {
|
|
|
|
|
"type": "ugj_dectohex",
|
|
|
|
|
"message0": "%{BKY_UGJ_DECTOHEX_TITLE}",
|
|
|
|
|
"args0": [
|
|
|
|
|
{
|
|
|
|
|
"type": "input_value",
|
|
|
|
|
"name": "dec",
|
|
|
|
|
"check": "Number"
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"inputsInline": true,
|
|
|
|
|
"output": "String",
|
|
|
|
|
"tooltip": "%{BKY_UGJ_DECTOHEX_TOOLTIP}",
|
|
|
|
|
"helpUrl": "",
|
|
|
|
|
"style": "math_blocks"
|
|
|
|
|
};
|
|
|
|
|
Blockly.Blocks['ugj_dectohex'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.jsonInit(ugjDectohexDefinition);
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_dectohex'] = function (block, generator) {
|
2021-09-07 12:18:50 +00:00
|
|
|
|
var value_dec = Blockly.JavaScript.valueToCode(block, 'dec', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var code = `'0x' + (${value_dec}).toString(16).toUpperCase()`;
|
|
|
|
|
return [code, Blockly.JavaScript.ORDER_NONE];
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
python.pythonGenerator.forBlock['ugj_dectohex'] = function (block, generator) {
|
2021-09-07 12:18:50 +00:00
|
|
|
|
var value_dec = Blockly.Python.valueToCode(block, 'dec', Blockly.Python.ORDER_ATOMIC);
|
2022-07-26 08:09:53 +00:00
|
|
|
|
var code = `f'{${value_dec}:#04x}'`;
|
2021-09-07 12:18:50 +00:00
|
|
|
|
return [code, Blockly.Python.ORDER_NONE];
|
|
|
|
|
};
|
2020-01-21 07:10:10 +00:00
|
|
|
|
/** GPIO *****************************************************************************************************/
|
|
|
|
|
|
2023-06-25 12:18:33 +00:00
|
|
|
|
/** GPIO 関連共通コード */
|
|
|
|
|
// var require_gpio = [`const _rg = require('${apptool.gpio_lib}');`,
|
|
|
|
|
// `await _rg.rgpio_sbc();`];
|
2024-05-18 14:15:46 +00:00
|
|
|
|
/**************************** */
|
|
|
|
|
/** GPIO Breakout Board Table */
|
|
|
|
|
/**************************** */
|
|
|
|
|
Blockly.defineBlocksWithJsonArray([{
|
|
|
|
|
"type": "oc_breakout",
|
|
|
|
|
"message0": "%1",
|
|
|
|
|
"args0": [
|
|
|
|
|
{
|
|
|
|
|
"type": "field_dropdown",
|
|
|
|
|
"name": "gpio",
|
|
|
|
|
"options": apptool.breakout_table[1]
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"output": "Number",
|
|
|
|
|
"tooltip": apptool.breakout_table[0],
|
|
|
|
|
"helpUrl": "",
|
|
|
|
|
"style": "gpio_blocks"
|
|
|
|
|
}]);
|
|
|
|
|
javascript.javascriptGenerator.forBlock['oc_breakout'] = function (block, generator) {
|
|
|
|
|
var dropdown_gpio = block.getFieldValue('gpio');
|
|
|
|
|
var code = dropdown_gpio;
|
|
|
|
|
return [code, Blockly.JavaScript.ORDER_ATOMIC];
|
|
|
|
|
};
|
2023-06-25 12:18:33 +00:00
|
|
|
|
|
2021-08-29 14:44:58 +00:00
|
|
|
|
/************ */
|
|
|
|
|
/** GPIO Open */
|
|
|
|
|
/************ */
|
2023-06-25 12:18:33 +00:00
|
|
|
|
Blockly.defineBlocksWithJsonArray([{
|
2021-10-08 13:30:52 +00:00
|
|
|
|
"type": "ugj_gpio_open",
|
|
|
|
|
"message0": "%{BKY_GPIO_OPEN_TITLE}",
|
2021-02-28 10:14:39 +00:00
|
|
|
|
"previousStatement": null,
|
|
|
|
|
"nextStatement": null,
|
2021-10-08 13:30:52 +00:00
|
|
|
|
"tooltip": "%{BKY_GPIO_OPEN_TOOLTIP}",
|
2021-02-28 10:14:39 +00:00
|
|
|
|
"helpUrl": "",
|
|
|
|
|
"style": "gpio_blocks"
|
2023-06-25 12:18:33 +00:00
|
|
|
|
}]);
|
2024-05-18 14:15:46 +00:00
|
|
|
|
// javascript.javascriptGenerator.forBlock['ugj_gpio_open'] = function (block, generator, generator) {
|
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_gpio_open'] = function (block, generator) {
|
2021-08-28 14:28:26 +00:00
|
|
|
|
Blockly.JavaScript.provideFunction_(
|
2023-06-25 12:18:33 +00:00
|
|
|
|
'require_gpio', [`const _rg = require('${apptool.gpio_lib}');`]
|
2021-09-18 14:29:06 +00:00
|
|
|
|
);
|
2024-05-18 14:15:46 +00:00
|
|
|
|
if (apptool.rghost === undefined)
|
|
|
|
|
var code = `await _rg.rgpio_sbc();\n`; //
|
|
|
|
|
else
|
|
|
|
|
var code = `await _rg.rgpio_sbc(host="${apptool.rghost}");\n`;
|
2020-01-21 07:10:10 +00:00
|
|
|
|
return code;
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
python.pythonGenerator.forBlock['ugj_gpio_open'] = function (block, generator) {
|
2021-08-28 14:28:26 +00:00
|
|
|
|
Blockly.Python.provideFunction_(
|
2022-07-10 13:04:56 +00:00
|
|
|
|
'import_pin', ['from machine import Pin']
|
2021-09-18 14:29:06 +00:00
|
|
|
|
);
|
2022-07-10 13:04:56 +00:00
|
|
|
|
var code = `_pin = {}\n`; //
|
2021-08-28 14:28:26 +00:00
|
|
|
|
return code;
|
|
|
|
|
};
|
2024-05-18 14:15:46 +00:00
|
|
|
|
/******************* */
|
|
|
|
|
/** Remote GPIO Open */
|
|
|
|
|
/******************* */
|
|
|
|
|
Blockly.defineBlocksWithJsonArray([{
|
|
|
|
|
"type": "oc_gpio_open_remote",
|
|
|
|
|
"message0": "リモートホスト %1 の GPIO を使えるようにする",
|
|
|
|
|
"args0": [
|
|
|
|
|
{
|
|
|
|
|
"type": "input_value",
|
|
|
|
|
"name": "host",
|
|
|
|
|
"check": "String"
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"inputsInline": true,
|
|
|
|
|
"previousStatement": null,
|
|
|
|
|
"nextStatement": null,
|
|
|
|
|
"style": "gpio_blocks",
|
|
|
|
|
"tooltip": "",
|
|
|
|
|
"helpUrl": ""
|
|
|
|
|
}]);
|
|
|
|
|
javascript.javascriptGenerator.forBlock['oc_gpio_open_remote'] = function (block, generator) {
|
|
|
|
|
var value_host = generator.valueToCode(block, 'host', javascript.Order.ATOMIC);
|
|
|
|
|
Blockly.JavaScript.provideFunction_(
|
|
|
|
|
'require_gpio', [`const _rg = require('${apptool.gpio_lib}');`]
|
|
|
|
|
);
|
|
|
|
|
var code = `await _rg.rgpio_sbc(host=${value_host});\n`; //
|
|
|
|
|
return code;
|
|
|
|
|
};
|
2021-08-29 14:44:58 +00:00
|
|
|
|
|
|
|
|
|
/************* */
|
|
|
|
|
/** GPIO Close */
|
|
|
|
|
/************* */
|
2023-06-25 12:18:33 +00:00
|
|
|
|
Blockly.defineBlocksWithJsonArray([{
|
2021-10-08 13:30:52 +00:00
|
|
|
|
"type": "ugj_gpio_close",
|
|
|
|
|
"message0": "%{BKY_GPIO_CLOSE_TITLE}",
|
2021-08-28 14:28:26 +00:00
|
|
|
|
"previousStatement": null,
|
|
|
|
|
"nextStatement": null,
|
2021-10-08 13:30:52 +00:00
|
|
|
|
"tooltip": "%{BKY_GPIO_CLOSE_TOOLTIP}",
|
2021-08-28 14:28:26 +00:00
|
|
|
|
"helpUrl": "",
|
|
|
|
|
"style": "gpio_blocks"
|
2023-06-25 12:18:33 +00:00
|
|
|
|
}]);
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_gpio_close'] = function (block, generator) {
|
2023-06-25 12:18:33 +00:00
|
|
|
|
var code = 'await _rg.sbc_stop();\n';
|
2020-01-21 07:10:10 +00:00
|
|
|
|
return code;
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
python.pythonGenerator.forBlock['ugj_gpio_close'] = function (block, generator) {
|
2022-07-10 13:04:56 +00:00
|
|
|
|
var code = '';
|
2021-08-28 14:28:26 +00:00
|
|
|
|
return code;
|
|
|
|
|
};
|
2020-01-21 07:10:10 +00:00
|
|
|
|
|
2021-08-29 14:44:58 +00:00
|
|
|
|
/*********************** */
|
2021-10-08 13:30:52 +00:00
|
|
|
|
/** GPIO Set Output ** */
|
2021-08-29 14:44:58 +00:00
|
|
|
|
/*********************** */
|
2021-10-08 13:30:52 +00:00
|
|
|
|
var ugjGpioSetOutputDefinition = {
|
2023-06-25 12:18:33 +00:00
|
|
|
|
"type": "oc_gpio_set_output",
|
|
|
|
|
"message0": "GPIO %1 を出力モードにする",
|
2021-08-29 14:44:58 +00:00
|
|
|
|
"args0": [
|
|
|
|
|
{
|
|
|
|
|
"type": "input_value",
|
2023-06-25 12:18:33 +00:00
|
|
|
|
"name": "ugpio",
|
2021-08-29 14:44:58 +00:00
|
|
|
|
"check": "Number"
|
|
|
|
|
}
|
|
|
|
|
],
|
2021-02-28 10:14:39 +00:00
|
|
|
|
"previousStatement": null,
|
|
|
|
|
"nextStatement": null,
|
2023-06-25 12:18:33 +00:00
|
|
|
|
"tooltip": "GPIO を出力モードに設定します。",
|
2021-02-28 10:14:39 +00:00
|
|
|
|
"helpUrl": "",
|
|
|
|
|
"style": "gpio_blocks"
|
|
|
|
|
};
|
2023-06-25 12:18:33 +00:00
|
|
|
|
Blockly.Blocks['oc_gpio_set_output'] = {
|
2020-01-21 07:10:10 +00:00
|
|
|
|
init: function () {
|
2021-10-08 13:30:52 +00:00
|
|
|
|
this.jsonInit(ugjGpioSetOutputDefinition);
|
2020-01-21 07:10:10 +00:00
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['oc_gpio_set_output'] = function (block, generator) {
|
2023-06-25 12:18:33 +00:00
|
|
|
|
var value_ugpio = Blockly.JavaScript.valueToCode(block, 'ugpio', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var code = `await _rg.gpio_set_output(${value_ugpio});\n`;
|
2020-01-21 07:10:10 +00:00
|
|
|
|
return code;
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
python.pythonGenerator.forBlock['oc_gpio_set_output'] = function (block, generator) {
|
2023-06-25 12:18:33 +00:00
|
|
|
|
var value_ugpio = Blockly.Python.valueToCode(block, 'ugpio', Blockly.Python.ORDER_ATOMIC);
|
|
|
|
|
var code = `_pin[${value_ugpio}] = Pin(${value_ugpio}, Pin.OUT)\n`;
|
2021-08-28 14:28:26 +00:00
|
|
|
|
return code;
|
|
|
|
|
};
|
2020-01-21 07:10:10 +00:00
|
|
|
|
|
2021-08-29 14:44:58 +00:00
|
|
|
|
/********************** */
|
2021-10-08 13:30:52 +00:00
|
|
|
|
/** GPIO Set Input ** */
|
2021-08-29 14:44:58 +00:00
|
|
|
|
/********************** */
|
2023-06-25 12:18:33 +00:00
|
|
|
|
Blockly.defineBlocksWithJsonArray([{
|
|
|
|
|
"type": "oc_gpio_set_input",
|
|
|
|
|
"message0": "GPIO %1 を入力モードにして %2",
|
2021-08-29 14:44:58 +00:00
|
|
|
|
"args0": [
|
|
|
|
|
{
|
|
|
|
|
"type": "input_value",
|
2023-06-25 12:18:33 +00:00
|
|
|
|
"name": "ugpio",
|
2021-08-29 14:44:58 +00:00
|
|
|
|
"check": "Number"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"type": "field_dropdown",
|
|
|
|
|
"name": "lflag",
|
|
|
|
|
"options": [
|
|
|
|
|
[
|
2023-06-25 12:18:33 +00:00
|
|
|
|
"プルしない",
|
|
|
|
|
"SET_PULL_NONE"
|
2021-08-29 14:44:58 +00:00
|
|
|
|
],
|
|
|
|
|
[
|
2023-06-25 12:18:33 +00:00
|
|
|
|
"プルアップ",
|
|
|
|
|
"SET_PULL_UP"
|
2021-08-29 14:44:58 +00:00
|
|
|
|
],
|
|
|
|
|
[
|
2023-06-25 12:18:33 +00:00
|
|
|
|
"プルダウン",
|
|
|
|
|
"SET_PULL_DOWN"
|
2021-08-29 14:44:58 +00:00
|
|
|
|
]
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"previousStatement": null,
|
|
|
|
|
"nextStatement": null,
|
2023-06-25 12:18:33 +00:00
|
|
|
|
"tooltip": "GPIO を入力モードに設定します。Raspberry Pi では内蔵プルアップ/ダウンの設定が可能です。",
|
2021-08-29 14:44:58 +00:00
|
|
|
|
"helpUrl": "",
|
|
|
|
|
"style": "gpio_blocks"
|
2023-06-25 12:18:33 +00:00
|
|
|
|
}]);
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['oc_gpio_set_input'] = function (block, generator) {
|
2023-06-25 12:18:33 +00:00
|
|
|
|
var value_ugpio = Blockly.JavaScript.valueToCode(block, 'ugpio', Blockly.JavaScript.ORDER_ATOMIC);
|
2021-08-29 14:44:58 +00:00
|
|
|
|
var dropdown_lflag = block.getFieldValue('lflag');
|
2023-06-25 12:18:33 +00:00
|
|
|
|
var code = `await _rg.gpio_set_input(${value_ugpio}, _rg.${dropdown_lflag});\n`;
|
2022-07-26 08:09:53 +00:00
|
|
|
|
return code;
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
python.pythonGenerator.forBlock['oc_gpio_set_input'] = function (block, generator) {
|
2023-06-25 12:18:33 +00:00
|
|
|
|
var value_gpio = Blockly.Python.valueToCode(block, 'ugpio', Blockly.Python.ORDER_ATOMIC);
|
2022-07-26 08:09:53 +00:00
|
|
|
|
var dropdown_lflag = block.getFieldValue('lflag');
|
|
|
|
|
let lflag;
|
2023-06-25 12:18:33 +00:00
|
|
|
|
if (dropdown_lflag == 'SET_PULL_NONE') { lflag = 'None'; }
|
2022-07-26 08:09:53 +00:00
|
|
|
|
else { lflag = `Pin.${dropdown_lflag}`; }
|
|
|
|
|
var code = `_pin[${value_gpio}] = Pin(${value_gpio}, Pin.IN, ${lflag})\n`;
|
2020-01-21 07:10:10 +00:00
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/********************* */
|
|
|
|
|
/** Read GPIO Value ** */
|
|
|
|
|
/***********************/
|
2021-08-29 14:44:58 +00:00
|
|
|
|
var ugjGpioReadDefinition = {
|
|
|
|
|
"type": "ugj_gpio_read",
|
|
|
|
|
"message0": "%{BKY_GPIO_READ_TITLE}",
|
|
|
|
|
"args0": [
|
|
|
|
|
{
|
|
|
|
|
"type": "input_value",
|
|
|
|
|
"name": "gpio",
|
|
|
|
|
"check": "Number"
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"inputsInline": true,
|
|
|
|
|
"output": "Number",
|
|
|
|
|
"tooltip": "%{BKY_GPIO_READ_TOOLTIP",
|
|
|
|
|
"helpUrl": "",
|
|
|
|
|
"style": "gpio_blocks"
|
|
|
|
|
};
|
2020-01-21 07:10:10 +00:00
|
|
|
|
Blockly.Blocks['ugj_gpio_read'] = {
|
|
|
|
|
init: function () {
|
2021-08-29 14:44:58 +00:00
|
|
|
|
this.jsonInit(ugjGpioReadDefinition);
|
2020-01-21 07:10:10 +00:00
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_gpio_read'] = function (block, generator) {
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var value_gpio = Blockly.JavaScript.valueToCode(block, 'gpio', Blockly.JavaScript.ORDER_ATOMIC);
|
2023-06-25 12:18:33 +00:00
|
|
|
|
var code = `await _rg.gpio_read(${value_gpio})`;
|
2020-01-21 07:10:10 +00:00
|
|
|
|
return [code, Blockly.JavaScript.ORDER_NONE];
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
python.pythonGenerator.forBlock['ugj_gpio_read'] = function (block, generator) {
|
2022-07-26 08:09:53 +00:00
|
|
|
|
var value_gpio = Blockly.Python.valueToCode(block, 'gpio', Blockly.Python.ORDER_ATOMIC);
|
|
|
|
|
var code = `_pin[${value_gpio}].value()`;
|
|
|
|
|
return [code, Blockly.Python.ORDER_NONE];
|
|
|
|
|
};
|
2020-01-21 07:10:10 +00:00
|
|
|
|
|
|
|
|
|
/*******************************************/
|
|
|
|
|
/** GPIO Write Value - Common GPIO on/off **/
|
|
|
|
|
/*******************************************/
|
2021-08-29 14:44:58 +00:00
|
|
|
|
var ugjGpioWriteDefinition = {
|
|
|
|
|
"type": "ugj_gpio_write",
|
|
|
|
|
"message0": "%{BKY_GPIO_WRITE_TITLE}",
|
|
|
|
|
"args0": [
|
|
|
|
|
{
|
|
|
|
|
"type": "input_value",
|
2024-05-18 14:15:46 +00:00
|
|
|
|
"name": "gpio"
|
2021-08-29 14:44:58 +00:00
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"type": "field_dropdown",
|
|
|
|
|
"name": "level",
|
2024-05-18 14:15:46 +00:00
|
|
|
|
"options":
|
2021-08-29 14:44:58 +00:00
|
|
|
|
[
|
2024-05-18 14:15:46 +00:00
|
|
|
|
[
|
|
|
|
|
"0",
|
|
|
|
|
"0"
|
|
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
"1",
|
|
|
|
|
"1"
|
|
|
|
|
]
|
2021-08-29 14:44:58 +00:00
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"inputsInline": true,
|
|
|
|
|
"previousStatement": null,
|
|
|
|
|
"nextStatement": null,
|
|
|
|
|
"tooltip": "%{BKY_GPIO_WRITE_TOOLTIP}",
|
|
|
|
|
"helpUrl": "",
|
|
|
|
|
"style": "gpio_blocks"
|
|
|
|
|
};
|
2020-01-21 07:10:10 +00:00
|
|
|
|
Blockly.Blocks['ugj_gpio_write'] = {
|
|
|
|
|
init: function () {
|
2021-08-29 14:44:58 +00:00
|
|
|
|
this.jsonInit(ugjGpioWriteDefinition);
|
2020-01-21 07:10:10 +00:00
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_gpio_write'] = function (block, generator) {
|
2021-08-29 14:44:58 +00:00
|
|
|
|
var value_gpio = Blockly.JavaScript.valueToCode(block, 'gpio', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var dropdown_level = block.getFieldValue('level');
|
2023-06-25 12:18:33 +00:00
|
|
|
|
var code = `await _rg.gpio_write(${value_gpio}, ${dropdown_level});\n`;
|
2021-08-29 14:44:58 +00:00
|
|
|
|
return code;
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
python.pythonGenerator.forBlock['ugj_gpio_write'] = function (block, generator) {
|
2021-08-29 14:44:58 +00:00
|
|
|
|
var value_gpio = Blockly.Python.valueToCode(block, 'gpio', Blockly.Python.ORDER_ATOMIC);
|
|
|
|
|
var dropdown_level = block.getFieldValue('level');
|
2022-07-10 13:04:56 +00:00
|
|
|
|
var code = `_pin[${value_gpio}].value(${dropdown_level})\n`;
|
2020-01-21 07:10:10 +00:00
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
|
2021-08-29 14:44:58 +00:00
|
|
|
|
/************************************************* */
|
|
|
|
|
/** starts software timed PWM on an output GPIO ** */
|
|
|
|
|
/************************************************* */
|
2021-10-08 13:30:52 +00:00
|
|
|
|
var ugjPwmDefinition = {
|
|
|
|
|
"type": "ugj_pwm",
|
|
|
|
|
"message0": "%{BKY_PWM_TITLE}",
|
2021-08-29 14:44:58 +00:00
|
|
|
|
"args0": [
|
|
|
|
|
{
|
|
|
|
|
"type": "input_value",
|
|
|
|
|
"name": "gpio",
|
|
|
|
|
"check": "Number"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"type": "input_value",
|
|
|
|
|
"name": "pwm_frequency",
|
|
|
|
|
"check": "Number"
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"inputsInline": true,
|
|
|
|
|
"previousStatement": null,
|
|
|
|
|
"nextStatement": null,
|
2021-10-08 13:30:52 +00:00
|
|
|
|
"tooltip": "%{BKY_PWM_TOOLTIP}",
|
2021-08-29 14:44:58 +00:00
|
|
|
|
"helpUrl": "",
|
|
|
|
|
"style": "gpio_blocks"
|
|
|
|
|
};
|
2021-10-08 13:30:52 +00:00
|
|
|
|
Blockly.Blocks['ugj_pwm'] = {
|
2020-01-21 07:10:10 +00:00
|
|
|
|
init: function () {
|
2021-10-08 13:30:52 +00:00
|
|
|
|
this.jsonInit(ugjPwmDefinition);
|
2020-01-21 07:10:10 +00:00
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
// javascript.javascriptGenerator.forBlock['ugj_pwm'] = function (block, generator) {
|
2023-05-09 00:05:48 +00:00
|
|
|
|
// var value_gpio = Blockly.JavaScript.valueToCode(block, 'gpio', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
// var value_pwm_frequency = Blockly.JavaScript.valueToCode(block, 'pwm_frequency', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
// var value_pwm_duty_cycle = Blockly.JavaScript.valueToCode(block, 'pwm_duty_cycle', Blockly.JavaScript.ORDER_ATOMIC);
|
2023-06-25 12:18:33 +00:00
|
|
|
|
// var code = `await _rg.pwm(${value_gpio}, ${value_pwm_frequency}, ${value_pwm_duty_cycle});\n`;
|
2022-07-10 13:04:56 +00:00
|
|
|
|
// return code;
|
|
|
|
|
// };
|
2023-08-18 23:53:45 +00:00
|
|
|
|
python.pythonGenerator.forBlock['ugj_pwm'] = function (block, generator) {
|
2023-05-09 00:05:48 +00:00
|
|
|
|
var value_gpio = Blockly.Python.valueToCode(block, 'gpio', Blockly.Python.ORDER_ATOMIC);
|
|
|
|
|
var value_pwm_frequency = Blockly.Python.valueToCode(block, 'pwm_frequency', Blockly.Python.ORDER_ATOMIC);
|
|
|
|
|
var value_pwm_duty_cycle = Blockly.Python.valueToCode(block, 'pwm_duty_cycle', Blockly.Python.ORDER_ATOMIC);
|
|
|
|
|
Blockly.Python.provideFunction_(
|
|
|
|
|
'import_pwm', ['from machine import PWM']
|
|
|
|
|
);
|
|
|
|
|
var code = `_pin[${value_gpio}] = PWM(Pin(${value_gpio}))
|
|
|
|
|
_pin[${value_gpio}].freq(${value_pwm_frequency})
|
|
|
|
|
`;
|
|
|
|
|
// var code = `await pi.pwm(gpioHand, ${value_gpio}, ${value_pwm_frequency}, ${value_pwm_duty_cycle})\n`;
|
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
Blockly.Blocks['oc_pwm_duty'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.appendValueInput("gpio")
|
|
|
|
|
.setCheck("Number")
|
|
|
|
|
.appendField("GPIO");
|
|
|
|
|
this.appendValueInput("duty")
|
|
|
|
|
.setCheck("Number")
|
|
|
|
|
.appendField("へデューティ値");
|
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.appendField("でパルスを出力");
|
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setPreviousStatement(true, null);
|
|
|
|
|
this.setNextStatement(true, null);
|
2023-06-25 12:18:33 +00:00
|
|
|
|
this.setTooltip("[RP2] PWM出力に設定したGPIOへパルスを出力します。デューティ値は 0(0%) ~ 65535(100%) の範囲で指定します。");
|
2023-05-09 00:05:48 +00:00
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
this.setStyle('gpio_blocks');
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
python.pythonGenerator.forBlock['oc_pwm_duty'] = function (block, generator) {
|
2023-05-09 00:05:48 +00:00
|
|
|
|
var value_gpio = Blockly.Python.valueToCode(block, 'gpio', Blockly.Python.ORDER_ATOMIC);
|
|
|
|
|
var value_duty = Blockly.Python.valueToCode(block, 'duty', Blockly.Python.ORDER_ATOMIC);
|
|
|
|
|
var code = `_pin[${value_gpio}].duty_u16(${value_duty})\n`;
|
|
|
|
|
return code;
|
|
|
|
|
};
|
2020-01-21 07:10:10 +00:00
|
|
|
|
/********************** */
|
|
|
|
|
/** Open Serial Port ** */
|
|
|
|
|
/********************** */
|
2023-06-25 12:18:33 +00:00
|
|
|
|
Blockly.defineBlocksWithJsonArray([{
|
|
|
|
|
"type": "oc_serial_open",
|
|
|
|
|
"message0": "ポート %1 のシリアルデバイスを %2 として速度 %3 で開く",
|
2021-08-29 14:44:58 +00:00
|
|
|
|
"args0": [
|
2023-06-25 12:18:33 +00:00
|
|
|
|
{
|
|
|
|
|
"type": "input_value",
|
|
|
|
|
"name": "port",
|
|
|
|
|
"check": "String"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"type": "field_variable",
|
|
|
|
|
"name": "ser_hand",
|
|
|
|
|
"variable": "シリアルデバイス"
|
|
|
|
|
},
|
2021-08-29 14:44:58 +00:00
|
|
|
|
{
|
|
|
|
|
"type": "field_dropdown",
|
|
|
|
|
"name": "baud",
|
|
|
|
|
"options": [
|
|
|
|
|
[
|
2023-06-25 12:18:33 +00:00
|
|
|
|
"9600bps",
|
2021-08-29 14:44:58 +00:00
|
|
|
|
"9600"
|
|
|
|
|
],
|
|
|
|
|
[
|
2023-06-25 12:18:33 +00:00
|
|
|
|
"19200bps",
|
2021-08-29 14:44:58 +00:00
|
|
|
|
"19200"
|
|
|
|
|
],
|
|
|
|
|
[
|
2023-06-25 12:18:33 +00:00
|
|
|
|
"115200bps",
|
2021-08-29 14:44:58 +00:00
|
|
|
|
"115200"
|
|
|
|
|
]
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"inputsInline": true,
|
|
|
|
|
"previousStatement": null,
|
|
|
|
|
"nextStatement": null,
|
2023-06-25 12:18:33 +00:00
|
|
|
|
"tooltip": "シリアルデバイスに名前をつけて開きます。",
|
2021-08-29 14:44:58 +00:00
|
|
|
|
"helpUrl": "",
|
|
|
|
|
"style": "gpio_blocks"
|
2023-06-25 12:18:33 +00:00
|
|
|
|
}]);
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['oc_serial_open'] = function (block, generator) {
|
2023-06-25 12:18:33 +00:00
|
|
|
|
var value_port = Blockly.JavaScript.valueToCode(block, 'port', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var variable_ser_hand = Blockly.JavaScript.nameDB_.getName(block.getFieldValue('ser_hand'), Blockly.Names.NameType.VARIABLE);
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var dropdown_baud = block.getFieldValue('baud');
|
2023-06-25 12:18:33 +00:00
|
|
|
|
var code = `${variable_ser_hand} = await _rg.serial_open(${value_port}, ${dropdown_baud});\nconsole.log(${variable_ser_hand});\n`;
|
2020-01-21 07:10:10 +00:00
|
|
|
|
return code;
|
|
|
|
|
};
|
2021-08-29 14:44:58 +00:00
|
|
|
|
/*********************** */
|
2020-01-21 07:10:10 +00:00
|
|
|
|
/** Close Serial Port ** */
|
2021-08-29 14:44:58 +00:00
|
|
|
|
/*********************** */
|
2023-06-25 12:18:33 +00:00
|
|
|
|
Blockly.defineBlocksWithJsonArray([{
|
|
|
|
|
"type": "oc_serial_close",
|
|
|
|
|
"message0": "%1 を閉じる",
|
2021-08-29 14:44:58 +00:00
|
|
|
|
"args0": [
|
|
|
|
|
{
|
2023-06-25 12:18:33 +00:00
|
|
|
|
"type": "field_variable",
|
|
|
|
|
"name": "ser_hand",
|
|
|
|
|
"variable": "シリアルデバイス"
|
2021-08-29 14:44:58 +00:00
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"inputsInline": true,
|
|
|
|
|
"previousStatement": null,
|
|
|
|
|
"nextStatement": null,
|
2023-06-25 12:18:33 +00:00
|
|
|
|
"tooltip": "シリアルデバイスとの通信を切断します。",
|
2021-08-29 14:44:58 +00:00
|
|
|
|
"helpUrl": "",
|
|
|
|
|
"style": "gpio_blocks"
|
2023-06-25 12:18:33 +00:00
|
|
|
|
}]);
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['oc_serial_close'] = function (block, generator) {
|
2023-06-25 12:18:33 +00:00
|
|
|
|
var variable_ser_hand = Blockly.JavaScript.nameDB_.getName(block.getFieldValue('ser_hand'), Blockly.Names.NameType.VARIABLE);
|
|
|
|
|
var code = `await _rg.serial_close(${variable_ser_hand});\n`;
|
2021-08-29 14:44:58 +00:00
|
|
|
|
return code;
|
|
|
|
|
};
|
2020-01-21 07:10:10 +00:00
|
|
|
|
|
|
|
|
|
/************************ */
|
|
|
|
|
/** Read Data from Serial */
|
|
|
|
|
/************************ */
|
2023-06-25 12:18:33 +00:00
|
|
|
|
Blockly.defineBlocksWithJsonArray([{
|
|
|
|
|
"type": "oc_serial_read",
|
|
|
|
|
"message0": "%1 %2 から %3 文字受け取る",
|
2021-08-29 14:44:58 +00:00
|
|
|
|
"args0": [
|
2023-06-25 12:18:33 +00:00
|
|
|
|
{
|
|
|
|
|
"type": "field_variable",
|
|
|
|
|
"name": "ser_hand",
|
|
|
|
|
"variable": "シリアルデバイス"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"type": "input_dummy"
|
|
|
|
|
},
|
2021-08-29 14:44:58 +00:00
|
|
|
|
{
|
|
|
|
|
"type": "input_value",
|
|
|
|
|
"name": "count",
|
|
|
|
|
"check": "Number"
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"inputsInline": true,
|
|
|
|
|
"output": null,
|
2023-06-25 12:18:33 +00:00
|
|
|
|
"tooltip": "シリアルデバイスから指定したバイト数のデータを受け取ります。0を指定すると受信可能な全てのデータを取得します。",
|
2021-08-29 14:44:58 +00:00
|
|
|
|
"helpUrl": "",
|
|
|
|
|
"style": "gpio_blocks"
|
2023-06-25 12:18:33 +00:00
|
|
|
|
}]);
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['oc_serial_read'] = function (block, generator) {
|
2023-06-25 12:18:33 +00:00
|
|
|
|
var variable_ser_hand = Blockly.JavaScript.nameDB_.getName(block.getFieldValue('ser_hand'), Blockly.Names.NameType.VARIABLE);
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var value_count = Blockly.JavaScript.valueToCode(block, 'count', Blockly.JavaScript.ORDER_ATOMIC);
|
2023-06-25 12:18:33 +00:00
|
|
|
|
var code = `await _rg.serial_read(${variable_ser_hand}, ${value_count})`;
|
2021-09-18 14:29:06 +00:00
|
|
|
|
return [code, Blockly.JavaScript.ORDER_ATOMIC];
|
2020-01-21 07:10:10 +00:00
|
|
|
|
};
|
|
|
|
|
|
2023-06-25 12:18:33 +00:00
|
|
|
|
/************************** */
|
|
|
|
|
/** Write Data to Serial ** */
|
|
|
|
|
/************************** */
|
|
|
|
|
Blockly.defineBlocksWithJsonArray([{
|
|
|
|
|
"type": "oc_serial_write",
|
|
|
|
|
"message0": "%1 %2 に %3 を送信する",
|
2021-08-29 14:44:58 +00:00
|
|
|
|
"args0": [
|
2023-06-25 12:18:33 +00:00
|
|
|
|
{
|
|
|
|
|
"type": "field_variable",
|
|
|
|
|
"name": "ser_hand",
|
|
|
|
|
"variable": "シリアルデバイス"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"type": "input_dummy"
|
|
|
|
|
},
|
2021-08-29 14:44:58 +00:00
|
|
|
|
{
|
|
|
|
|
"type": "input_value",
|
2023-06-25 12:18:33 +00:00
|
|
|
|
"name": "data",
|
|
|
|
|
"check": "String"
|
2021-08-29 14:44:58 +00:00
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"inputsInline": true,
|
|
|
|
|
"previousStatement": null,
|
|
|
|
|
"nextStatement": null,
|
2023-06-25 12:18:33 +00:00
|
|
|
|
"tooltip": "シリアルデバイスにデータを送信します。",
|
2021-08-29 14:44:58 +00:00
|
|
|
|
"helpUrl": "",
|
|
|
|
|
"style": "gpio_blocks"
|
2023-06-25 12:18:33 +00:00
|
|
|
|
}]);
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['oc_serial_write'] = function (block, generator) {
|
2023-06-25 12:18:33 +00:00
|
|
|
|
var variable_ser_hand = Blockly.JavaScript.nameDB_.getName(block.getFieldValue('ser_hand'), Blockly.Names.NameType.VARIABLE);
|
|
|
|
|
var value_data = Blockly.JavaScript.valueToCode(block, 'data', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
// TODO: Assemble JavaScript into code variable.
|
|
|
|
|
var code = `await _rg.serial_write(${variable_ser_hand}, ${value_data});\n`;
|
|
|
|
|
return code;
|
2021-08-29 14:44:58 +00:00
|
|
|
|
};
|
2023-06-25 12:18:33 +00:00
|
|
|
|
/******************************************************************* */
|
|
|
|
|
/** Returns the number of bytes available to be read from the device */
|
|
|
|
|
/******************************************************************* */
|
|
|
|
|
|
|
|
|
|
/********************* */
|
|
|
|
|
/** Open I2C Device ** */
|
|
|
|
|
/********************* */
|
|
|
|
|
Blockly.Blocks['oc_i2c_open'] = {
|
2021-01-20 13:26:39 +00:00
|
|
|
|
init: function () {
|
2023-06-25 12:18:33 +00:00
|
|
|
|
this.appendValueInput("addr")
|
|
|
|
|
.setCheck("Number")
|
|
|
|
|
.appendField("アドレス");
|
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.appendField("の I2C デバイスを")
|
|
|
|
|
.appendField(new Blockly.FieldVariable("I2Cデバイス"), "i2c_hand")
|
|
|
|
|
.appendField("として開く");
|
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setPreviousStatement(true, null);
|
|
|
|
|
this.setNextStatement(true, null);
|
|
|
|
|
this.setTooltip("I2C接続されたデバイスに名前をつけて通信を開始します。");
|
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
this.setStyle("gpio_blocks");
|
2020-01-21 07:10:10 +00:00
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['oc_i2c_open'] = function (block, generator) {
|
2023-06-25 12:18:33 +00:00
|
|
|
|
var value_addr = Blockly.JavaScript.valueToCode(block, 'addr', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var variable_i2c_hand = Blockly.JavaScript.nameDB_.getName(block.getFieldValue('i2c_hand'), Blockly.Names.NameType.VARIABLE);
|
2023-08-18 02:16:52 +00:00
|
|
|
|
// Blockly.JavaScript.provideFunction_(
|
|
|
|
|
// 'require_gpio', require_gpio
|
|
|
|
|
// );
|
2023-06-25 12:18:33 +00:00
|
|
|
|
var code = `${variable_i2c_hand} = await _rg.i2c_open(${apptool.i2c_bus}, ${value_addr});\n`;
|
2021-08-29 14:44:58 +00:00
|
|
|
|
return code;
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
python.pythonGenerator.forBlock['oc_i2c_open'] = function (block, generator) {
|
2023-06-25 12:18:33 +00:00
|
|
|
|
var value_addr = Blockly.Python.valueToCode(block, 'addr', Blockly.Python.ORDER_ATOMIC);
|
|
|
|
|
var variable_i2c_hand = Blockly.Python.nameDB_.getName(block.getFieldValue('i2c_hand'), Blockly.Names.NameType.VARIABLE);
|
2022-07-26 08:09:53 +00:00
|
|
|
|
Blockly.Python.provideFunction_(
|
|
|
|
|
'import_i2c', ['from machine import I2C']
|
|
|
|
|
);
|
2023-06-25 12:18:33 +00:00
|
|
|
|
var code = `_addr = ${value_addr}
|
|
|
|
|
${variable_i2c_hand} = I2C(0,sda=Pin(0),scl=Pin(1))\n`;
|
2022-07-26 08:09:53 +00:00
|
|
|
|
return code;
|
|
|
|
|
};
|
2020-01-21 07:10:10 +00:00
|
|
|
|
/********************** */
|
|
|
|
|
/** Close I2C Device ** */
|
|
|
|
|
/********************** */
|
2023-06-25 12:18:33 +00:00
|
|
|
|
Blockly.Blocks['oc_i2c_close'] = {
|
2020-01-21 07:10:10 +00:00
|
|
|
|
init: function () {
|
2023-06-25 12:18:33 +00:00
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
// .appendField("I2C デバイス")
|
|
|
|
|
.appendField(new Blockly.FieldVariable("I2Cデバイス"), "i2c_hand")
|
|
|
|
|
.appendField("を閉じる");
|
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setPreviousStatement(true, null);
|
|
|
|
|
this.setNextStatement(true, null);
|
|
|
|
|
this.setTooltip("指定した I2C デバイスとの通信を切断します。");
|
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
this.setStyle("gpio_blocks");
|
2020-01-21 07:10:10 +00:00
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['oc_i2c_close'] = function (block, generator) {
|
2023-06-25 12:18:33 +00:00
|
|
|
|
var variable_i2c_hand = Blockly.JavaScript.nameDB_.getName(block.getFieldValue('i2c_hand'), Blockly.Names.NameType.VARIABLE);
|
|
|
|
|
var code = `await _rg.i2c_close(${variable_i2c_hand});\n`;
|
2021-08-29 14:44:58 +00:00
|
|
|
|
return code;
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
python.pythonGenerator.forBlock['oc_i2c_close'] = function (block, generator) {
|
2022-07-26 08:09:53 +00:00
|
|
|
|
var code = ``;
|
|
|
|
|
return code;
|
|
|
|
|
};
|
2020-01-21 07:10:10 +00:00
|
|
|
|
|
2023-05-09 00:05:48 +00:00
|
|
|
|
/*************************************** */
|
|
|
|
|
/** Sends a single byte to the device ** */
|
|
|
|
|
/*************************************** */
|
|
|
|
|
Blockly.Blocks['oc_i2c_write_byte'] = {
|
|
|
|
|
init: function () {
|
2023-06-25 12:18:33 +00:00
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
// .appendField("I2C デバイス")
|
|
|
|
|
.appendField(new Blockly.FieldVariable("I2Cデバイス"), "i2c_hand")
|
2023-05-09 00:05:48 +00:00
|
|
|
|
this.appendValueInput("byte_val")
|
|
|
|
|
.setCheck("Number")
|
2023-06-25 12:18:33 +00:00
|
|
|
|
.appendField("に1バイトデータ");
|
2023-05-09 00:05:48 +00:00
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.appendField("を送信");
|
|
|
|
|
this.setPreviousStatement(true, null);
|
|
|
|
|
this.setNextStatement(true, null);
|
2023-06-25 12:18:33 +00:00
|
|
|
|
this.setTooltip("指定の I2C デバイスに1バイトデータを送信します。0-0xFF(255)の範囲の数字で入力してください。");
|
2023-05-09 00:05:48 +00:00
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
this.setStyle('gpio_blocks');
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['oc_i2c_write_byte'] = function (block, generator) {
|
2023-06-25 12:18:33 +00:00
|
|
|
|
var variable_i2c_hand = Blockly.JavaScript.nameDB_.getName(block.getFieldValue('i2c_hand'), Blockly.Names.NameType.VARIABLE);
|
2023-05-09 00:05:48 +00:00
|
|
|
|
var value_byte_val = Blockly.JavaScript.valueToCode(block, 'byte_val', Blockly.JavaScript.ORDER_ATOMIC);
|
2023-06-25 12:18:33 +00:00
|
|
|
|
var code = `await _rg.i2c_write_byte(${variable_i2c_hand}, ${value_byte_val});\n`;
|
2023-05-09 00:05:48 +00:00
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
|
2020-01-21 07:10:10 +00:00
|
|
|
|
/****************************************************************** */
|
|
|
|
|
/** Writes a single byte to the specified register of the device ** */
|
|
|
|
|
/****************************************************************** */
|
2023-06-25 12:18:33 +00:00
|
|
|
|
Blockly.defineBlocksWithJsonArray([{
|
2021-08-29 14:44:58 +00:00
|
|
|
|
"type": "ugj_i2c_write_byte_data",
|
2023-06-25 12:18:33 +00:00
|
|
|
|
"message0": "%1 %2 のレジスタ %3 に %4 を書き込む",
|
2021-08-29 14:44:58 +00:00
|
|
|
|
"args0": [
|
2023-06-25 12:18:33 +00:00
|
|
|
|
{
|
|
|
|
|
"type": "field_variable",
|
|
|
|
|
"name": "i2c_hand",
|
|
|
|
|
"variable": "I2Cデバイス"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"type": "input_dummy"
|
|
|
|
|
},
|
2021-08-29 14:44:58 +00:00
|
|
|
|
{
|
|
|
|
|
"type": "input_value",
|
|
|
|
|
"name": "reg",
|
|
|
|
|
"check": "Number"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"type": "input_value",
|
|
|
|
|
"name": "byte_val",
|
|
|
|
|
"check": "Number"
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"inputsInline": true,
|
|
|
|
|
"previousStatement": null,
|
|
|
|
|
"nextStatement": null,
|
2023-06-25 12:18:33 +00:00
|
|
|
|
"tooltip": "I2C デバイスの指定されたレジスタに1バイトを書き込みます。",
|
2021-08-29 14:44:58 +00:00
|
|
|
|
"helpUrl": "",
|
|
|
|
|
"style": "gpio_blocks"
|
2023-06-25 12:18:33 +00:00
|
|
|
|
}]);
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_i2c_write_byte_data'] = function (block, generator) {
|
2023-06-25 12:18:33 +00:00
|
|
|
|
var variable_i2c_hand = Blockly.JavaScript.nameDB_.getName(block.getFieldValue('i2c_hand'), Blockly.Names.NameType.VARIABLE);
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var value_reg = Blockly.JavaScript.valueToCode(block, 'reg', Blockly.JavaScript.ORDER_ATOMIC);
|
2021-08-29 14:44:58 +00:00
|
|
|
|
var value_byte_val = Blockly.JavaScript.valueToCode(block, 'byte_val', Blockly.JavaScript.ORDER_ATOMIC);
|
2023-06-25 12:18:33 +00:00
|
|
|
|
var code = `await _rg.i2c_write_byte_data(${variable_i2c_hand}, ${value_reg}, ${value_byte_val});\n`;
|
2021-08-29 14:44:58 +00:00
|
|
|
|
return code;
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
python.pythonGenerator.forBlock['ugj_i2c_write_byte_data'] = function (block, generator) {
|
2022-07-26 08:09:53 +00:00
|
|
|
|
var value_reg = Blockly.Python.valueToCode(block, 'reg', Blockly.Python.ORDER_ATOMIC);
|
|
|
|
|
var value_byte_val = Blockly.Python.valueToCode(block, 'byte_val', Blockly.Python.ORDER_ATOMIC);
|
|
|
|
|
var code = `_i2c_hand.writeto_mem(_addr, ${value_reg}, (${value_byte_val}).to_bytes(1,'big'))\n`;
|
|
|
|
|
return code;
|
|
|
|
|
};
|
2020-01-21 07:10:10 +00:00
|
|
|
|
|
|
|
|
|
/****************************************************************** */
|
|
|
|
|
/** Read a single byte from the specified resister of the device ** */
|
|
|
|
|
/****************************************************************** */
|
2023-06-25 12:18:33 +00:00
|
|
|
|
Blockly.defineBlocksWithJsonArray([{
|
2021-08-29 14:44:58 +00:00
|
|
|
|
"type": "ugj_i2c_read_byte_data",
|
2023-06-25 12:18:33 +00:00
|
|
|
|
"message0": "%1 %2 のレジスタ %3 の値",
|
2021-08-29 14:44:58 +00:00
|
|
|
|
"args0": [
|
2023-06-25 12:18:33 +00:00
|
|
|
|
{
|
|
|
|
|
"type": "field_variable",
|
|
|
|
|
"name": "i2c_hand",
|
|
|
|
|
"variable": "I2Cデバイス"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"type": "input_dummy"
|
|
|
|
|
},
|
2021-08-29 14:44:58 +00:00
|
|
|
|
{
|
|
|
|
|
"type": "input_value",
|
|
|
|
|
"name": "reg",
|
|
|
|
|
"check": "Number"
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"inputsInline": true,
|
|
|
|
|
"output": null,
|
2023-06-25 12:18:33 +00:00
|
|
|
|
"tooltip": "I2C デバイスの指定されたレジスタから1バイトを読み込みます。",
|
2021-08-29 14:44:58 +00:00
|
|
|
|
"helpUrl": "",
|
|
|
|
|
"style": "gpio_blocks"
|
2023-06-25 12:18:33 +00:00
|
|
|
|
}]);
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_i2c_read_byte_data'] = function (block, generator) {
|
2023-06-25 12:18:33 +00:00
|
|
|
|
var variable_i2c_hand = Blockly.JavaScript.nameDB_.getName(block.getFieldValue('i2c_hand'), Blockly.Names.NameType.VARIABLE);
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var value_reg = Blockly.JavaScript.valueToCode(block, 'reg', Blockly.JavaScript.ORDER_ATOMIC);
|
2023-06-25 12:18:33 +00:00
|
|
|
|
var code = `await _rg.i2c_read_byte_data(${variable_i2c_hand}, ${value_reg})`;
|
2021-09-18 14:29:06 +00:00
|
|
|
|
return [code, Blockly.JavaScript.ORDER_ATOMIC];
|
2020-01-21 07:10:10 +00:00
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
python.pythonGenerator.forBlock['ugj_i2c_read_byte_data'] = function (block, generator) {
|
2022-07-26 08:09:53 +00:00
|
|
|
|
var value_reg = Blockly.Python.valueToCode(block, 'reg', Blockly.Python.ORDER_ATOMIC);
|
|
|
|
|
var code = `int.from_bytes(_i2c_hand.readfrom_mem(_addr, ${value_reg}, 1), 'big')\n`;
|
|
|
|
|
return [code, Blockly.Python.ORDER_ATOMIC];
|
|
|
|
|
};
|
2020-01-21 07:10:10 +00:00
|
|
|
|
|
2023-06-25 12:18:33 +00:00
|
|
|
|
/************************************************************************ */
|
|
|
|
|
/** Reads a single 16 bit word from the specified register of the device. */
|
|
|
|
|
/************************************************************************ */
|
2021-12-30 14:11:01 +00:00
|
|
|
|
Blockly.Blocks['ugj_i2c_read_word_data'] = {
|
|
|
|
|
init: function () {
|
2023-06-25 12:18:33 +00:00
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.appendField(new Blockly.FieldVariable("I2Cデバイス"), "i2c_hand")
|
2021-12-30 14:11:01 +00:00
|
|
|
|
this.appendValueInput("reg")
|
|
|
|
|
.setCheck("Number")
|
|
|
|
|
.appendField("レジスタ");
|
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.appendField("のワード値");
|
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setOutput(true, "Number");
|
|
|
|
|
this.setStyle('gpio_blocks');
|
|
|
|
|
this.setTooltip("デバイスの指定レジスタからワードデータを読み出します。");
|
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_i2c_read_word_data'] = function (block, generator) {
|
2023-06-25 12:18:33 +00:00
|
|
|
|
var variable_i2c_hand = Blockly.JavaScript.nameDB_.getName(block.getFieldValue('i2c_hand'), Blockly.Names.NameType.VARIABLE);
|
2021-12-30 14:11:01 +00:00
|
|
|
|
var value_reg = Blockly.JavaScript.valueToCode(block, 'reg', Blockly.JavaScript.ORDER_ATOMIC);
|
2023-06-25 12:18:33 +00:00
|
|
|
|
var code = `await _rg.i2c_read_word_data(${variable_i2c_hand}, ${value_reg})`;
|
2021-12-30 14:11:01 +00:00
|
|
|
|
return [code, Blockly.JavaScript.ORDER_ATOMIC];
|
|
|
|
|
};
|
|
|
|
|
|
2023-06-25 12:18:33 +00:00
|
|
|
|
/***************************************************************** */
|
|
|
|
|
/** Writes up to 32 bytes to the specified register of the device. */
|
|
|
|
|
/***************************************************************** */
|
|
|
|
|
Blockly.defineBlocksWithJsonArray([{
|
2021-10-11 14:40:18 +00:00
|
|
|
|
"type": "ugj_i2c_write_i2c_block_data",
|
2023-06-25 12:18:33 +00:00
|
|
|
|
"message0": "%1 %2 のレジスタ %3 に %4 を書き込む",
|
2021-10-11 14:40:18 +00:00
|
|
|
|
"args0": [
|
2023-06-25 12:18:33 +00:00
|
|
|
|
{
|
|
|
|
|
"type": "field_variable",
|
|
|
|
|
"name": "i2c_hand",
|
|
|
|
|
"variable": "I2Cデバイス"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"type": "input_dummy"
|
|
|
|
|
},
|
2021-10-11 14:40:18 +00:00
|
|
|
|
{
|
|
|
|
|
"type": "input_value",
|
|
|
|
|
"name": "reg",
|
|
|
|
|
"check": "Number"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"type": "input_value",
|
|
|
|
|
"name": "data",
|
|
|
|
|
"check": "String"
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"inputsInline": true,
|
|
|
|
|
"previousStatement": null,
|
|
|
|
|
"nextStatement": null,
|
2023-06-25 12:18:33 +00:00
|
|
|
|
"tooltip": "I2C デバイスの指定されたレジスタに最大32バイトのテキストデータを書き込みます。",
|
2021-10-11 14:40:18 +00:00
|
|
|
|
"helpUrl": "",
|
|
|
|
|
"style": "gpio_blocks"
|
2023-06-25 12:18:33 +00:00
|
|
|
|
}]);
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_i2c_write_i2c_block_data'] = function (block, generator) {
|
2023-06-25 12:18:33 +00:00
|
|
|
|
var variable_i2c_hand = Blockly.JavaScript.nameDB_.getName(block.getFieldValue('i2c_hand'), Blockly.Names.NameType.VARIABLE);
|
2021-10-11 14:40:18 +00:00
|
|
|
|
var value_reg = Blockly.JavaScript.valueToCode(block, 'reg', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var value_data = Blockly.JavaScript.valueToCode(block, 'data', Blockly.JavaScript.ORDER_ATOMIC);
|
2023-06-25 12:18:33 +00:00
|
|
|
|
var code = `await _rg.i2c_write_i2c_block_data (${variable_i2c_hand}, ${value_reg}, ${value_data});`;
|
2021-10-11 14:40:18 +00:00
|
|
|
|
return code;
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
python.pythonGenerator.forBlock['ugj_i2c_write_i2c_block_data'] = function (block, generator) {
|
2022-07-26 08:09:53 +00:00
|
|
|
|
var value_reg = Blockly.Python.valueToCode(block, 'reg', Blockly.Python.ORDER_ATOMIC);
|
|
|
|
|
var value_data = Blockly.Python.valueToCode(block, 'data', Blockly.Python.ORDER_ATOMIC);
|
|
|
|
|
var code = `_i2c_hand.writeto_mem(_addr, ${value_reg}, bytearray(${value_data}))\n`;
|
|
|
|
|
return code;
|
|
|
|
|
};
|
2021-10-11 14:40:18 +00:00
|
|
|
|
|
2021-09-18 14:29:06 +00:00
|
|
|
|
/************************************************************************** */
|
|
|
|
|
/** Returns count bytes read from the raw device associated with handle. ** */
|
|
|
|
|
/************************************************************************** */
|
2023-06-25 12:18:33 +00:00
|
|
|
|
Blockly.defineBlocksWithJsonArray([{
|
2021-09-18 14:29:06 +00:00
|
|
|
|
"type": "ugj_i2c_read_device",
|
2023-06-25 12:18:33 +00:00
|
|
|
|
"message0": "%1 %2 から %3 文字受け取る",
|
2021-09-18 14:29:06 +00:00
|
|
|
|
"args0": [
|
2023-06-25 12:18:33 +00:00
|
|
|
|
{
|
|
|
|
|
"type": "field_variable",
|
|
|
|
|
"name": "i2c_hand",
|
|
|
|
|
"variable": "I2Cデバイス"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"type": "input_dummy"
|
|
|
|
|
},
|
2021-09-18 14:29:06 +00:00
|
|
|
|
{
|
|
|
|
|
"type": "input_value",
|
|
|
|
|
"name": "count",
|
|
|
|
|
"check": "Number"
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"inputsInline": true,
|
|
|
|
|
"output": null,
|
2023-06-25 12:18:33 +00:00
|
|
|
|
"tooltip": "I2C デバイスから指定したバイト数のデータを受け取ります。データが指定の長さより短いこともあります。",
|
2021-09-18 14:29:06 +00:00
|
|
|
|
"helpUrl": "",
|
|
|
|
|
"style": "gpio_blocks"
|
2023-06-25 12:18:33 +00:00
|
|
|
|
}]);
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_i2c_read_device'] = function (block, generator) {
|
2023-06-25 12:18:33 +00:00
|
|
|
|
var variable_i2c_hand = Blockly.JavaScript.nameDB_.getName(block.getFieldValue('i2c_hand'), Blockly.Names.NameType.VARIABLE);
|
2021-09-18 14:29:06 +00:00
|
|
|
|
var value_count = Blockly.JavaScript.valueToCode(block, 'count', Blockly.JavaScript.ORDER_ATOMIC);
|
2023-06-25 12:18:33 +00:00
|
|
|
|
var code = `await _rg.i2c_read_device(${variable_i2c_hand}, ${value_count})`;
|
2021-09-18 14:29:06 +00:00
|
|
|
|
return [code, Blockly.JavaScript.ORDER_ATOMIC];
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
// python.pythonGenerator.forBlock['ugj_i2c_read_device'] = function (block, generator) {
|
2022-07-10 13:04:56 +00:00
|
|
|
|
// var value_count = Blockly.Python.valueToCode(block, 'count', Blockly.Python.ORDER_ATOMIC);
|
|
|
|
|
// var code = `await pi.i2c_read_device(i2c_hand, ${value_count}).decode()`;
|
|
|
|
|
// return [code, Blockly.Python.ORDER_ATOMIC];
|
|
|
|
|
// };
|
2021-09-18 14:29:06 +00:00
|
|
|
|
/********************************************** */
|
|
|
|
|
/** Writes the data bytes to the raw device. ** */
|
|
|
|
|
/********************************************** */
|
2023-06-25 12:18:33 +00:00
|
|
|
|
Blockly.defineBlocksWithJsonArray([{
|
2021-09-18 14:29:06 +00:00
|
|
|
|
"type": "ugj_i2c_write_device",
|
2023-06-25 12:18:33 +00:00
|
|
|
|
"message0": "%1 %2 に %3 を送信",
|
2021-09-18 14:29:06 +00:00
|
|
|
|
"args0": [
|
2023-06-25 12:18:33 +00:00
|
|
|
|
{
|
|
|
|
|
"type": "field_variable",
|
|
|
|
|
"name": "i2c_hand",
|
|
|
|
|
"variable": "I2Cデバイス"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"type": "input_dummy"
|
|
|
|
|
},
|
2021-09-18 14:29:06 +00:00
|
|
|
|
{
|
|
|
|
|
"type": "input_value",
|
|
|
|
|
"name": "data",
|
|
|
|
|
"check": "String"
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"inputsInline": true,
|
|
|
|
|
"previousStatement": null,
|
|
|
|
|
"nextStatement": null,
|
2023-06-25 12:18:33 +00:00
|
|
|
|
"tooltip": "I2C デバイスにデータを送信します。",
|
2021-09-18 14:29:06 +00:00
|
|
|
|
"helpUrl": "",
|
|
|
|
|
"style": "gpio_blocks"
|
2023-06-25 12:18:33 +00:00
|
|
|
|
}]);
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_i2c_write_device'] = function (block, generator) {
|
2023-06-25 12:18:33 +00:00
|
|
|
|
var variable_i2c_hand = Blockly.JavaScript.nameDB_.getName(block.getFieldValue('i2c_hand'), Blockly.Names.NameType.VARIABLE);
|
2021-09-18 14:29:06 +00:00
|
|
|
|
var value_data = Blockly.JavaScript.valueToCode(block, 'data', Blockly.JavaScript.ORDER_ATOMIC);
|
2023-06-25 12:18:33 +00:00
|
|
|
|
var code = `await _rg.i2c_write_device(${variable_i2c_hand}, ${value_data})\n`;
|
2021-09-18 14:29:06 +00:00
|
|
|
|
return code;
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
// python.pythonGenerator.forBlock['ugj_i2c_write_device'] = function (block, generator) {
|
2022-07-10 13:04:56 +00:00
|
|
|
|
// var value_data = Blockly.Python.valueToCode(block, 'data', Blockly.Python.ORDER_ATOMIC);
|
|
|
|
|
// var code = `await pi.i2c_write_device(i2c_hand, ${value_data}.encode())\n`;
|
|
|
|
|
// return code;
|
|
|
|
|
// };
|
2021-10-31 04:27:59 +00:00
|
|
|
|
|
2021-10-22 14:33:59 +00:00
|
|
|
|
|
2020-01-21 07:10:10 +00:00
|
|
|
|
/** Multimedia *****************************************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/******************** */
|
|
|
|
|
/** Face Detection ** */
|
|
|
|
|
/******************** */
|
|
|
|
|
Blockly.Blocks['ugj_face_init'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.appendDummyInput()
|
2022-02-14 05:59:34 +00:00
|
|
|
|
.appendField("顔検出を開始");
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setPreviousStatement(true, null);
|
|
|
|
|
this.setNextStatement(true, null);
|
2021-11-19 13:12:03 +00:00
|
|
|
|
this.setStyle('multimedia_blocks');
|
2022-02-14 05:59:34 +00:00
|
|
|
|
this.setTooltip("Blazeface detector モデルによる顔検出を開始します。最初に実行してください");
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_face_init'] = function (block, generator) {
|
2022-02-14 05:59:34 +00:00
|
|
|
|
Blockly.JavaScript.provideFunction_(
|
2022-12-20 14:16:28 +00:00
|
|
|
|
'require_tfjs', [`const _tf = require('@tensorflow/tfjs-node');`]
|
2022-02-14 05:59:34 +00:00
|
|
|
|
);
|
|
|
|
|
Blockly.JavaScript.provideFunction_(
|
|
|
|
|
'require_blazeface', [`const _blazeface = require('@tensorflow-models/blazeface');`]
|
|
|
|
|
);
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var code = [
|
2021-11-27 12:43:53 +00:00
|
|
|
|
"const _videoEl = document.getElementById('subdisplay');",
|
2021-11-28 13:36:12 +00:00
|
|
|
|
`const _displaySize = { width: _videoEl.width, height: _videoEl.height };`,
|
2021-11-27 12:43:53 +00:00
|
|
|
|
"const _stream = await navigator.mediaDevices.getUserMedia({ audio: false, video: _displaySize });",
|
|
|
|
|
"_videoEl.srcObject = _stream;",
|
2022-02-14 05:59:34 +00:00
|
|
|
|
`const _model = await _blazeface.load();`,
|
2020-01-21 07:10:10 +00:00
|
|
|
|
""
|
|
|
|
|
].join('\n');
|
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
Blockly.Blocks['ugj_face_display'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.appendDummyInput()
|
2022-02-14 05:59:34 +00:00
|
|
|
|
.appendField("顔検出ビデオを表示");
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setPreviousStatement(true, null);
|
|
|
|
|
this.setNextStatement(true, null);
|
2022-02-14 05:59:34 +00:00
|
|
|
|
this.setStyle('multimedia_blocks');
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setTooltip("カメラの映像を画像エリアに表示します。必須ではないブロックです。");
|
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_face_display'] = function (block, generator) {
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var code = [
|
2021-11-27 12:43:53 +00:00
|
|
|
|
"_videoEl.style.display = 'inline-block';",
|
|
|
|
|
`const _overlay = document.createElement('canvas');`,
|
|
|
|
|
`_overlay.setAttribute('width', _videoEl.width);`,
|
|
|
|
|
`_overlay.setAttribute('height', _videoEl.height);`,
|
|
|
|
|
`_overlay.className = 'subdisplay';`,
|
|
|
|
|
`document.getElementById('display_area').appendChild(_overlay);`,
|
2022-02-14 05:59:34 +00:00
|
|
|
|
`const _overlay_ctx = _overlay.getContext('2d');`,
|
2020-01-21 07:10:10 +00:00
|
|
|
|
""
|
|
|
|
|
].join('\n');
|
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
Blockly.Blocks['ugj_face_detect'] = {
|
|
|
|
|
init: function () {
|
2022-02-14 05:59:34 +00:00
|
|
|
|
this.appendValueInput("preditions")
|
|
|
|
|
.setCheck("Variable")
|
|
|
|
|
.appendField("顔検出を実行し、結果をリスト");
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.appendDummyInput()
|
2022-02-14 05:59:34 +00:00
|
|
|
|
.appendField("に代入する");
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setPreviousStatement(true, null);
|
2022-02-14 05:59:34 +00:00
|
|
|
|
this.setNextStatement(true, null);
|
|
|
|
|
this.setTooltip("顔検出を実行します。検出結果はリストになります。顔の位置は「顔の座標」ブロックで参照します。");
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setHelpUrl("");
|
2022-01-11 05:03:17 +00:00
|
|
|
|
this.setStyle('multimedia_blocks');
|
2020-01-21 07:10:10 +00:00
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_face_detect'] = function (block, generator) {
|
2022-02-14 05:59:34 +00:00
|
|
|
|
var value_preditions = Blockly.JavaScript.valueToCode(block, 'preditions', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var code = `${value_preditions} = await _model.estimateFaces(_videoEl, false);`;
|
2020-01-21 07:10:10 +00:00
|
|
|
|
return code;
|
|
|
|
|
};
|
2022-02-14 05:59:34 +00:00
|
|
|
|
Blockly.Blocks['ugj_face_location'] = {
|
2022-01-11 05:03:17 +00:00
|
|
|
|
init: function () {
|
2022-02-14 05:59:34 +00:00
|
|
|
|
this.appendValueInput("prediction")
|
|
|
|
|
.setCheck("Array")
|
|
|
|
|
.appendField("顔");
|
2022-01-11 05:03:17 +00:00
|
|
|
|
this.appendDummyInput()
|
2022-02-14 05:59:34 +00:00
|
|
|
|
.appendField("の")
|
|
|
|
|
.appendField(new Blockly.FieldDropdown([["左座標", "topLeft[0]"], ["上座標", "topLeft[1]"], ["右座標", "bottomRight[0]"], ["下座標", "bottomRight[1]"]]), "member");
|
2022-01-11 05:03:17 +00:00
|
|
|
|
this.setInputsInline(true);
|
2022-02-14 05:59:34 +00:00
|
|
|
|
this.setOutput(true, "Number");
|
|
|
|
|
this.setTooltip("顔検出結果の座標を参照します。");
|
2022-01-11 05:03:17 +00:00
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
this.setStyle('multimedia_blocks');
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_face_location'] = function (block, generator) {
|
2022-02-14 05:59:34 +00:00
|
|
|
|
var value_prediction = Blockly.JavaScript.valueToCode(block, 'prediction', Blockly.JavaScript.ORDER_NONE);
|
|
|
|
|
var dropdown_member = block.getFieldValue('member');
|
|
|
|
|
var code = `${value_prediction}.${dropdown_member}`;
|
2022-01-11 05:03:17 +00:00
|
|
|
|
return [code, Blockly.JavaScript.ORDER_NONE];
|
|
|
|
|
};
|
2022-02-14 05:59:34 +00:00
|
|
|
|
Blockly.Blocks['ugj_face_draw'] = {
|
2020-01-21 07:10:10 +00:00
|
|
|
|
init: function () {
|
2022-02-14 05:59:34 +00:00
|
|
|
|
this.appendValueInput("prediction")
|
|
|
|
|
.setCheck("Variable")
|
|
|
|
|
.appendField("顔");
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.appendDummyInput()
|
2022-02-14 05:59:34 +00:00
|
|
|
|
.appendField("を描画:")
|
|
|
|
|
.appendField(new Blockly.FieldCheckbox("TRUE"), "with_landmark")
|
|
|
|
|
.appendField("ランドマーク");
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setPreviousStatement(true, null);
|
|
|
|
|
this.setNextStatement(true, null);
|
2022-02-14 05:59:34 +00:00
|
|
|
|
this.setTooltip("顔検出結果をビデオ画面に描画します。「ビデオを表示」ブロックが必要です。");
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setHelpUrl("");
|
2022-02-14 05:59:34 +00:00
|
|
|
|
this.setStyle('multimedia_blocks');
|
2020-01-21 07:10:10 +00:00
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_face_draw'] = function (block, generator) {
|
2022-02-14 05:59:34 +00:00
|
|
|
|
var value_prediction = Blockly.JavaScript.valueToCode(block, 'prediction', Blockly.JavaScript.ORDER_NONE);
|
|
|
|
|
var checkbox_with_landmark = block.getFieldValue('with_landmark') === 'TRUE';
|
|
|
|
|
var code = `const _start = ${value_prediction}.topLeft;
|
|
|
|
|
const _end = ${value_prediction}.bottomRight;
|
|
|
|
|
const _size = [_end[0] - _start[0], _end[1] - _start[1]];
|
|
|
|
|
_overlay_ctx.clearRect(0, 0, _displaySize.width, _displaySize.height)
|
|
|
|
|
_overlay_ctx.fillStyle = 'rgba(255, 0, 0, 0.5)';
|
|
|
|
|
_overlay_ctx.fillRect(_start[0], _start[1], _size[0], _size[1]);
|
|
|
|
|
if (${checkbox_with_landmark}) {
|
|
|
|
|
const _landmarks = ${value_prediction}.landmarks;
|
|
|
|
|
_overlay_ctx.fillStyle = 'blue';
|
|
|
|
|
for (let _j = 0; _j < _landmarks.length; _j++) {
|
|
|
|
|
const _x = _landmarks[_j][0];
|
|
|
|
|
const _y = _landmarks[_j][1];
|
|
|
|
|
_overlay_ctx.fillRect(_x, _y, 5, 5);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
`;
|
2020-01-21 07:10:10 +00:00
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
|
2022-12-20 14:16:28 +00:00
|
|
|
|
/******************************* */
|
|
|
|
|
/** Speech Commands Recognizer * */
|
|
|
|
|
/******************************* */
|
|
|
|
|
Blockly.Blocks['oc_speechcommands_init'] = {
|
|
|
|
|
init: function () {
|
2023-01-01 07:21:29 +00:00
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.appendField("音声コマンド認識を開始");
|
2022-12-20 14:16:28 +00:00
|
|
|
|
this.appendValueInput("custom_model")
|
|
|
|
|
.setCheck("String")
|
2023-01-01 07:21:29 +00:00
|
|
|
|
.setAlign(Blockly.ALIGN_RIGHT)
|
|
|
|
|
.appendField("カスタムモデル");
|
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.setAlign(Blockly.ALIGN_RIGHT)
|
|
|
|
|
.appendField(new Blockly.FieldVariable("ラベル"), "classlabels")
|
|
|
|
|
.appendField("を取得");
|
|
|
|
|
this.setInputsInline(false);
|
2022-12-20 14:16:28 +00:00
|
|
|
|
this.setPreviousStatement(true, null);
|
|
|
|
|
this.setNextStatement(true, null);
|
2023-01-01 07:21:29 +00:00
|
|
|
|
this.setTooltip("Tensorflow 音声コマンド認識モデルを初期化します。Google Teachable Machine で作成したカスタムモデルのフォルダパスを指定します。モデルに含まれるラベルのリストを取得し変数に代入します。");
|
2022-12-20 14:16:28 +00:00
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
this.setStyle('multimedia_blocks');
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['oc_speechcommands_init'] = function (block, generator) {
|
2022-12-20 14:16:28 +00:00
|
|
|
|
var value_custom_model = Blockly.JavaScript.valueToCode(block, 'custom_model', Blockly.JavaScript.ORDER_NONE);
|
2023-01-01 07:21:29 +00:00
|
|
|
|
var variable_classlabels = Blockly.JavaScript.nameDB_.getName(block.getFieldValue('classlabels'), Blockly.Names.NameType.VARIABLE);
|
2022-12-20 14:16:28 +00:00
|
|
|
|
Blockly.JavaScript.provideFunction_(
|
|
|
|
|
'require_tfjs', [`const _tf = require('@tensorflow/tfjs-node');`]
|
|
|
|
|
);
|
|
|
|
|
Blockly.JavaScript.provideFunction_(
|
|
|
|
|
'require_speechcommands', [`const _speechcommands = require('@tensorflow-models/speech-commands');`]
|
|
|
|
|
);
|
|
|
|
|
// Check empty
|
|
|
|
|
let cp = undefined, md = undefined;
|
|
|
|
|
if (value_custom_model != "''") {
|
|
|
|
|
let cm = value_custom_model.replace(/(^'|'$)/g, '');
|
2023-01-01 13:05:12 +00:00
|
|
|
|
cp = `'file://${apptool.path.join(cm, 'model.json')}'`;
|
|
|
|
|
md = `'file://${apptool.path.join(cm, 'metadata.json')}'`;
|
2022-12-20 14:16:28 +00:00
|
|
|
|
}
|
|
|
|
|
var code = `const _checkpointURL = ${cp};
|
|
|
|
|
const _metadataURL = ${md};
|
|
|
|
|
const _recognizer = _speechcommands.create(
|
|
|
|
|
"BROWSER_FFT",
|
|
|
|
|
undefined,
|
|
|
|
|
_checkpointURL,
|
|
|
|
|
_metadataURL);
|
|
|
|
|
await _recognizer.ensureModelLoaded();
|
2023-01-01 07:21:29 +00:00
|
|
|
|
${variable_classlabels} = _recognizer.wordLabels();
|
2022-12-20 14:16:28 +00:00
|
|
|
|
`;
|
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
Blockly.Blocks['oc_speechcommand_listen'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.appendDummyInput()
|
2023-01-01 07:21:29 +00:00
|
|
|
|
.appendField("音声コマンドを認識したら");
|
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.setAlign(Blockly.ALIGN_RIGHT)
|
2022-12-20 14:16:28 +00:00
|
|
|
|
.appendField(new Blockly.FieldVariable("スコア"), "scores")
|
2023-01-01 07:21:29 +00:00
|
|
|
|
.appendField("を取得");
|
2022-12-20 14:16:28 +00:00
|
|
|
|
this.appendStatementInput("do")
|
|
|
|
|
.setCheck(null);
|
2023-01-12 12:59:17 +00:00
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.setAlign(Blockly.ALIGN_RIGHT)
|
|
|
|
|
.appendField("オーバーラップ係数")
|
|
|
|
|
.appendField(new FieldSlider(0.5, 0, 1, 0.05), "overlapFactor");
|
2023-01-01 07:21:29 +00:00
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.setAlign(Blockly.ALIGN_RIGHT)
|
|
|
|
|
.appendField("スコアしきい値")
|
|
|
|
|
.appendField(new FieldSlider(0.75, 0, 1, 0.05), "probabilityThreshold");
|
|
|
|
|
this.setInputsInline(false);
|
2022-12-20 14:16:28 +00:00
|
|
|
|
this.setPreviousStatement(true, null);
|
|
|
|
|
this.setNextStatement(true, null);
|
2023-01-01 07:21:29 +00:00
|
|
|
|
this.setTooltip("音声コマンドを認識するとステートメントを実行します。「スコア」は「ラベル」に対応するリストです。");
|
2022-12-20 14:16:28 +00:00
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
this.setStyle('multimedia_blocks');
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['oc_speechcommand_listen'] = function (block, generator) {
|
2022-12-20 14:16:28 +00:00
|
|
|
|
var variable_scores = Blockly.JavaScript.nameDB_.getName(block.getFieldValue('scores'), Blockly.Names.NameType.VARIABLE);
|
|
|
|
|
var statements_do = Blockly.JavaScript.statementToCode(block, 'do');
|
2023-01-01 07:21:29 +00:00
|
|
|
|
var number_probabilitythreshold = block.getFieldValue('probabilityThreshold');
|
2023-01-12 12:59:17 +00:00
|
|
|
|
var number_overlapfactor = block.getFieldValue('overlapFactor');
|
2023-01-01 07:21:29 +00:00
|
|
|
|
var code = `_recognizer.listen(_result => {
|
2022-12-20 14:16:28 +00:00
|
|
|
|
${variable_scores} = _result.scores;
|
|
|
|
|
${statements_do}
|
|
|
|
|
}, {
|
2023-01-12 12:59:17 +00:00
|
|
|
|
overlapFactor: ${number_overlapfactor},
|
2023-01-01 07:21:29 +00:00
|
|
|
|
probabilityThreshold: ${number_probabilitythreshold}
|
2022-12-20 14:16:28 +00:00
|
|
|
|
});
|
|
|
|
|
`;
|
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
|
2020-01-21 07:10:10 +00:00
|
|
|
|
/**************************** */
|
|
|
|
|
/** Say while some seconds ** */
|
|
|
|
|
/**************************** */
|
|
|
|
|
Blockly.Blocks['ugj_canvas_say'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.appendValueInput("say")
|
2021-09-18 14:29:06 +00:00
|
|
|
|
.setCheck(null);
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.appendDummyInput()
|
2023-01-01 07:21:29 +00:00
|
|
|
|
.appendField("と")
|
|
|
|
|
.appendField(new FieldSlider(2, 0, 30, 1), "sec")
|
2020-01-21 07:10:10 +00:00
|
|
|
|
.appendField("秒言う");
|
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setPreviousStatement(true, null);
|
|
|
|
|
this.setNextStatement(true, null);
|
2021-01-20 13:26:39 +00:00
|
|
|
|
this.setStyle('multimedia_blocks')
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setTooltip("キャンバスにフキダシを作ります。");
|
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_canvas_say'] = function (block, generator) {
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var value_say = Blockly.JavaScript.valueToCode(block, 'say', Blockly.JavaScript.ORDER_ATOMIC);
|
2023-01-01 07:21:29 +00:00
|
|
|
|
var value_sec = block.getFieldValue('sec');
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var code = [
|
2022-03-02 11:25:14 +00:00
|
|
|
|
`_fukidashi(String(${value_say}), ${value_sec});`,
|
2020-01-21 07:10:10 +00:00
|
|
|
|
''
|
|
|
|
|
].join('\n');
|
|
|
|
|
return code;
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
python.pythonGenerator.forBlock['ugj_canvas_say'] = function (block, generator) {
|
2021-09-18 14:29:06 +00:00
|
|
|
|
var value_say = Blockly.Python.valueToCode(block, 'say', Blockly.Python.ORDER_ATOMIC);
|
|
|
|
|
var value_sec = Blockly.Python.valueToCode(block, 'sec', Blockly.Python.ORDER_ATOMIC);
|
|
|
|
|
var code = `print(${value_say})\n`;
|
|
|
|
|
return code;
|
|
|
|
|
};
|
2020-01-21 07:10:10 +00:00
|
|
|
|
|
|
|
|
|
/*************************** */
|
|
|
|
|
/** Canvas Initialization ** */
|
|
|
|
|
/*************************** */
|
2021-08-28 14:28:26 +00:00
|
|
|
|
var ugj_canvas_init_definition = {
|
|
|
|
|
"type": "ugj_canvas_init",
|
|
|
|
|
"message0": "%{BKY_UGJ_CANVAS_INIT_TITLE}",
|
|
|
|
|
"previousStatement": null,
|
|
|
|
|
"nextStatement": null,
|
|
|
|
|
"tooltip": "%{BKY_UGJ_CANVAS_INIT_TOOLTIP}",
|
|
|
|
|
"helpUrl": "",
|
|
|
|
|
"style": "multimedia_blocks"
|
|
|
|
|
}
|
2020-01-21 07:10:10 +00:00
|
|
|
|
Blockly.Blocks['ugj_canvas_init'] = {
|
|
|
|
|
init: function () {
|
2021-08-28 14:28:26 +00:00
|
|
|
|
this.jsonInit(ugj_canvas_init_definition);
|
2020-01-21 07:10:10 +00:00
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_canvas_init'] = function (block, generator) {
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var code = [
|
2021-11-27 12:43:53 +00:00
|
|
|
|
`let _canvas = document.getElementById('gcanvas');`,
|
|
|
|
|
`_canvas.style.display = 'inline-block';`,
|
|
|
|
|
"let _ctx = _canvas.getContext('2d');",
|
2020-01-21 07:10:10 +00:00
|
|
|
|
''
|
|
|
|
|
].join('\n');
|
|
|
|
|
|
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/************************* */
|
|
|
|
|
/** Canvas Finalization ** */
|
|
|
|
|
/************************* */
|
|
|
|
|
Blockly.Blocks['ugj_canvas_finalize'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.appendField("キャンバスを片付ける");
|
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setPreviousStatement(true, null);
|
|
|
|
|
this.setNextStatement(true, null);
|
2021-01-20 13:26:39 +00:00
|
|
|
|
this.setStyle('multimedia_blocks')
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setTooltip("使ったキャンバスを片付けます。");
|
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_canvas_finalize'] = function (block, generator) {
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var code = `document.getElementById('gcanvas').style.display = 'none';\n`;
|
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**************************** */
|
|
|
|
|
/** Load Image File to Canvas */
|
|
|
|
|
/**************************** */
|
|
|
|
|
Blockly.Blocks['ugj_canvas_loadimg'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.appendValueInput("imgfilename")
|
|
|
|
|
.setCheck("String")
|
|
|
|
|
.appendField("ファイル名");
|
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.appendField("の画像をキャンバスに描画");
|
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setPreviousStatement(true, null);
|
|
|
|
|
this.setNextStatement(true, null);
|
2021-01-20 13:26:39 +00:00
|
|
|
|
this.setStyle('multimedia_blocks')
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setTooltip("画像ファイルの内容をキャンバス上にロードします。");
|
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_canvas_loadimg'] = function (block, generator) {
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var value_imgfilename = Blockly.JavaScript.valueToCode(block, 'imgfilename', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var code = [
|
2021-11-27 12:43:53 +00:00
|
|
|
|
`let _img = new Image();`,
|
2023-01-01 13:05:12 +00:00
|
|
|
|
`_img.src = '${apptool.doc_root}' + ${value_imgfilename};`,
|
2021-11-27 12:43:53 +00:00
|
|
|
|
`_img.onload = () => _ctx.drawImage(img,0,0);`,
|
2021-09-08 13:33:19 +00:00
|
|
|
|
// `ugj_canvasImg('${ugj_const.doc_root}' + ${value_imgfilename});`,
|
2020-01-21 07:10:10 +00:00
|
|
|
|
''
|
|
|
|
|
].join('\n');
|
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**************** */
|
|
|
|
|
/** Clear Rect ** */
|
|
|
|
|
/**************** */
|
|
|
|
|
Blockly.Blocks['ugj_canvas_clearrect'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.appendValueInput("x")
|
|
|
|
|
.setCheck("Number")
|
|
|
|
|
.appendField("長方形に消去:X");
|
|
|
|
|
this.appendValueInput("y")
|
|
|
|
|
.setCheck("Number")
|
|
|
|
|
.appendField("Y");
|
|
|
|
|
this.appendValueInput("w")
|
|
|
|
|
.setCheck("Number")
|
|
|
|
|
.appendField("幅");
|
|
|
|
|
this.appendValueInput("h")
|
|
|
|
|
.setCheck("Number")
|
|
|
|
|
.appendField("高さ");
|
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setPreviousStatement(true, null);
|
|
|
|
|
this.setNextStatement(true, null);
|
2021-01-20 13:26:39 +00:00
|
|
|
|
this.setStyle('multimedia_blocks')
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setTooltip("長方形に図形を消去します。左上の頂点の座標と、幅・高さを指定します。");
|
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_canvas_clearrect'] = function (block, generator) {
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var value_x = Blockly.JavaScript.valueToCode(block, 'x', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var value_y = Blockly.JavaScript.valueToCode(block, 'y', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var value_w = Blockly.JavaScript.valueToCode(block, 'w', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var value_h = Blockly.JavaScript.valueToCode(block, 'h', Blockly.JavaScript.ORDER_ATOMIC);
|
2021-11-27 12:43:53 +00:00
|
|
|
|
var code = `_ctx.clearRect(${value_x},${value_y}, ${value_w}, ${value_h});\n`;
|
2020-01-21 07:10:10 +00:00
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/********************** */
|
|
|
|
|
/** Get Canvas Width ** */
|
|
|
|
|
/********************** */
|
|
|
|
|
Blockly.Blocks['ugj_canvas_width'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.appendField("キャンバスの幅");
|
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setOutput(true, null);
|
|
|
|
|
this.setOutputShape(Blockly.OUTPUT_SHAPE_ROUND);
|
2021-01-20 13:26:39 +00:00
|
|
|
|
this.setStyle('multimedia_blocks')
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setTooltip("キャンバスの幅を取得します。");
|
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_canvas_width'] = function (block, generator) {
|
2021-11-27 12:43:53 +00:00
|
|
|
|
var code = '_canvas.width';
|
2020-01-21 07:10:10 +00:00
|
|
|
|
return [code, Blockly.JavaScript.ORDER_NONE];
|
|
|
|
|
};
|
|
|
|
|
/*********************** */
|
|
|
|
|
/** Get Canvas Height ** */
|
|
|
|
|
/*********************** */
|
|
|
|
|
Blockly.Blocks['ugj_canvas_height'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.appendField("キャンバスの高さ");
|
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setOutput(true, "Number");
|
|
|
|
|
this.setOutputShape(Blockly.OUTPUT_SHAPE_ROUND);
|
2021-01-20 13:26:39 +00:00
|
|
|
|
this.setStyle('multimedia_blocks')
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setTooltip("キャンバスの高さを取得します。");
|
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_canvas_height'] = function (block, generator) {
|
2021-11-27 12:43:53 +00:00
|
|
|
|
var code = '_canvas.height';
|
2020-01-21 07:10:10 +00:00
|
|
|
|
return [code, Blockly.JavaScript.ORDER_NONE];
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*************************** */
|
|
|
|
|
/** Draw Circle on Canvas ** */
|
|
|
|
|
/*************************** */
|
|
|
|
|
Blockly.Blocks['ugj_canvas_drawcircle'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.appendValueInput("x")
|
|
|
|
|
.setCheck("Number")
|
|
|
|
|
.appendField("中心の座標 X");
|
|
|
|
|
this.appendValueInput("y")
|
|
|
|
|
.setCheck("Number")
|
|
|
|
|
.appendField(", Y");
|
|
|
|
|
this.appendValueInput("r")
|
|
|
|
|
.setCheck("Number")
|
|
|
|
|
.appendField(", 半径");
|
|
|
|
|
this.appendValueInput("color")
|
|
|
|
|
.setCheck("Colour")
|
|
|
|
|
.appendField(", 塗りつぶしの色");
|
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.appendField("の円を描画");
|
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setPreviousStatement(true, null);
|
|
|
|
|
this.setNextStatement(true, null);
|
2021-01-20 13:26:39 +00:00
|
|
|
|
this.setStyle('multimedia_blocks')
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setTooltip("円を描画します。");
|
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_canvas_drawcircle'] = function (block, generator) {
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var value_x = Blockly.JavaScript.valueToCode(block, 'x', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var value_y = Blockly.JavaScript.valueToCode(block, 'y', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var value_r = Blockly.JavaScript.valueToCode(block, 'r', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var value_color = Blockly.JavaScript.valueToCode(block, 'color', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var code = [
|
2021-11-27 12:43:53 +00:00
|
|
|
|
'_ctx.beginPath();',
|
|
|
|
|
`_ctx.arc(${value_x}, ${value_y}, ${value_r}, 0, Math.PI*2);`,
|
|
|
|
|
`_ctx.fillStyle = ${value_color};`,
|
|
|
|
|
'_ctx.fill();',
|
|
|
|
|
'_ctx.closePath();',
|
2020-01-21 07:10:10 +00:00
|
|
|
|
''
|
|
|
|
|
].join('\n');
|
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/************************* */
|
|
|
|
|
/** Draw Rect on Canvas ** */
|
|
|
|
|
/************************* */
|
|
|
|
|
Blockly.Blocks['ugj_canvas_drawrect'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.appendValueInput("x")
|
|
|
|
|
.setCheck("Number")
|
|
|
|
|
.appendField("左上の座標 (X:");
|
|
|
|
|
this.appendValueInput("y")
|
|
|
|
|
.setCheck("Number")
|
|
|
|
|
.appendField(", Y:");
|
|
|
|
|
this.appendValueInput("w")
|
|
|
|
|
.setCheck("Number")
|
|
|
|
|
.appendField("), 幅:");
|
|
|
|
|
this.appendValueInput("h")
|
|
|
|
|
.setCheck("Number")
|
|
|
|
|
.appendField(", 高さ:");
|
|
|
|
|
this.appendValueInput("color")
|
|
|
|
|
.setCheck("Colour")
|
|
|
|
|
.appendField(", 塗りつぶしの色:");
|
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.appendField("の四角形を描画");
|
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setPreviousStatement(true, null);
|
|
|
|
|
this.setNextStatement(true, null);
|
2021-01-20 13:26:39 +00:00
|
|
|
|
this.setStyle('multimedia_blocks')
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setTooltip("キャンバス上に長方形を描画します。");
|
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_canvas_drawrect'] = function (block, generator) {
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var value_x = Blockly.JavaScript.valueToCode(block, 'x', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var value_y = Blockly.JavaScript.valueToCode(block, 'y', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var value_w = Blockly.JavaScript.valueToCode(block, 'w', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var value_h = Blockly.JavaScript.valueToCode(block, 'h', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var value_color = Blockly.JavaScript.valueToCode(block, 'color', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var code = [
|
2021-11-27 12:43:53 +00:00
|
|
|
|
`_ctx.beginPath();`,
|
|
|
|
|
`_ctx.rect(${value_x}, ${value_y}, ${value_w}, ${value_h});`,
|
|
|
|
|
`_ctx.fillStyle = ${value_color};`,
|
|
|
|
|
`_ctx.fill();`,
|
|
|
|
|
`_ctx.closePath();`,
|
2020-01-21 07:10:10 +00:00
|
|
|
|
''
|
|
|
|
|
].join('\n');
|
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/****************************** */
|
|
|
|
|
/** KeyUpDown Event Listener ** */
|
|
|
|
|
/****************************** */
|
|
|
|
|
Blockly.Blocks['ugj_event_key'] = {
|
|
|
|
|
init: function () {
|
2022-01-11 05:03:17 +00:00
|
|
|
|
this.appendValueInput("key")
|
|
|
|
|
.setCheck("Variable")
|
|
|
|
|
.appendField("キーボードの");
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.appendField("を")
|
|
|
|
|
.appendField(new Blockly.FieldDropdown([["押したとき", "keydown"], ["離したとき", "keyup"]]), "updown");
|
|
|
|
|
this.appendStatementInput("do")
|
|
|
|
|
.setCheck(null);
|
2022-06-07 11:14:29 +00:00
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.setAlign(Blockly.ALIGN_RIGHT)
|
|
|
|
|
.appendField("▼");
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setPreviousStatement(true, null);
|
|
|
|
|
this.setNextStatement(true, null);
|
|
|
|
|
this.setTooltip("キーボードを押したり離したりした時のアクションです。");
|
|
|
|
|
this.setHelpUrl("https://developer.mozilla.org/ja/docs/Web/API/KeyboardEvent/key/Key_Values");
|
2022-01-11 05:03:17 +00:00
|
|
|
|
this.setStyle('multimedia_blocks');
|
2020-01-21 07:10:10 +00:00
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_event_key'] = function (block, generator) {
|
2022-01-11 05:03:17 +00:00
|
|
|
|
var value_key = Blockly.JavaScript.valueToCode(block, 'key', Blockly.JavaScript.ORDER_ATOMIC);
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var dropdown_updown = block.getFieldValue('updown');
|
|
|
|
|
var statements_do = Blockly.JavaScript.statementToCode(block, 'do');
|
|
|
|
|
var code = [
|
2021-11-27 12:43:53 +00:00
|
|
|
|
`document.addEventListener('${dropdown_updown}', async (_e) => {`,
|
2022-01-11 05:03:17 +00:00
|
|
|
|
` ${value_key} = _e.key;`,
|
2020-01-21 07:10:10 +00:00
|
|
|
|
statements_do,
|
|
|
|
|
`}, false);`,
|
|
|
|
|
''
|
|
|
|
|
].join('\n');
|
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**************** */
|
|
|
|
|
/** Play Sound ** */
|
|
|
|
|
/**************** */
|
|
|
|
|
Blockly.Blocks['ugj_sound_play'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.appendField(new Blockly.FieldDropdown([["ニャー", "meow"], ["コン", "bounce"], ["チン", "type_chime"], ["ディン", "type_dink"], ["タイプ", "type_tap"], ["空白", "type_space"], ["改行", "type_return"]]), "sound")
|
|
|
|
|
.appendField("の音を鳴らす");
|
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setPreviousStatement(true, null);
|
|
|
|
|
this.setNextStatement(true, null);
|
2021-01-20 13:26:39 +00:00
|
|
|
|
this.setStyle('multimedia_blocks')
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setTooltip("音を鳴らします。");
|
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_sound_play'] = function (block, generator) {
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var dropdown_sound = block.getFieldValue('sound');
|
|
|
|
|
var code = `ugj_soundPlay('${dropdown_sound}');\n`;
|
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** Network *****************************************************************************************************/
|
|
|
|
|
/**************** */
|
|
|
|
|
/** TCP/IP Socket */
|
|
|
|
|
/**************** */
|
|
|
|
|
Blockly.Blocks['ugj_socket'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.appendValueInput("host")
|
|
|
|
|
.setCheck("String")
|
|
|
|
|
.appendField("ホスト");
|
|
|
|
|
this.appendValueInput("port")
|
|
|
|
|
.setCheck("Number")
|
|
|
|
|
.appendField("ポート");
|
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.appendField("で TCP 接続する");
|
|
|
|
|
this.appendStatementInput("connect")
|
|
|
|
|
.setCheck(null)
|
|
|
|
|
.appendField("接続したら");
|
|
|
|
|
this.appendStatementInput("data")
|
|
|
|
|
.setCheck(null)
|
|
|
|
|
.appendField(new Blockly.FieldVariable("受信データ"), "data")
|
|
|
|
|
.appendField("が来たら");
|
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setPreviousStatement(true, null);
|
2021-01-20 13:26:39 +00:00
|
|
|
|
this.setStyle('network_blocks')
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setTooltip("TCP接続(Telnet)でサーバーと接続します。");
|
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_socket'] = function (block, generator) {
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var value_host = Blockly.JavaScript.valueToCode(block, 'host', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var value_port = Blockly.JavaScript.valueToCode(block, 'port', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var statements_connect = Blockly.JavaScript.statementToCode(block, 'connect');
|
2023-06-25 12:18:33 +00:00
|
|
|
|
var variable_data = Blockly.JavaScript.nameDB_.getName(block.getFieldValue('data'), Blockly.Names.NameType.VARIABLE);
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var statements_data = Blockly.JavaScript.statementToCode(block, 'data');
|
2021-09-18 14:29:06 +00:00
|
|
|
|
Blockly.JavaScript.provideFunction_(
|
2021-11-27 12:43:53 +00:00
|
|
|
|
'require_net', [`const _net = require('net');`]
|
2021-09-18 14:29:06 +00:00
|
|
|
|
);
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var code = [
|
2021-11-27 12:43:53 +00:00
|
|
|
|
`var _client = _net.connect(${value_port}, ${value_host});`,
|
|
|
|
|
`_client.on('connect', async ()=>{`,
|
2020-01-21 07:10:10 +00:00
|
|
|
|
statements_connect,
|
2021-11-27 12:43:53 +00:00
|
|
|
|
`}).on('data', async _data=>{`,
|
|
|
|
|
`${variable_data} = _data.toString('utf-8', 0, _data.length);`,
|
2020-01-21 07:10:10 +00:00
|
|
|
|
statements_data,
|
|
|
|
|
`}).on('close', ()=>{`,
|
|
|
|
|
`console.log('Connection closed.');`,
|
|
|
|
|
`});`,
|
|
|
|
|
''
|
|
|
|
|
].join('\n');
|
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
/*************** */
|
|
|
|
|
/** Socket Write */
|
|
|
|
|
/*************** */
|
|
|
|
|
Blockly.Blocks['ugj_socket_write'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.appendValueInput("cmd")
|
|
|
|
|
.setCheck("String")
|
|
|
|
|
.appendField("TCP接続に");
|
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.appendField("を送信する");
|
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setPreviousStatement(true, null);
|
|
|
|
|
this.setNextStatement(true, null);
|
2021-01-20 13:26:39 +00:00
|
|
|
|
this.setStyle('network_blocks')
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setTooltip("TCP接続で開いたソケットにデータを書き込みます。");
|
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_socket_write'] = function (block, generator) {
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var value_cmd = Blockly.JavaScript.valueToCode(block, 'cmd', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var code = [
|
2021-11-27 12:43:53 +00:00
|
|
|
|
`_client.write(${value_cmd});`,
|
2020-01-21 07:10:10 +00:00
|
|
|
|
''
|
|
|
|
|
].join('\n');
|
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/************** */
|
|
|
|
|
/** HTTP Server */
|
|
|
|
|
/************** */
|
|
|
|
|
Blockly.Blocks['ugj_network_httpserver'] = {
|
|
|
|
|
init: function () {
|
2022-01-11 05:03:17 +00:00
|
|
|
|
this.appendValueInput("url")
|
|
|
|
|
.setCheck("Variable")
|
|
|
|
|
.appendField("Webサーバを起動してアクセスを待ち、");
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.appendField("へアクセスがあったら");
|
|
|
|
|
this.appendStatementInput("do")
|
|
|
|
|
.setCheck(null);
|
|
|
|
|
this.appendValueInput("response")
|
|
|
|
|
.setCheck(null)
|
|
|
|
|
.appendField("最後に");
|
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.appendField("を表示してアクセス待ちに戻る");
|
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setPreviousStatement(true, null);
|
|
|
|
|
this.setTooltip("HTTPサーバを起動します。ポートは3000固定です。");
|
|
|
|
|
this.setHelpUrl("");
|
2022-01-11 05:03:17 +00:00
|
|
|
|
this.setStyle('network_blocks')
|
2020-01-21 07:10:10 +00:00
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_network_httpserver'] = function (block, generator) {
|
2022-01-11 05:03:17 +00:00
|
|
|
|
var value_url = Blockly.JavaScript.valueToCode(block, 'url', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
// var variable_url = Blockly.JavaScript.nameDB_.getName(block.getFieldValue('URL'), Blockly.Variables.NAME_TYPE);
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var statements_do = Blockly.JavaScript.statementToCode(block, 'do');
|
|
|
|
|
var value_response = Blockly.JavaScript.valueToCode(block, 'response', Blockly.JavaScript.ORDER_ATOMIC);
|
2021-09-18 14:29:06 +00:00
|
|
|
|
Blockly.JavaScript.provideFunction_(
|
2021-11-27 12:43:53 +00:00
|
|
|
|
'require_http', [`const _http = require('http');`]
|
2021-09-18 14:29:06 +00:00
|
|
|
|
);
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var code = [
|
2021-11-27 12:43:53 +00:00
|
|
|
|
`let _req, _res;`,
|
|
|
|
|
`_http.createServer(async (_req, _res) => {`,
|
|
|
|
|
`_res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });`,
|
2022-01-11 05:03:17 +00:00
|
|
|
|
`${value_url} = _req.url;`,
|
2020-01-21 07:10:10 +00:00
|
|
|
|
statements_do,
|
2021-11-27 12:43:53 +00:00
|
|
|
|
// `_res.write('<!DOCTYPE html><html lang="ja"><head><meta charset="UTF-8"></head><body>');`,
|
|
|
|
|
`_res.end(${value_response});`,
|
2020-01-21 07:10:10 +00:00
|
|
|
|
`}).listen(3000);`,
|
|
|
|
|
''
|
|
|
|
|
].join('\n');
|
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/******************** */
|
|
|
|
|
/** axios HTTP client */
|
|
|
|
|
/******************** */
|
|
|
|
|
// Get URL
|
|
|
|
|
Blockly.Blocks['ugj_network_axios_geturl'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.appendValueInput("url")
|
|
|
|
|
.setCheck("String")
|
|
|
|
|
.appendField("URL");
|
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.appendField("の内容");
|
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setOutput(true, "String");
|
|
|
|
|
this.setOutputShape(Blockly.OUTPUT_SHAPE_ROUND);
|
2021-01-20 13:26:39 +00:00
|
|
|
|
this.setStyle('network_blocks')
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setTooltip("URLにGETリクエストを送信し、レスポンスを取得します。エラーの場合、HTTPステータスコードを返します。");
|
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_network_axios_geturl'] = function (block, generator) {
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var value_url = Blockly.JavaScript.valueToCode(block, 'url', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var functionName = Blockly.JavaScript.provideFunction_(
|
2021-11-27 12:43:53 +00:00
|
|
|
|
'_getUrl',
|
2020-01-21 07:10:10 +00:00
|
|
|
|
[
|
2021-09-18 14:29:06 +00:00
|
|
|
|
`const axios = require('axios');`,
|
2020-01-21 07:10:10 +00:00
|
|
|
|
'const ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + ' = async url => {',
|
|
|
|
|
'let res, ret;',
|
|
|
|
|
'try {',
|
|
|
|
|
`res = await axios.get(url);`,
|
|
|
|
|
'ret = res.data;',
|
|
|
|
|
'} catch (error) {',
|
|
|
|
|
'if (error.response) {',
|
|
|
|
|
'ret = error.response.status;',
|
|
|
|
|
'} else {',
|
|
|
|
|
'ret = 999;',
|
|
|
|
|
'}',
|
|
|
|
|
'}',
|
|
|
|
|
'return ret;',
|
|
|
|
|
'}'
|
|
|
|
|
]
|
|
|
|
|
);
|
|
|
|
|
var code = `await ${functionName}(${value_url})`;
|
|
|
|
|
return [code, Blockly.JavaScript.ORDER_NONE];
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/*********** */
|
|
|
|
|
/** Sendmail */
|
|
|
|
|
/*********** */
|
|
|
|
|
Blockly.Blocks['ugj_network_sendmail'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.appendValueInput("to")
|
|
|
|
|
.setCheck("String")
|
|
|
|
|
this.appendValueInput("subject")
|
|
|
|
|
.setCheck("String")
|
|
|
|
|
.appendField("へメールを送信:件名");
|
|
|
|
|
this.appendValueInput("text")
|
|
|
|
|
.setCheck("String")
|
|
|
|
|
.appendField("本文");
|
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setPreviousStatement(true, null);
|
|
|
|
|
this.setNextStatement(true, null);
|
2021-01-20 13:26:39 +00:00
|
|
|
|
this.setStyle('network_blocks')
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setTooltip("メールを送信します。Fromアドレスは使用できません。");
|
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_network_sendmail'] = function (block, generator) {
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var value_to = Blockly.JavaScript.valueToCode(block, 'to', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var value_subject = Blockly.JavaScript.valueToCode(block, 'subject', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var value_text = Blockly.JavaScript.valueToCode(block, 'text', Blockly.JavaScript.ORDER_ATOMIC);
|
2021-09-18 14:29:06 +00:00
|
|
|
|
Blockly.JavaScript.provideFunction_(
|
2021-11-27 12:43:53 +00:00
|
|
|
|
'require_sendmail', [`const _nodemailer = require('nodemailer');`]
|
2021-09-18 14:29:06 +00:00
|
|
|
|
);
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var code = [
|
2021-11-27 12:43:53 +00:00
|
|
|
|
`let _smtp = _nodemailer.createTransport({`,
|
2020-01-21 07:10:10 +00:00
|
|
|
|
`host: '192.168.0.201',`,
|
|
|
|
|
`port: 25`,
|
|
|
|
|
`});`,
|
2021-11-27 12:43:53 +00:00
|
|
|
|
`let _message = {`,
|
2022-01-11 05:03:17 +00:00
|
|
|
|
`from: 'no-reply@ocoge.club',`,
|
2020-01-21 07:10:10 +00:00
|
|
|
|
`to: ${value_to},`,
|
|
|
|
|
`subject: ${value_subject},`,
|
|
|
|
|
`text: ${value_text}`,
|
|
|
|
|
`};`,
|
|
|
|
|
`try{`,
|
2021-11-27 12:43:53 +00:00
|
|
|
|
`_smtp.sendMail(_message, function(_error, _info){`,
|
|
|
|
|
`if(_error){`,
|
|
|
|
|
`alert('送信エラー:' + _error.message);`,
|
2020-01-21 07:10:10 +00:00
|
|
|
|
`return;`,
|
|
|
|
|
`}`,
|
|
|
|
|
`console.log('send successfully');`,
|
|
|
|
|
`});`,
|
2021-11-27 12:43:53 +00:00
|
|
|
|
`} catch(_e) {alert('Error: ',_e);}`,
|
2020-01-21 07:10:10 +00:00
|
|
|
|
''
|
|
|
|
|
].join('\n');
|
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/********************* */
|
|
|
|
|
/** WebRTC Web Chat ** */
|
|
|
|
|
/********************* */
|
|
|
|
|
|
|
|
|
|
// skyway.js Library
|
|
|
|
|
Blockly.Blocks['ugj_library_skyway'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.appendField("WebRTC+SkyWayによるウェブチャット");
|
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setOutput(true, "Library");
|
2021-01-20 13:26:39 +00:00
|
|
|
|
this.setStyle('network_blocks')
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setTooltip("skyway.jsをロードし、ウェブチャットができるようにします。");
|
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_library_skyway'] = function (block, generator) {
|
2023-01-01 13:05:12 +00:00
|
|
|
|
var code = `'${apptool.path.join(apptool.library_path, 'skyway.min.js')}'`;
|
2020-01-21 07:10:10 +00:00
|
|
|
|
return [code, Blockly.JavaScript.ORDER_NONE];
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// WebChat Statement Begin
|
|
|
|
|
Blockly.Blocks['ugj_webchat'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.appendField("チャットに必要な部品を表示");
|
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setPreviousStatement(true, null);
|
|
|
|
|
this.setNextStatement(true, null);
|
2021-01-20 13:26:39 +00:00
|
|
|
|
this.setStyle('network_blocks')
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setTooltip("ビデオ画面、チャット入力フォームや黒板を表示します。");
|
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_webchat'] = function (block, generator) {
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var code = [
|
2021-11-27 12:43:53 +00:00
|
|
|
|
`const _blackboard = document.getElementById('blackboard');`,
|
|
|
|
|
"_blackboard.style.display = 'inline-block';",
|
|
|
|
|
`const _inputForm = document.getElementById('inputForm');`,
|
|
|
|
|
"_inputForm.style.display = 'inline-block';",
|
|
|
|
|
`const _inputBox = document.getElementById('inputBox');`,
|
|
|
|
|
"_inputBox.focus();",
|
|
|
|
|
"const _remoteVideo = document.getElementById('maindisplay');",
|
|
|
|
|
`_remoteVideo.style.display = 'inline-block';`,
|
|
|
|
|
"const _localVideo = document.getElementById('subdisplay');",
|
|
|
|
|
`_localVideo.style.display = 'inline-block';`,
|
|
|
|
|
`var _localStream;`,
|
2020-01-21 07:10:10 +00:00
|
|
|
|
''
|
|
|
|
|
].join('\n');
|
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
// getUserMedia
|
|
|
|
|
Blockly.Blocks['ugj_getusermedia'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.appendField("ローカルメディアを開始")
|
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setPreviousStatement(true, null);
|
|
|
|
|
this.setNextStatement(true, null);
|
2021-01-20 13:26:39 +00:00
|
|
|
|
this.setStyle('network_blocks')
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setTooltip("このコンピュータにつながれているメディアデバイスから映像を取得して表示します。");
|
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_getusermedia'] = function (block, generator) {
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var code = [
|
|
|
|
|
`navigator.mediaDevices.getUserMedia({video: true, audio: false})`,
|
2021-11-27 12:43:53 +00:00
|
|
|
|
' .then(_stream => {',
|
|
|
|
|
' _localVideo.srcObject = _stream;',
|
|
|
|
|
' _localStream = _stream;',
|
|
|
|
|
' }).catch( _error => {',
|
|
|
|
|
' console.error(\'mediaDevice.getUserMedia() error:\', _error);',
|
2020-01-21 07:10:10 +00:00
|
|
|
|
' return;',
|
|
|
|
|
' });',
|
|
|
|
|
''
|
|
|
|
|
].join('\n');
|
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
// SkyWay New Peer
|
|
|
|
|
Blockly.Blocks['ugj_skyway_newpeer'] = {
|
|
|
|
|
init: function () {
|
2022-01-11 05:03:17 +00:00
|
|
|
|
this.appendValueInput("my_id")
|
|
|
|
|
.setCheck("Variable")
|
|
|
|
|
.appendField("SkyWayサーバーに ID:");
|
2022-01-16 08:30:21 +00:00
|
|
|
|
this.appendValueInput("apikey")
|
|
|
|
|
.setCheck("String")
|
|
|
|
|
.appendField("APIキー:");
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.appendField("で接続する");
|
|
|
|
|
this.appendStatementInput("do")
|
|
|
|
|
.setCheck(null)
|
|
|
|
|
.appendField("接続したら");
|
2022-06-07 11:14:29 +00:00
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.setAlign(Blockly.ALIGN_RIGHT)
|
|
|
|
|
.appendField("▼");
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setPreviousStatement(true, null);
|
|
|
|
|
this.setNextStatement(true, null);
|
|
|
|
|
this.setTooltip("サーバーにIDを登録して、相手先呼び出しの準備をします。");
|
|
|
|
|
this.setHelpUrl("");
|
2022-01-11 05:03:17 +00:00
|
|
|
|
this.setStyle('network_blocks')
|
2020-01-21 07:10:10 +00:00
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_skyway_newpeer'] = function (block, generator) {
|
2022-01-11 05:03:17 +00:00
|
|
|
|
var value_my_id = Blockly.JavaScript.valueToCode(block, 'my_id', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
// var variable_my_id = Blockly.JavaScript.nameDB_.getName(block.getFieldValue('my_id'), Blockly.Variables.NAME_TYPE);
|
2020-01-21 07:10:10 +00:00
|
|
|
|
// var text_name = block.getFieldValue('NAME');
|
2022-01-16 08:30:21 +00:00
|
|
|
|
var value_apikey = Blockly.JavaScript.valueToCode(block, 'apikey', Blockly.JavaScript.ORDER_ATOMIC);
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var statements_do = Blockly.JavaScript.statementToCode(block, 'do');
|
|
|
|
|
var code = [
|
2022-01-11 05:03:17 +00:00
|
|
|
|
`const _peer = new Peer(${value_my_id}, {`,
|
2022-01-16 08:30:21 +00:00
|
|
|
|
` key: ${value_apikey},`,
|
|
|
|
|
// " key: window.__SKYWAY_KEY__,",
|
2020-01-21 07:10:10 +00:00
|
|
|
|
" debug: 3",
|
|
|
|
|
"});",
|
2021-11-27 12:43:53 +00:00
|
|
|
|
"_peer.on('open', () => {",
|
2020-01-21 07:10:10 +00:00
|
|
|
|
// ' ugj_blackboardWrite(`SkyWay: "${peer.id}" OK`)',
|
2022-01-11 05:03:17 +00:00
|
|
|
|
`${value_my_id} = _peer.id;`,
|
2021-11-27 12:43:53 +00:00
|
|
|
|
"_inputForm.addEventListener('submit', _onMakeCall);",
|
2020-01-21 07:10:10 +00:00
|
|
|
|
statements_do,
|
|
|
|
|
"});",
|
2021-11-27 12:43:53 +00:00
|
|
|
|
"_peer.on('error', _err => alert(_err.message));",
|
|
|
|
|
"const _onMakeCall = _e => {",
|
|
|
|
|
" _e.preventDefault();",
|
|
|
|
|
" const _call = _peer.call(_inputBox.value, _localStream);",
|
2022-01-11 05:03:17 +00:00
|
|
|
|
" _setupCallEventHandlers(_call);",
|
|
|
|
|
" const _connect = _peer.connect(_inputBox.value);",
|
|
|
|
|
" _setupConnectEventHandlers(_connect);",
|
2021-11-27 12:43:53 +00:00
|
|
|
|
" _inputBox.value = '';",
|
2020-01-21 07:10:10 +00:00
|
|
|
|
"}",
|
|
|
|
|
''
|
|
|
|
|
].join('\n');
|
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
// Catch Call and Connect Request
|
|
|
|
|
Blockly.Blocks['ugj_skyway_called'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.appendField("チャットに誘われたら応じる");
|
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setPreviousStatement(true, null);
|
|
|
|
|
this.setNextStatement(true, null);
|
2021-01-20 13:26:39 +00:00
|
|
|
|
this.setStyle('network_blocks')
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setTooltip("接続要求があった場合、チャットを開始する処理です。");
|
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_skyway_called'] = function (block, generator) {
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var code = [
|
2021-11-27 12:43:53 +00:00
|
|
|
|
"_peer.on('call', _call => {",
|
|
|
|
|
" _call.answer(_localStream);",
|
|
|
|
|
" _setupCallEventHandlers(_call);",
|
2020-01-21 07:10:10 +00:00
|
|
|
|
"});",
|
2021-11-27 12:43:53 +00:00
|
|
|
|
"_peer.on('connection', _connect => {",
|
|
|
|
|
" _setupConnectEventHandlers(_connect);",
|
2020-01-21 07:10:10 +00:00
|
|
|
|
"});",
|
|
|
|
|
''
|
|
|
|
|
].join('\n');
|
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
// EventHandlers for Call and Connect
|
|
|
|
|
Blockly.Blocks['ugj_skyway_events'] = {
|
|
|
|
|
init: function () {
|
2022-01-11 05:03:17 +00:00
|
|
|
|
this.appendValueInput("remote_id")
|
|
|
|
|
.setCheck("Variable");
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.appendField("との接続後にすること");
|
|
|
|
|
this.appendStatementInput("do")
|
|
|
|
|
.setCheck(null);
|
2022-06-07 11:14:29 +00:00
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.setAlign(Blockly.ALIGN_RIGHT)
|
|
|
|
|
.appendField("▼");
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setPreviousStatement(true, null);
|
|
|
|
|
this.setNextStatement(true, null);
|
|
|
|
|
this.setTooltip("チャットの相手との接続後の動作を定義します。");
|
|
|
|
|
this.setHelpUrl("");
|
2022-01-11 05:03:17 +00:00
|
|
|
|
this.setStyle('network_blocks')
|
2020-01-21 07:10:10 +00:00
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_skyway_events'] = function (block, generator) {
|
2022-01-11 05:03:17 +00:00
|
|
|
|
var value_remote_id = Blockly.JavaScript.valueToCode(block, 'remote_id', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
// var variable_remote_id = Blockly.JavaScript.nameDB_.getName(block.getFieldValue('remote_id'), Blockly.Variables.NAME_TYPE);
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var statements_do = Blockly.JavaScript.statementToCode(block, 'do');
|
|
|
|
|
var code = [
|
2021-11-27 12:43:53 +00:00
|
|
|
|
"const _setupCallEventHandlers = _call => _call.on('stream', _stream => _remoteVideo.srcObject = _stream);",
|
|
|
|
|
"const _setupConnectEventHandlers = _connect => {",
|
|
|
|
|
" _inputForm.removeEventListener('submit', _onMakeCall);",
|
2022-01-11 05:03:17 +00:00
|
|
|
|
` ${value_remote_id} = _connect.remoteId;`,
|
2020-01-21 07:10:10 +00:00
|
|
|
|
statements_do,
|
|
|
|
|
"}",
|
|
|
|
|
''
|
|
|
|
|
].join('\n');
|
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
// Peer Open
|
|
|
|
|
Blockly.Blocks['ugj_skyway_eventopen'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.appendField("接続したらすぐ");
|
|
|
|
|
this.appendStatementInput("do")
|
|
|
|
|
.setCheck(null);
|
2022-06-07 11:14:29 +00:00
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.setAlign(Blockly.ALIGN_RIGHT)
|
|
|
|
|
.appendField("▼");
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setPreviousStatement(true, null);
|
|
|
|
|
this.setNextStatement(true, null);
|
2021-01-20 13:26:39 +00:00
|
|
|
|
this.setStyle('network_blocks')
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setTooltip("チャット相手との接続が確立したときの動作を決めます。");
|
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_skyway_eventopen'] = function (block, generator) {
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var statements_do = Blockly.JavaScript.statementToCode(block, 'do');
|
|
|
|
|
var code = [
|
2021-11-27 12:43:53 +00:00
|
|
|
|
" _connect.on('open', () => {",
|
|
|
|
|
" _inputForm.addEventListener('submit', _onSendMsg)",
|
2020-01-21 07:10:10 +00:00
|
|
|
|
statements_do,
|
|
|
|
|
" });",
|
|
|
|
|
''
|
|
|
|
|
].join('\n');
|
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
// Peer Data Receive
|
|
|
|
|
Blockly.Blocks['ugj_skyway_eventdata'] = {
|
|
|
|
|
init: function () {
|
2022-01-11 05:03:17 +00:00
|
|
|
|
this.appendValueInput("data")
|
|
|
|
|
.setCheck("Variable")
|
|
|
|
|
.appendField("相手の");
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.appendField("を受けとったら");
|
|
|
|
|
this.appendStatementInput("do")
|
|
|
|
|
.setCheck(null);
|
2022-06-07 11:14:29 +00:00
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.setAlign(Blockly.ALIGN_RIGHT)
|
|
|
|
|
.appendField("▼");
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setPreviousStatement(true, null);
|
|
|
|
|
this.setNextStatement(true, null);
|
|
|
|
|
this.setTooltip("チャット相手の発言を受信したときの動作です。");
|
|
|
|
|
this.setHelpUrl("");
|
2022-01-11 05:03:17 +00:00
|
|
|
|
this.setStyle('network_blocks')
|
2020-01-21 07:10:10 +00:00
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_skyway_eventdata'] = function (block, generator) {
|
2022-01-11 05:03:17 +00:00
|
|
|
|
var value_data = Blockly.JavaScript.valueToCode(block, 'data', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
// var variable_data = Blockly.JavaScript.nameDB_.getName(block.getFieldValue('data'), Blockly.Variables.NAME_TYPE);
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var statements_do = Blockly.JavaScript.statementToCode(block, 'do');
|
|
|
|
|
var code = [
|
2021-11-27 12:43:53 +00:00
|
|
|
|
" _connect.on('data', _data => {",
|
2022-01-11 05:03:17 +00:00
|
|
|
|
` ${value_data} = _data;`,
|
2020-01-21 07:10:10 +00:00
|
|
|
|
statements_do,
|
|
|
|
|
" });",
|
|
|
|
|
''
|
|
|
|
|
].join('\n');
|
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
// Send Message
|
|
|
|
|
Blockly.Blocks['ugj_skyway_eventsend'] = {
|
|
|
|
|
init: function () {
|
2022-01-11 05:03:17 +00:00
|
|
|
|
this.appendValueInput("data")
|
|
|
|
|
.setCheck("Variable")
|
|
|
|
|
.appendField("入力フィールドの");
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.appendField("を送信するとき");
|
|
|
|
|
this.appendStatementInput("do")
|
|
|
|
|
.setCheck(null);
|
2022-06-07 11:14:29 +00:00
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.setAlign(Blockly.ALIGN_RIGHT)
|
|
|
|
|
.appendField("▼");
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setPreviousStatement(true, null);
|
|
|
|
|
this.setNextStatement(true, null);
|
|
|
|
|
this.setTooltip("入力フィールドで送信が発生したときの動作を決めます。");
|
|
|
|
|
this.setHelpUrl("");
|
2022-01-11 05:03:17 +00:00
|
|
|
|
this.setStyle('network_blocks')
|
2020-01-21 07:10:10 +00:00
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_skyway_eventsend'] = function (block, generator) {
|
2022-01-11 05:03:17 +00:00
|
|
|
|
var value_data = Blockly.JavaScript.valueToCode(block, 'data', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
// var variable_data = Blockly.JavaScript.nameDB_.getName(block.getFieldValue('data'), Blockly.Variables.NAME_TYPE);
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var statements_do = Blockly.JavaScript.statementToCode(block, 'do');
|
|
|
|
|
var code = [
|
2021-11-27 12:43:53 +00:00
|
|
|
|
" const _onSendMsg = () => {",
|
2022-01-11 05:03:17 +00:00
|
|
|
|
` ${value_data} = _inputBox.value;`,
|
|
|
|
|
` _connect.send(${value_data});`,
|
2021-11-27 12:43:53 +00:00
|
|
|
|
" _inputBox.value = '';",
|
2020-01-21 07:10:10 +00:00
|
|
|
|
statements_do,
|
|
|
|
|
" }",
|
|
|
|
|
''
|
|
|
|
|
].join('\n');
|
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** Utilitiy Blocks ***********************************************************************************************/
|
|
|
|
|
|
|
|
|
|
/************ */
|
|
|
|
|
/** File Read */
|
|
|
|
|
/************ */
|
|
|
|
|
Blockly.Blocks['ugj_file_readsync'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.appendValueInput("filename")
|
|
|
|
|
.setCheck("String")
|
|
|
|
|
.appendField("ファイル");
|
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.appendField("の内容:符号化")
|
|
|
|
|
.appendField(new Blockly.FieldDropdown([["utf8", "utf8"], ["base64", "base64"], ["binary", "binary"]]), "encoding");
|
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setOutput(true, "String");
|
|
|
|
|
this.setOutputShape(Blockly.OUTPUT_SHAPE_ROUND);
|
2021-01-20 13:26:39 +00:00
|
|
|
|
this.setStyle('special_blocks')
|
2022-01-16 08:30:21 +00:00
|
|
|
|
this.setTooltip("あなたのホーム/Documentsディレクトリ内にあるファイルの内容を取得します。「符号化」は、テキストファイルでは通常「utf8」を選択します。");
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_file_readsync'] = function (block, generator) {
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var value_filename = Blockly.JavaScript.valueToCode(block, 'filename', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var dropdown_encoding = block.getFieldValue('encoding');
|
2023-01-01 13:05:12 +00:00
|
|
|
|
let filepath = apptool.path.join(apptool.doc_root, value_filename.replace(/\'/g, ''));
|
2021-09-18 14:29:06 +00:00
|
|
|
|
Blockly.JavaScript.provideFunction_(
|
2021-11-27 12:43:53 +00:00
|
|
|
|
'require_fs', [`const _fs = require('fs');`]
|
2021-09-18 14:29:06 +00:00
|
|
|
|
);
|
2021-11-27 12:43:53 +00:00
|
|
|
|
var code = `_fs.readFileSync('${filepath}', '${dropdown_encoding}')`;
|
2020-01-21 07:10:10 +00:00
|
|
|
|
return [code, Blockly.JavaScript.ORDER_ATOMIC];
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/********************************* */
|
|
|
|
|
/** Save TextData to Local Storage */
|
|
|
|
|
/********************************* */
|
|
|
|
|
Blockly.Blocks['ugj_localstorage_save'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.appendValueInput("keyValue")
|
|
|
|
|
.setCheck("String");
|
|
|
|
|
this.appendValueInput("keyName")
|
|
|
|
|
.setCheck("String")
|
|
|
|
|
.appendField("をローカルストレージ");
|
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.appendField("に保存する");
|
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setPreviousStatement(true, null);
|
|
|
|
|
this.setNextStatement(true, null);
|
2021-01-20 13:26:39 +00:00
|
|
|
|
this.setStyle('special_blocks')
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setTooltip("テキストデータをローカルストレージに名前を付けて保存します。名前は半角アルファベットと数字だけで指定してください。");
|
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_localstorage_save'] = function (block, generator) {
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var value_keyvalue = Blockly.JavaScript.valueToCode(block, 'keyValue', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var value_keyname = Blockly.JavaScript.valueToCode(block, 'keyName', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var code = `localStorage.setItem(${value_keyname}, ${value_keyvalue});\n`;
|
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
/*********************************** */
|
|
|
|
|
/** Load Textdata from Local Storage */
|
|
|
|
|
/*********************************** */
|
|
|
|
|
Blockly.Blocks['ugj_localstorage_load'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.appendValueInput("keyName")
|
|
|
|
|
.setCheck("String")
|
|
|
|
|
.appendField("ローカルストレージ");
|
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.appendField("の内容");
|
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setOutput(true, "String");
|
|
|
|
|
this.setOutputShape(Blockly.OUTPUT_SHAPE_ROUND);
|
2021-10-31 04:27:59 +00:00
|
|
|
|
this.setStyle('special_blocks');
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setTooltip("ローカルストレージからテキストデータを読み込みます。");
|
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_localstorage_load'] = function (block, generator) {
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var value_keyname = Blockly.JavaScript.valueToCode(block, 'keyName', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var code = `localStorage.getItem(${value_keyname})`;
|
|
|
|
|
return [code, Blockly.JavaScript.ORDER_NONE];
|
|
|
|
|
};
|
|
|
|
|
|
2021-10-31 04:27:59 +00:00
|
|
|
|
/******************************* */
|
|
|
|
|
/** Remove Item in Local Storage */
|
|
|
|
|
/******************************* */
|
|
|
|
|
Blockly.Blocks['ugj_localstorage_remove'] = {
|
2020-01-21 07:10:10 +00:00
|
|
|
|
init: function () {
|
2021-10-31 04:27:59 +00:00
|
|
|
|
this.appendValueInput("key")
|
|
|
|
|
.setCheck("String")
|
|
|
|
|
.appendField("ローカルストレージ");
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.appendDummyInput()
|
2021-10-31 04:27:59 +00:00
|
|
|
|
.appendField("を削除");
|
|
|
|
|
this.setPreviousStatement(true, null);
|
|
|
|
|
this.setNextStatement(true, null);
|
|
|
|
|
this.setStyle('special_blocks');
|
|
|
|
|
this.setTooltip("ローカルストレージに保存されたアイテムを削除します。");
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_localstorage_remove'] = function (block, generator) {
|
2021-10-31 04:27:59 +00:00
|
|
|
|
var value_key = Blockly.JavaScript.valueToCode(block, 'key', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var code = `localStorage.removeItem(${value_key});\n`;
|
|
|
|
|
return code;
|
2020-01-21 07:10:10 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/********************** */
|
|
|
|
|
/** Question and Answer */
|
|
|
|
|
/********************** */
|
|
|
|
|
Blockly.Blocks['ugj_event_answer'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.appendValueInput("question")
|
|
|
|
|
.setCheck("String");
|
2022-01-11 05:03:17 +00:00
|
|
|
|
this.appendValueInput("answer")
|
|
|
|
|
.setCheck("Variable")
|
|
|
|
|
.appendField("ときいて");
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.appendField("を待つ");
|
|
|
|
|
this.appendStatementInput("do")
|
|
|
|
|
.setCheck(null);
|
2022-06-07 11:14:29 +00:00
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.setAlign(Blockly.ALIGN_RIGHT)
|
|
|
|
|
.appendField("▼");
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setPreviousStatement(true, null);
|
2022-06-07 11:14:29 +00:00
|
|
|
|
this.setNextStatement(true, null);
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setTooltip("質問をして答えを待ちます。入力欄でキーボードのエンターキーが入力されるか、チェックマークボタンが押されると実行されます。");
|
|
|
|
|
this.setHelpUrl("");
|
2022-01-11 05:03:17 +00:00
|
|
|
|
this.setStyle('special_blocks')
|
2020-01-21 07:10:10 +00:00
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_event_answer'] = function (block, generator) {
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var value_question = Blockly.JavaScript.valueToCode(block, 'question', Blockly.JavaScript.ORDER_ATOMIC);
|
2022-01-11 05:03:17 +00:00
|
|
|
|
var value_answer = Blockly.JavaScript.valueToCode(block, 'answer', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
// var variable_answer = Blockly.JavaScript.nameDB_.getName(block.getFieldValue('answer'), Blockly.Variables.NAME_TYPE);
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var statements_do = Blockly.JavaScript.statementToCode(block, 'do');
|
|
|
|
|
var code = [
|
2022-03-02 11:25:14 +00:00
|
|
|
|
`_fukidashi(${value_question}, 0);`,
|
2021-11-27 12:43:53 +00:00
|
|
|
|
`_inputForm = document.getElementById('inputForm');`,
|
|
|
|
|
`_inputBox = document.getElementById('inputBox');`,
|
|
|
|
|
"_inputForm.style.display = 'inline-block'",
|
|
|
|
|
"_inputBox.focus();",
|
|
|
|
|
"const _inputFunc = async () => { ",
|
|
|
|
|
" if (_inputBox.value.length > 0) {",
|
2022-01-11 05:03:17 +00:00
|
|
|
|
` ${value_answer} = _inputBox.value;`,
|
2021-11-27 12:43:53 +00:00
|
|
|
|
' _inputForm.style.display = "none"',
|
|
|
|
|
" _inputBox.value = '';",
|
2020-01-21 07:10:10 +00:00
|
|
|
|
" document.getElementById('canvas').getContext('2d').clearRect(ugj_fdRecentBox.x,ugj_fdRecentBox.y,ugj_fdRecentBox.w,ugj_fdRecentBox.h);",
|
|
|
|
|
statements_do,
|
|
|
|
|
" console.log('Removing listener...');",
|
2021-11-27 12:43:53 +00:00
|
|
|
|
" _inputForm.removeEventListener('submit', _inputFunc );",
|
2020-01-21 07:10:10 +00:00
|
|
|
|
" }",
|
|
|
|
|
"}",
|
2021-11-27 12:43:53 +00:00
|
|
|
|
"_inputForm.addEventListener('submit', _inputFunc );",
|
2020-01-21 07:10:10 +00:00
|
|
|
|
''
|
|
|
|
|
].join('\n');
|
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/************ */
|
|
|
|
|
/** SpawnSync */
|
|
|
|
|
/************ */
|
|
|
|
|
Blockly.Blocks['ugj_spawnsync'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.appendValueInput("childprocess")
|
|
|
|
|
.setCheck("shcmd")
|
|
|
|
|
.appendField("外部プログラム");
|
2022-01-11 05:03:17 +00:00
|
|
|
|
this.appendValueInput("data")
|
|
|
|
|
.setCheck("Variable")
|
|
|
|
|
.appendField("を同期的に実行して");
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.appendField("を受け取る");
|
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setPreviousStatement(true, null);
|
|
|
|
|
this.setNextStatement(true, null);
|
2022-03-03 12:32:00 +00:00
|
|
|
|
this.setTooltip("外部プログラムを実行して子プロセスを生成し、子プロセスが終了するまで待ちます。タイムアウトは10秒です。");
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setHelpUrl("");
|
2022-01-11 05:03:17 +00:00
|
|
|
|
this.setStyle('special_blocks')
|
2020-01-21 07:10:10 +00:00
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_spawnsync'] = function (block, generator) {
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var value_childprocess = Blockly.JavaScript.valueToCode(block, 'childprocess', Blockly.JavaScript.ORDER_NONE);
|
2022-01-11 05:03:17 +00:00
|
|
|
|
var value_data = Blockly.JavaScript.valueToCode(block, 'data', Blockly.JavaScript.ORDER_ATOMIC);
|
2022-03-03 12:32:00 +00:00
|
|
|
|
var code = `${value_data} = require('child_process').spawnSync(${value_childprocess}, {timeout: 10000}).stdout.toString();\n`;
|
2020-01-21 07:10:10 +00:00
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/*********** */
|
|
|
|
|
/** Spawn ** */
|
|
|
|
|
/*********** */
|
|
|
|
|
Blockly.Blocks['ugj_spawn'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.appendValueInput("childprocess")
|
|
|
|
|
.setCheck("shcmd")
|
|
|
|
|
.appendField("外部プログラム");
|
2022-01-11 05:03:17 +00:00
|
|
|
|
this.appendValueInput("data")
|
|
|
|
|
.setCheck(null)
|
|
|
|
|
.appendField("を非同期に実行して");
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.appendField("を受け取る");
|
|
|
|
|
this.appendStatementInput("do")
|
|
|
|
|
.setCheck(null);
|
2022-06-07 11:14:29 +00:00
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.setAlign(Blockly.ALIGN_RIGHT)
|
|
|
|
|
.appendField("▼");
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setPreviousStatement(true, null);
|
2021-03-25 09:52:45 +00:00
|
|
|
|
this.setNextStatement(true, null);
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setTooltip("外部プログラムを実行して子プロセスを生成します。データを受け取る毎にステートメントが実行されます。");
|
|
|
|
|
this.setHelpUrl("");
|
2022-01-11 05:03:17 +00:00
|
|
|
|
this.setStyle('special_blocks')
|
2020-01-21 07:10:10 +00:00
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_spawn'] = function (block, generator) {
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var value_childprocess = Blockly.JavaScript.valueToCode(block, 'childprocess', Blockly.JavaScript.ORDER_NONE);
|
2022-01-11 05:03:17 +00:00
|
|
|
|
var value_data = Blockly.JavaScript.valueToCode(block, 'data', Blockly.JavaScript.ORDER_ATOMIC);
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var statements_do = Blockly.JavaScript.statementToCode(block, 'do');
|
2022-03-02 11:25:14 +00:00
|
|
|
|
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var code = [
|
2021-11-27 12:43:53 +00:00
|
|
|
|
`let _child = require('child_process').spawn(${value_childprocess});`,
|
|
|
|
|
"_child.stderr.on('data', _data => { console.error(_data.toString()) })",
|
|
|
|
|
"_child.stdout.on('data', async _data => {",
|
2022-01-11 05:03:17 +00:00
|
|
|
|
`${value_data} = _data.toString();`,
|
2020-01-21 07:10:10 +00:00
|
|
|
|
statements_do,
|
|
|
|
|
"})",
|
2022-03-03 12:32:00 +00:00
|
|
|
|
`window.addEventListener( 'beforeunload', () => _child.kill(), false );`,
|
2020-01-21 07:10:10 +00:00
|
|
|
|
''
|
|
|
|
|
].join("\n");
|
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
/************************** */
|
|
|
|
|
/** Child shell commands ** */
|
|
|
|
|
/************************** */
|
2021-10-22 14:33:59 +00:00
|
|
|
|
|
2021-02-28 10:14:39 +00:00
|
|
|
|
|
2021-03-24 13:11:48 +00:00
|
|
|
|
// AquesTalk Pi
|
|
|
|
|
Blockly.Blocks['aquestalk_pi'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.appendValueInput("talk")
|
|
|
|
|
.setCheck("String")
|
|
|
|
|
.appendField("ゆっくりで");
|
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.appendField("とおしゃべりする");
|
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setOutput(true, "shcmd");
|
|
|
|
|
this.setStyle('special_blocks')
|
|
|
|
|
this.setTooltip("日本語音声合成プログラム「AquesTalk Pi」を使用してしゃべります。");
|
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['aquestalk_pi'] = function (block, generator) {
|
2021-03-24 13:11:48 +00:00
|
|
|
|
var value_talk = Blockly.JavaScript.valueToCode(block, 'talk', Blockly.JavaScript.ORDER_ATOMIC);
|
2023-01-01 13:05:12 +00:00
|
|
|
|
var code = `'${apptool.path.join(apptool.executable_path, 'aquestalkpi/AquesTalkPi')} -g 50 ' + ${value_talk} + ' | aplay', { shell: true }`;
|
2021-03-24 13:11:48 +00:00
|
|
|
|
return [code, Blockly.JavaScript.ORDER_NONE];
|
|
|
|
|
};
|
|
|
|
|
|
2020-01-21 07:10:10 +00:00
|
|
|
|
// fswebcam
|
|
|
|
|
Blockly.Blocks['ugj_child_fswebcam'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.appendValueInput("filename")
|
|
|
|
|
.setCheck("String")
|
|
|
|
|
.appendField("fswebcamで写真を撮り、ファイル");
|
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.appendField("に保存");
|
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setOutput(true, "shcmd");
|
|
|
|
|
this.setOutputShape(Blockly.OUTPUT_SHAPE_ROUND);
|
2021-01-20 13:26:39 +00:00
|
|
|
|
this.setStyle('special_blocks')
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setTooltip("fswebcam");
|
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_child_fswebcam'] = function (block, generator) {
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var value_filename = Blockly.JavaScript.valueToCode(block, 'filename', Blockly.JavaScript.ORDER_ATOMIC);
|
2023-01-01 13:05:12 +00:00
|
|
|
|
var code = `'fswebcam', ['-r', '480x360', '${apptool.doc_root}' + ${value_filename}]`;
|
2020-01-21 07:10:10 +00:00
|
|
|
|
return [code, Blockly.JavaScript.ORDER_NONE];
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Julius
|
|
|
|
|
Blockly.Blocks['ugj_child_julius'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.appendField("Julius");
|
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setOutput(true, "shcmd");
|
|
|
|
|
this.setOutputShape(Blockly.OUTPUT_SHAPE_ROUND);
|
2021-01-20 13:26:39 +00:00
|
|
|
|
this.setStyle('special_blocks')
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setTooltip("音声認識エンジン \"Julius\"");
|
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_child_julius'] = function (block, generator) {
|
2023-01-01 13:05:12 +00:00
|
|
|
|
var code = `'${apptool.path.join(apptool.executable_path, 'julius/julius-simple')}', ['-C', '${apptool.path.join(apptool.executable_path, 'julius/dictation-kit/am-gmm.jconf')}', '-gram', '${apptool.path.join(apptool.executable_path, 'julius/dic/assistant')}', '-nostrip']`;
|
2020-01-21 07:10:10 +00:00
|
|
|
|
return [code, Blockly.JavaScript.ORDER_NONE];
|
|
|
|
|
};
|
|
|
|
|
|
2022-01-28 15:45:59 +00:00
|
|
|
|
// Python スクリプト
|
|
|
|
|
Blockly.Blocks['ugj_child_pyscript'] = {
|
2020-01-21 07:10:10 +00:00
|
|
|
|
init: function () {
|
2022-01-28 15:45:59 +00:00
|
|
|
|
this.appendValueInput("script_path")
|
|
|
|
|
.setCheck("String")
|
|
|
|
|
.appendField("Pythonスクリプト :");
|
|
|
|
|
this.setInputsInline(true);
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setOutput(true, "shcmd");
|
2022-01-28 15:45:59 +00:00
|
|
|
|
this.setTooltip("Pythonスクリプトファイル名");
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setHelpUrl("");
|
2022-01-28 15:45:59 +00:00
|
|
|
|
this.setStyle('special_blocks');
|
2020-01-21 07:10:10 +00:00
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_child_pyscript'] = function (block, generator) {
|
2022-01-28 15:45:59 +00:00
|
|
|
|
var value_script_path = Blockly.JavaScript.valueToCode(block, 'script_path', Blockly.JavaScript.ORDER_ATOMIC);
|
2020-01-21 07:10:10 +00:00
|
|
|
|
// TODO: Assemble JavaScript into code variable.
|
2023-01-01 13:05:12 +00:00
|
|
|
|
var code = `'python3', ['${apptool.doc_root}/' + ${value_script_path}]`;
|
2020-01-21 07:10:10 +00:00
|
|
|
|
// TODO: Change ORDER_NONE to the correct strength.
|
|
|
|
|
return [code, Blockly.JavaScript.ORDER_NONE];
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/******************* */
|
|
|
|
|
/** Show Blackboard ** */
|
|
|
|
|
/******************* */
|
|
|
|
|
Blockly.Blocks['ugj_blackboard_show'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.appendField("黒板を表示");
|
|
|
|
|
this.setPreviousStatement(true, null);
|
|
|
|
|
this.setNextStatement(true, null);
|
2021-01-20 13:26:39 +00:00
|
|
|
|
this.setStyle('special_blocks')
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setTooltip("文字を表示するための専用エリアを表示します。");
|
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_blackboard_show'] = function (block, generator) {
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var code = "document.getElementById('blackboard').style.display = 'inline-block';\n";
|
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/************************* */
|
|
|
|
|
/** Write text to Blackboard */
|
|
|
|
|
/************************* */
|
|
|
|
|
Blockly.Blocks['ugj_blackboard_write'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.appendValueInput("text")
|
|
|
|
|
.setCheck("String")
|
|
|
|
|
.appendField("黒板に");
|
|
|
|
|
this.appendValueInput("color")
|
|
|
|
|
.setCheck("Colour")
|
|
|
|
|
.appendField("を表示 | 色:");
|
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.appendField("|")
|
|
|
|
|
.appendField(new Blockly.FieldDropdown([["普通", "normal"], ["斜体", "italic"]]), "style")
|
|
|
|
|
.appendField("|")
|
|
|
|
|
.appendField(new Blockly.FieldDropdown([["新しい行を追加", "new"], ["最後の行を上書き", "last"]]), "line");
|
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setPreviousStatement(true, null);
|
|
|
|
|
this.setNextStatement(true, null);
|
2021-01-20 13:26:39 +00:00
|
|
|
|
this.setStyle('special_blocks')
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setTooltip("黒板に文字を表示します。次の行に追加する他、最後の行を書き換えることもできます。");
|
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_blackboard_write'] = function (block, generator) {
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var value_text = Blockly.JavaScript.valueToCode(block, 'text', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var value_color = Blockly.JavaScript.valueToCode(block, 'color', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var dropdown_style = block.getFieldValue('style');
|
|
|
|
|
var dropdown_line = block.getFieldValue('line');
|
|
|
|
|
var funcAppendDivName = Blockly.JavaScript.provideFunction_(
|
2021-11-27 12:43:53 +00:00
|
|
|
|
'_appendDiv',
|
2020-01-21 07:10:10 +00:00
|
|
|
|
['const ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + ' = termEl => {',
|
|
|
|
|
`let el = document.createElement('div');`,
|
|
|
|
|
`termEl.appendChild(el);`,
|
|
|
|
|
`return el;`,
|
|
|
|
|
'}']
|
|
|
|
|
);
|
|
|
|
|
var funcTermWriteName = Blockly.JavaScript.provideFunction_(
|
2021-11-27 12:43:53 +00:00
|
|
|
|
'_blackboardWrite',
|
2020-01-21 07:10:10 +00:00
|
|
|
|
['const ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + ' = (text, color, style, line) => {',
|
|
|
|
|
`let termEl = document.getElementById('blackboard')`,
|
|
|
|
|
'let el = null;',
|
|
|
|
|
`if (line == 'new') {`,
|
|
|
|
|
`el = ${funcAppendDivName}(termEl);`,
|
|
|
|
|
`} else {`,
|
|
|
|
|
`el = termEl.lastChild;`,
|
|
|
|
|
`if (el === null) {`,
|
|
|
|
|
`el = ${funcAppendDivName}(termEl);`,
|
|
|
|
|
`}`,
|
|
|
|
|
`}`,
|
|
|
|
|
`el.style.color = color;`,
|
|
|
|
|
`el.style.fontStyle = style;`,
|
2024-01-02 06:33:45 +00:00
|
|
|
|
`el.innerHTML = ugj_htmlEntities(text);`,
|
|
|
|
|
// `el.innerHTML = text;`,
|
2020-01-21 07:10:10 +00:00
|
|
|
|
`termEl.scrollTop = termEl.scrollHeight;`,
|
|
|
|
|
'}//#']
|
|
|
|
|
);
|
|
|
|
|
value_text = ugj_htmlEntities(value_text);
|
|
|
|
|
var code = [
|
|
|
|
|
`${funcTermWriteName}(${value_text}, ${value_color}, '${dropdown_style}', '${dropdown_line}');`,
|
|
|
|
|
'',
|
|
|
|
|
].join('\n');
|
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/******************** */
|
|
|
|
|
/** Clear Blackboard ** */
|
|
|
|
|
/******************** */
|
|
|
|
|
Blockly.Blocks['ugj_clearblackboard'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.appendField("黒板をクリア");
|
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setPreviousStatement(true, null);
|
|
|
|
|
this.setNextStatement(true, null);
|
2021-01-20 13:26:39 +00:00
|
|
|
|
this.setStyle('special_blocks')
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setTooltip("黒板をきれいにします。");
|
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_clearblackboard'] = function (block, generator) {
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var code = `document.getElementById('blackboard').innerHTML = '';\n`;
|
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/************************* */
|
|
|
|
|
/** Get BlackBoard Content */
|
|
|
|
|
/************************* */
|
|
|
|
|
Blockly.Blocks['ugj_blackboard_content'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.appendField("黒板の内容");
|
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setOutput(true, "String");
|
|
|
|
|
this.setOutputShape(Blockly.OUTPUT_SHAPE_ROUND);
|
2022-06-07 11:14:29 +00:00
|
|
|
|
this.setStyle('special_blocks');
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setTooltip("黒板の内容をプレーンテキストで取得します。");
|
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_blackboard_content'] = function (block, generator) {
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var code = `document.getElementById('blackboard').innerText`;
|
|
|
|
|
return [code, Blockly.JavaScript.ORDER_NONE];
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/************* */
|
|
|
|
|
/** Soft Sleep */
|
|
|
|
|
/************* */
|
2021-09-09 08:41:39 +00:00
|
|
|
|
var ugjSleepDefinition = {
|
|
|
|
|
"type": "ugj_sleep",
|
|
|
|
|
"message0": "%{BKY_UGJ_SLEEP_TITLE}",
|
|
|
|
|
"args0": [
|
|
|
|
|
{
|
|
|
|
|
"type": "input_value",
|
|
|
|
|
"name": "sec",
|
|
|
|
|
"check": "Number"
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"inputsInline": true,
|
|
|
|
|
"previousStatement": null,
|
|
|
|
|
"nextStatement": null,
|
|
|
|
|
"tooltip": "%{BKY_UGJ_SLEEP_TOOLTIP}",
|
|
|
|
|
"helpUrl": "",
|
|
|
|
|
"style": "special_blocks"
|
|
|
|
|
};
|
2020-01-21 07:10:10 +00:00
|
|
|
|
Blockly.Blocks['ugj_sleep'] = {
|
|
|
|
|
init: function () {
|
2021-09-09 08:41:39 +00:00
|
|
|
|
this.jsonInit(ugjSleepDefinition);
|
2020-01-21 07:10:10 +00:00
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_sleep'] = function (block, generator) {
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var value_sec = Blockly.JavaScript.valueToCode(block, 'sec', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var functionName = Blockly.JavaScript.provideFunction_(
|
2021-11-27 12:43:53 +00:00
|
|
|
|
'_sleep',
|
2021-10-31 04:27:59 +00:00
|
|
|
|
['const ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + ' = sec =>',
|
|
|
|
|
'new Promise(r => setTimeout(r, sec * 1000));']
|
2020-01-21 07:10:10 +00:00
|
|
|
|
);
|
2021-10-31 04:27:59 +00:00
|
|
|
|
var code = `await ${functionName}(${value_sec});\n`;
|
2021-09-09 08:41:39 +00:00
|
|
|
|
return code;
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
python.pythonGenerator.forBlock['ugj_sleep'] = function (block, generator) {
|
2021-09-09 08:41:39 +00:00
|
|
|
|
var value_sec = Blockly.Python.valueToCode(block, 'sec', Blockly.Python.ORDER_ATOMIC);
|
|
|
|
|
Blockly.Python.provideFunction_(
|
2022-07-10 13:04:56 +00:00
|
|
|
|
'import_sleep', ['from utime import sleep']
|
2021-09-09 08:41:39 +00:00
|
|
|
|
)
|
|
|
|
|
var code = `sleep(${value_sec})\n`;
|
2020-01-21 07:10:10 +00:00
|
|
|
|
return code;
|
|
|
|
|
};
|
2022-06-07 11:14:29 +00:00
|
|
|
|
/**************** */
|
|
|
|
|
/** Async IIFE ** */
|
|
|
|
|
/**************** */
|
|
|
|
|
Blockly.Blocks['ugj_async_iife'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.appendField("非同期で実行");
|
|
|
|
|
this.appendStatementInput("do")
|
|
|
|
|
.setCheck(null);
|
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.setAlign(Blockly.ALIGN_RIGHT)
|
|
|
|
|
.appendField("Async▼");
|
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setPreviousStatement(true, null);
|
|
|
|
|
this.setNextStatement(true, null);
|
|
|
|
|
this.setTooltip("ステートメントを非同期で実行します。即時関数を生成するのでスコープに注意。");
|
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
this.setStyle('special_blocks');
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_async_iife'] = function (block, generator) {
|
2022-06-07 11:14:29 +00:00
|
|
|
|
var statements_do = Blockly.JavaScript.statementToCode(block, 'do');
|
|
|
|
|
var code = `(async () => {
|
|
|
|
|
${statements_do}
|
|
|
|
|
})();
|
|
|
|
|
`;
|
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
|
2020-01-21 07:10:10 +00:00
|
|
|
|
/********************* */
|
|
|
|
|
/** Carriage Return ** */
|
|
|
|
|
/********************* */
|
|
|
|
|
Blockly.Blocks['ugj_text_cr'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.appendField("CR");
|
|
|
|
|
this.setOutput(true, "String");
|
|
|
|
|
this.setOutputShape(Blockly.OUTPUT_SHAPE_ROUND);
|
|
|
|
|
this.setColour(Blockly.Msg.TEXTS_HUE);
|
|
|
|
|
this.setTooltip("特殊記号(キャリッジリターン)");
|
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_text_cr'] = function (block, generator) {
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var code = "'\\r'";
|
|
|
|
|
return [code, Blockly.JavaScript.ORDER_ATOMIC];
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
python.pythonGenerator.forBlock['ugj_text_cr'] = function (block, generator) {
|
2021-09-09 14:38:25 +00:00
|
|
|
|
var code = "'\\r'";
|
|
|
|
|
return [code, Blockly.Python.ORDER_ATOMIC];
|
|
|
|
|
};
|
2020-01-21 07:10:10 +00:00
|
|
|
|
/*************** */
|
|
|
|
|
/** Line Feed ** */
|
|
|
|
|
/*************** */
|
|
|
|
|
Blockly.Blocks['ugj_text_lf'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.appendField("LF");
|
|
|
|
|
this.setOutput(true, "String");
|
|
|
|
|
this.setOutputShape(Blockly.OUTPUT_SHAPE_ROUND);
|
|
|
|
|
this.setColour(Blockly.Msg.TEXTS_HUE);
|
|
|
|
|
this.setTooltip("特殊記号(ラインフィード)");
|
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_text_lf'] = function (block, generator) {
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var code = "'\\n'";
|
|
|
|
|
return [code, Blockly.JavaScript.ORDER_ATOMIC];
|
|
|
|
|
};
|
|
|
|
|
/******* */
|
|
|
|
|
/** Null */
|
|
|
|
|
/******* */
|
|
|
|
|
Blockly.Blocks['ugj_text_null'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.appendField("NULL");
|
|
|
|
|
this.setOutput(true, "String");
|
|
|
|
|
this.setOutputShape(Blockly.OUTPUT_SHAPE_ROUND);
|
|
|
|
|
this.setColour(Blockly.Msg.TEXTS_HUE);
|
|
|
|
|
this.setTooltip("特殊記号(ヌル文字)");
|
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_text_null'] = function (block, generator) {
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var code = "'\\0'";
|
|
|
|
|
return [code, Blockly.JavaScript.ORDER_ATOMIC];
|
|
|
|
|
};
|
|
|
|
|
/********* */
|
|
|
|
|
/** Cursor */
|
|
|
|
|
/********* */
|
|
|
|
|
Blockly.Blocks['ugj_text_cursor'] = {
|
2021-01-20 13:26:39 +00:00
|
|
|
|
init: function () {
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.appendDummyInput()
|
2021-01-20 13:26:39 +00:00
|
|
|
|
.appendField("カーソル");
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setOutput(true, "String");
|
|
|
|
|
this.setOutputShape(Blockly.OUTPUT_SHAPE_ROUND);
|
|
|
|
|
this.setColour(Blockly.Msg.TEXTS_HUE);
|
2021-01-20 13:26:39 +00:00
|
|
|
|
this.setTooltip("特殊記号(カーソル)");
|
|
|
|
|
this.setHelpUrl("");
|
2020-01-21 07:10:10 +00:00
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_text_cursor'] = function (block, generator) {
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var code = "'▋'";
|
|
|
|
|
return [code, Blockly.JavaScript.ORDER_ATOMIC];
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**************************** */
|
|
|
|
|
/** Dinamic Load JS Libraries */
|
|
|
|
|
/**************************** */
|
|
|
|
|
Blockly.Blocks['ugj_library_load'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.appendValueInput("lib")
|
|
|
|
|
.setCheck("Library");
|
|
|
|
|
this.appendStatementInput("do")
|
|
|
|
|
.setCheck(null);
|
|
|
|
|
this.setInputsInline(true);
|
2021-01-20 13:26:39 +00:00
|
|
|
|
this.setStyle('special_blocks')
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setTooltip("ライブラリをロードします。");
|
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_library_load'] = function (block, generator) {
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var value_lib = Blockly.JavaScript.valueToCode(block, 'lib', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var statements_do = Blockly.JavaScript.statementToCode(block, 'do');
|
|
|
|
|
var code = [
|
2021-11-27 12:43:53 +00:00
|
|
|
|
`let _scriptEl = document.createElement('script');`,
|
|
|
|
|
`_scriptEl.onload = async _ev => {`,
|
2020-01-21 07:10:10 +00:00
|
|
|
|
`${statements_do}`,
|
|
|
|
|
`};`,
|
2021-11-27 12:43:53 +00:00
|
|
|
|
`_scriptEl.src = ${value_lib};`,
|
|
|
|
|
`document.getElementsByTagName('head')[0].appendChild(_scriptEl);`,
|
2020-01-21 07:10:10 +00:00
|
|
|
|
''
|
|
|
|
|
].join('\n');
|
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/******************* */
|
|
|
|
|
/** Create Button ** */
|
|
|
|
|
/******************* */
|
|
|
|
|
Blockly.Blocks['ugj_control_button'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.appendValueInput("label")
|
|
|
|
|
.setCheck("String")
|
|
|
|
|
.appendField("ボタンを作成:ラベル");
|
|
|
|
|
this.appendValueInput("textcolor")
|
|
|
|
|
.setCheck("Colour")
|
|
|
|
|
.appendField("文字色");
|
|
|
|
|
this.appendValueInput("bgcolor")
|
|
|
|
|
.setCheck("Colour")
|
|
|
|
|
.appendField("背景色");
|
|
|
|
|
this.appendValueInput("title")
|
|
|
|
|
.setCheck("String")
|
|
|
|
|
.appendField("ツールチップ");
|
|
|
|
|
this.appendStatementInput("do")
|
2022-01-11 05:03:17 +00:00
|
|
|
|
.setCheck(null);
|
2022-06-07 11:14:29 +00:00
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.setAlign(Blockly.ALIGN_RIGHT)
|
|
|
|
|
.appendField("▼");
|
2020-01-21 07:10:10 +00:00
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setPreviousStatement(true, null);
|
|
|
|
|
this.setNextStatement(true, null);
|
|
|
|
|
this.setTooltip("ディスプレイカラムにボタンを作成し、クリックのイベントリスナを定義します。テキストデータをひとつ、\"title\"属性値として設定・取り出しが可能です。保存したデータはマウスオーバーで確認できます。");
|
|
|
|
|
this.setHelpUrl("");
|
2022-01-11 05:03:17 +00:00
|
|
|
|
this.setStyle('special_blocks')
|
2020-01-21 07:10:10 +00:00
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_control_button'] = function (block, generator) {
|
2020-01-21 07:10:10 +00:00
|
|
|
|
var value_label = Blockly.JavaScript.valueToCode(block, 'label', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var value_textcolor = Blockly.JavaScript.valueToCode(block, 'textcolor', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var value_bgcolor = Blockly.JavaScript.valueToCode(block, 'bgcolor', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var value_title = Blockly.JavaScript.valueToCode(block, 'title', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var statements_do = Blockly.JavaScript.statementToCode(block, 'do');
|
|
|
|
|
var code = [
|
|
|
|
|
`( async () => {`,
|
|
|
|
|
`let el = document.createElement('button');`,
|
|
|
|
|
`el.innerText = ${value_label};`,
|
|
|
|
|
`el.style.color = ${value_textcolor};`,
|
|
|
|
|
`el.style.backgroundColor = ${value_bgcolor};`,
|
|
|
|
|
`el.title = ${value_title};`,
|
|
|
|
|
`el.className = 'toolbarButton ocgButton';`,
|
|
|
|
|
`document.getElementById('dispColumn').appendChild(el);`,
|
|
|
|
|
`el.addEventListener('click', async ev => {`,
|
|
|
|
|
statements_do,
|
|
|
|
|
`});`,
|
|
|
|
|
`})();`,
|
|
|
|
|
'',
|
|
|
|
|
].join('\n');
|
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
|
2023-06-25 12:18:33 +00:00
|
|
|
|
/** ******** */
|
|
|
|
|
/** RP2 専用 */
|
|
|
|
|
/** ******** */
|
|
|
|
|
Blockly.defineBlocksWithJsonArray([{
|
|
|
|
|
"type": "oc_rp2_input",
|
|
|
|
|
"message0": "入力待ち",
|
|
|
|
|
"inputsInline": true,
|
|
|
|
|
"output": null,
|
|
|
|
|
"tooltip": "[RP2] 標準入力を待ちます。",
|
|
|
|
|
"helpUrl": "",
|
|
|
|
|
"style": "text_blocks"
|
|
|
|
|
}]);
|
2023-08-18 23:53:45 +00:00
|
|
|
|
python.pythonGenerator.forBlock['oc_rp2_input'] = function (block, generator) {
|
2023-06-25 12:18:33 +00:00
|
|
|
|
Blockly.Python.provideFunction_(
|
|
|
|
|
'import_sys', ['import sys']
|
|
|
|
|
);
|
|
|
|
|
var code = 'sys.stdin.readline().replace("\\n","")';
|
|
|
|
|
return [code, Blockly.Python.ORDER_NONE];
|
|
|
|
|
};
|
|
|
|
|
Blockly.defineBlocksWithJsonArray([{
|
|
|
|
|
"type": "oc_rp2_print",
|
|
|
|
|
"message0": "%1 を終端文字なしで表示",
|
|
|
|
|
"args0": [
|
|
|
|
|
{
|
|
|
|
|
"type": "input_value",
|
|
|
|
|
"name": "text",
|
|
|
|
|
"check": "String"
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"inputsInline": true,
|
|
|
|
|
"previousStatement": null,
|
|
|
|
|
"nextStatement": null,
|
|
|
|
|
"tooltip": "[RP2] テキストを表示します。終端文字(改行など)を追加しません。",
|
|
|
|
|
"helpUrl": "",
|
|
|
|
|
"style": "text_blocks"
|
|
|
|
|
}]);
|
2023-08-18 23:53:45 +00:00
|
|
|
|
python.pythonGenerator.forBlock['oc_rp2_print'] = function (block, generator) {
|
2023-06-25 12:18:33 +00:00
|
|
|
|
var value_text = Blockly.Python.valueToCode(block, 'text', Blockly.Python.ORDER_ATOMIC);
|
|
|
|
|
var code = `print(${value_text}, end='')\n`;
|
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/******************** */
|
|
|
|
|
/** UltraJSON Encoder */
|
|
|
|
|
/******************** */
|
|
|
|
|
Blockly.defineBlocksWithJsonArray([{
|
|
|
|
|
"type": "oc_rp2_ujson_dumps",
|
|
|
|
|
"message0": "オブジェクト %1 を JSON に変換",
|
|
|
|
|
"args0": [
|
|
|
|
|
{
|
|
|
|
|
"type": "input_value",
|
|
|
|
|
"name": "obj"
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"output": null,
|
|
|
|
|
"tooltip": "変数や配列の内容を JSON 形式の文字列にエンコードします。",
|
|
|
|
|
"helpUrl": "",
|
|
|
|
|
"style": "rp2_blocks"
|
|
|
|
|
}]);
|
2023-08-18 23:53:45 +00:00
|
|
|
|
python.pythonGenerator.forBlock['oc_rp2_ujson_dumps'] = function (block, generator) {
|
2023-06-25 12:18:33 +00:00
|
|
|
|
var value_obj = Blockly.Python.valueToCode(block, 'obj', Blockly.Python.ORDER_ATOMIC);
|
|
|
|
|
Blockly.Python.provideFunction_(
|
|
|
|
|
'import_ujson', ['import ujson']
|
|
|
|
|
);
|
|
|
|
|
var code = `ujson.dumps(${value_obj})`;
|
|
|
|
|
return [code, Blockly.Python.ORDER_NONE];
|
|
|
|
|
};
|
|
|
|
|
/******************** */
|
|
|
|
|
/** UltraJSON Decoder */
|
|
|
|
|
/******************** */
|
|
|
|
|
Blockly.defineBlocksWithJsonArray([{
|
|
|
|
|
"type": "oc_rp2_ujson_loads",
|
|
|
|
|
"message0": "JSON %1 をオブジェクトに変換",
|
|
|
|
|
"args0": [
|
|
|
|
|
{
|
|
|
|
|
"type": "input_value",
|
|
|
|
|
"name": "json",
|
|
|
|
|
"check": "String"
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"output": null,
|
|
|
|
|
"tooltip": "JSON 形式の文字列を元の変数や配列の内容にデコードします。",
|
|
|
|
|
"helpUrl": "",
|
|
|
|
|
"style": "rp2_blocks"
|
|
|
|
|
}]);
|
2023-08-18 23:53:45 +00:00
|
|
|
|
python.pythonGenerator.forBlock['oc_rp2_ujson_loads'] = function (block, generator) {
|
2023-06-25 12:18:33 +00:00
|
|
|
|
var value_json = Blockly.Python.valueToCode(block, 'json', Blockly.Python.ORDER_ATOMIC);
|
|
|
|
|
Blockly.Python.provideFunction_(
|
|
|
|
|
'import_ujson', ['import ujson']
|
|
|
|
|
);
|
|
|
|
|
var code = `ujson.loads(${value_json})`;
|
|
|
|
|
return [code, Blockly.Python.ORDER_NONE];
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/****************** */
|
|
|
|
|
/** Setup IR Record */
|
|
|
|
|
/****************** */
|
|
|
|
|
Blockly.defineBlocksWithJsonArray([{
|
|
|
|
|
"type": "oc_rp2_ir_rx",
|
|
|
|
|
"message0": "GPIO %1 をリモコン信号受信ピンに設定する",
|
|
|
|
|
"args0": [
|
|
|
|
|
{
|
|
|
|
|
"type": "input_value",
|
|
|
|
|
"name": "gpio",
|
|
|
|
|
"check": "Number"
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"inputsInline": true,
|
|
|
|
|
"previousStatement": null,
|
|
|
|
|
"nextStatement": null,
|
|
|
|
|
"tooltip": "",
|
|
|
|
|
"helpUrl": "",
|
|
|
|
|
"style": "gpio_blocks"
|
|
|
|
|
}]);
|
2023-08-18 23:53:45 +00:00
|
|
|
|
python.pythonGenerator.forBlock['oc_rp2_ir_rx'] = function (block, generator) {
|
2023-06-25 12:18:33 +00:00
|
|
|
|
var value_gpio = Blockly.Python.valueToCode(block, 'gpio', Blockly.Python.ORDER_ATOMIC);
|
|
|
|
|
Blockly.Python.provideFunction_(
|
|
|
|
|
'import_upyirrx', ['from UpyIrRx import UpyIrRx']
|
|
|
|
|
);
|
|
|
|
|
var code = `_rx = UpyIrRx(_pin[${value_gpio}])\n`;
|
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
/******************* */
|
|
|
|
|
/** Record IR Signal */
|
|
|
|
|
/******************* */
|
|
|
|
|
Blockly.defineBlocksWithJsonArray([{
|
|
|
|
|
"type": "oc_rp2_ir_record",
|
|
|
|
|
"message0": "リモコン信号を受信:待ち受け時間 %1 秒",
|
|
|
|
|
"args0": [
|
|
|
|
|
{
|
|
|
|
|
"type": "input_value",
|
|
|
|
|
"name": "timeout",
|
|
|
|
|
"check": "Number"
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"inputsInline": true,
|
|
|
|
|
"output": null,
|
|
|
|
|
"tooltip": "",
|
|
|
|
|
"helpUrl": "",
|
|
|
|
|
"style": "gpio_blocks"
|
|
|
|
|
}]);
|
2023-08-18 23:53:45 +00:00
|
|
|
|
python.pythonGenerator.forBlock['oc_rp2_ir_record'] = function (block, generator) {
|
2023-06-25 12:18:33 +00:00
|
|
|
|
var value_timeout = Blockly.Python.valueToCode(block, 'timeout', Blockly.Python.ORDER_ATOMIC);
|
|
|
|
|
var functionName = Blockly.Python.provideFunction_(
|
|
|
|
|
'_rx_record',
|
|
|
|
|
[
|
|
|
|
|
`def ${Blockly.Python.FUNCTION_NAME_PLACEHOLDER_} (rx):`,
|
|
|
|
|
` rx.record(${value_timeout} * 1000)`,
|
|
|
|
|
` if rx.get_mode() == UpyIrRx.MODE_DONE_OK:`,
|
|
|
|
|
` signal_list = rx.get_calibrate_list()`,
|
|
|
|
|
` else:`,
|
|
|
|
|
` signal_list = []`,
|
|
|
|
|
` return signal_list`,
|
|
|
|
|
]
|
|
|
|
|
);
|
|
|
|
|
var code = `${functionName}(_rx)`;
|
|
|
|
|
return [code, Blockly.Python.ORDER_NONE];
|
|
|
|
|
};
|
|
|
|
|
/******************** */
|
|
|
|
|
/** Setup IR Transmit */
|
|
|
|
|
/******************** */
|
|
|
|
|
Blockly.defineBlocksWithJsonArray([{
|
|
|
|
|
"type": "oc_rp2_ir_tx",
|
|
|
|
|
"message0": "GPIO %1 をリモコン信号送信ピンに設定する",
|
|
|
|
|
"args0": [
|
|
|
|
|
{
|
|
|
|
|
"type": "input_value",
|
|
|
|
|
"name": "gpio"
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"previousStatement": null,
|
|
|
|
|
"nextStatement": null,
|
|
|
|
|
"tooltip": "",
|
|
|
|
|
"helpUrl": "",
|
|
|
|
|
"style": "gpio_blocks"
|
|
|
|
|
}]);
|
2023-08-18 23:53:45 +00:00
|
|
|
|
python.pythonGenerator.forBlock['oc_rp2_ir_tx'] = function (block, generator) {
|
2023-06-25 12:18:33 +00:00
|
|
|
|
var value_gpio = Blockly.Python.valueToCode(block, 'gpio', Blockly.Python.ORDER_ATOMIC);
|
|
|
|
|
Blockly.Python.provideFunction_(
|
|
|
|
|
'import_upyirtx', ['from UpyIrTx import UpyIrTx']
|
|
|
|
|
);
|
|
|
|
|
var code = `_tx = UpyIrTx(0, _pin[${value_gpio}])\n`;
|
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/********************* */
|
|
|
|
|
/** Transmit IR Signal */
|
|
|
|
|
/********************* */
|
|
|
|
|
Blockly.defineBlocksWithJsonArray([{
|
|
|
|
|
"type": "oc_rp2_ir_transmit",
|
|
|
|
|
"message0": "リモコン信号 %1 を送信",
|
|
|
|
|
"args0": [
|
|
|
|
|
{
|
|
|
|
|
"type": "input_value",
|
|
|
|
|
"name": "signal"
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"previousStatement": null,
|
|
|
|
|
"nextStatement": null,
|
|
|
|
|
"tooltip": "リモコン信号を送信します。",
|
|
|
|
|
"helpUrl": "",
|
|
|
|
|
"style": "gpio_blocks"
|
|
|
|
|
}]);
|
2023-08-18 23:53:45 +00:00
|
|
|
|
python.pythonGenerator.forBlock['oc_rp2_ir_transmit'] = function (block, generator) {
|
2023-06-25 12:18:33 +00:00
|
|
|
|
var value_signal = Blockly.Python.valueToCode(block, 'signal', Blockly.Python.ORDER_ATOMIC);
|
|
|
|
|
var code = `_tx.send(${value_signal})\n`;
|
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/************************ */
|
|
|
|
|
/** RP2 MicroPython Slave */
|
|
|
|
|
/************************ */
|
|
|
|
|
Blockly.Blocks['oc_i2cslave'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.appendValueInput("i2c_addr")
|
|
|
|
|
.setCheck("Number")
|
|
|
|
|
.appendField("RP2 スレーブ:I2Cアドレス");
|
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.appendField(new Blockly.FieldVariable("データ"), "data")
|
|
|
|
|
.appendField("を受け取ったら");
|
|
|
|
|
this.appendStatementInput("do")
|
|
|
|
|
.setCheck(null);
|
|
|
|
|
this.setInputsInline(false);
|
|
|
|
|
this.setPreviousStatement(true, null);
|
|
|
|
|
this.setTooltip("Raspberry Pi Pico(及びその互換機)を I2Cスレーブ化します。受信データは1バイトデータです。i2c_slave.py が必要です。");
|
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
this.setStyle('gpio_blocks');
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
python.pythonGenerator.forBlock['oc_i2cslave'] = function (block, generator) {
|
2023-06-25 12:18:33 +00:00
|
|
|
|
var value_i2c_addr = Blockly.Python.valueToCode(block, 'i2c_addr', Blockly.Python.ORDER_ATOMIC);
|
|
|
|
|
var variable_data = Blockly.Python.nameDB_.getName(block.getFieldValue('data'), Blockly.Names.NameType.VARIABLE);
|
|
|
|
|
var statements_do = Blockly.Python.statementToCode(block, 'do');
|
|
|
|
|
Blockly.Python.provideFunction_(
|
|
|
|
|
'import_i2cslave', ['from i2cSlave import i2c_slave']
|
|
|
|
|
);
|
|
|
|
|
var code = `_i2cs = i2c_slave(0,sda=0,scl=1,slaveAddress=${value_i2c_addr})
|
|
|
|
|
while True:
|
|
|
|
|
${variable_data} = int(_i2cs.get())
|
|
|
|
|
${statements_do}
|
|
|
|
|
`;
|
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
|
|
|
// 開発用
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
|
|
|
Blockly.Blocks['ugj_dev_run_js'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.appendValueInput("arg")
|
|
|
|
|
.setCheck(null)
|
|
|
|
|
.setAlign(Blockly.ALIGN_RIGHT)
|
|
|
|
|
.appendField("Arg:");
|
|
|
|
|
this.appendValueInput("code")
|
|
|
|
|
.setCheck("String")
|
|
|
|
|
.setAlign(Blockly.ALIGN_RIGHT)
|
|
|
|
|
.appendField("Code:");
|
|
|
|
|
this.appendValueInput("password")
|
2021-10-22 14:33:59 +00:00
|
|
|
|
.setCheck("String")
|
|
|
|
|
.setAlign(Blockly.ALIGN_RIGHT)
|
|
|
|
|
.appendField("Pwd:");
|
|
|
|
|
this.setPreviousStatement(true, null);
|
|
|
|
|
this.setNextStatement(true, null);
|
|
|
|
|
this.setColour(230);
|
|
|
|
|
this.setTooltip("");
|
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_dev_run_js'] = function (block, generator) {
|
2021-10-22 14:33:59 +00:00
|
|
|
|
var value_arg = Blockly.JavaScript.valueToCode(block, 'arg', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var value_code = Blockly.JavaScript.valueToCode(block, 'code', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var value_password = Blockly.JavaScript.valueToCode(block, 'password', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
// TODO: Assemble JavaScript into code variable.
|
|
|
|
|
var code = `
|
|
|
|
|
const crypto = require('crypto');
|
|
|
|
|
let hashHex = crypto.createHash('sha256').update(${value_password}, 'utf8').digest('hex');
|
|
|
|
|
if (hashHex == ugj_const.dev_hash) {
|
|
|
|
|
let AsyncFunction = Object.getPrototypeOf(async function () { }).constructor
|
|
|
|
|
let ocogeFunc = new AsyncFunction('arg', ${value_code});
|
|
|
|
|
await ocogeFunc(${value_arg});
|
|
|
|
|
}
|
|
|
|
|
else console.log('invalid certification');
|
|
|
|
|
`;
|
|
|
|
|
return code;
|
|
|
|
|
};
|
2022-01-11 05:03:17 +00:00
|
|
|
|
|
|
|
|
|
Blockly.Blocks['testblock'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.appendValueInput("foo")
|
|
|
|
|
.setCheck("Variable")
|
|
|
|
|
.appendField("テスト");
|
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setPreviousStatement(true, null);
|
|
|
|
|
this.setNextStatement(true, null);
|
|
|
|
|
this.setColour(230);
|
|
|
|
|
this.setTooltip("");
|
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['testblock'] = function (block, generator) {
|
2022-01-11 05:03:17 +00:00
|
|
|
|
var value_foo = Blockly.JavaScript.valueToCode(block, 'foo', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
// TODO: Assemble JavaScript into code variable.
|
|
|
|
|
var code = `${value_foo} = 42;\n`;
|
|
|
|
|
return code;
|
2022-05-24 13:11:10 +00:00
|
|
|
|
};
|
2022-06-07 11:14:29 +00:00
|
|
|
|
|
|
|
|
|
/** 互換性 */
|
|
|
|
|
|
2022-07-26 08:09:53 +00:00
|
|
|
|
/** Fix Basic Blocks ****************************************************************************************/
|
|
|
|
|
Blockly.Blocks['ugj_control_for'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.appendValueInput("index")
|
|
|
|
|
.setCheck("Variable");
|
|
|
|
|
this.appendValueInput("from")
|
|
|
|
|
.setCheck("Number")
|
|
|
|
|
.appendField("を");
|
|
|
|
|
this.appendValueInput("to")
|
|
|
|
|
.setCheck("Number")
|
|
|
|
|
.appendField("から");
|
|
|
|
|
this.appendValueInput("by")
|
|
|
|
|
.setCheck("Number")
|
|
|
|
|
.appendField("まで");
|
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.appendField("ずつ")
|
|
|
|
|
.appendField(new Blockly.FieldDropdown([["増やして", "+"], ["減らして", "-"]]), "crease");
|
|
|
|
|
this.appendStatementInput("do")
|
|
|
|
|
.setCheck(null);
|
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setPreviousStatement(true, null);
|
|
|
|
|
this.setNextStatement(true, null);
|
|
|
|
|
this.setTooltip("インデックス番号を決められた数ずつ増やし(減らし)ながら、ステートメントを実行します。");
|
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
this.setStyle('loop_blocks');
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_control_for'] = function (block, generator) {
|
2022-07-26 08:09:53 +00:00
|
|
|
|
var value_index = Blockly.JavaScript.valueToCode(block, 'index', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
// var variable_index = Blockly.JavaScript.nameDB_.getName(block.getFieldValue('index'), Blockly.Variables.NAME_TYPE);
|
|
|
|
|
var value_from = Blockly.JavaScript.valueToCode(block, 'from', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var value_to = Blockly.JavaScript.valueToCode(block, 'to', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var value_by = Blockly.JavaScript.valueToCode(block, 'by', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var dropdown_crease = block.getFieldValue('crease');
|
|
|
|
|
var statements_do = Blockly.JavaScript.statementToCode(block, 'do');
|
|
|
|
|
let daishou;
|
|
|
|
|
if (dropdown_crease == '+') { daishou = '<'; }
|
|
|
|
|
else { daishou = '>'; }
|
|
|
|
|
var code = [
|
|
|
|
|
`for (${value_index} = ${value_from}; ${value_index} ${daishou}= ${value_to}; ${value_index} ${dropdown_crease}= ${Math.abs(value_by)}) {`,
|
|
|
|
|
statements_do,
|
|
|
|
|
`}`,
|
|
|
|
|
''
|
|
|
|
|
].join('\n');
|
|
|
|
|
return code;
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
python.pythonGenerator.forBlock['ugj_control_for'] = function (block, generator) {
|
2022-07-26 08:09:53 +00:00
|
|
|
|
var value_index = Blockly.Python.valueToCode(block, 'index', Blockly.Python.ORDER_ATOMIC);
|
|
|
|
|
// var variable_index = Blockly.Python.nameDB_.getName(block.getFieldValue('index'), Blockly.Variables.NAME_TYPE);
|
|
|
|
|
var value_from = Blockly.Python.valueToCode(block, 'from', Blockly.Python.ORDER_ATOMIC);
|
|
|
|
|
var value_to = Blockly.Python.valueToCode(block, 'to', Blockly.Python.ORDER_ATOMIC);
|
|
|
|
|
var value_by = Blockly.Python.valueToCode(block, 'by', Blockly.Python.ORDER_ATOMIC);
|
|
|
|
|
var dropdown_crease = block.getFieldValue('crease');
|
|
|
|
|
var statements_do = Blockly.Python.statementToCode(block, 'do');
|
|
|
|
|
if (statements_do === '') statements_do = ' pass';
|
|
|
|
|
if (dropdown_crease == '+') { value_by = Math.abs(value_by); value_to++; }
|
|
|
|
|
else { value_by = Math.abs(value_by) * (-1); value_to--; }
|
|
|
|
|
var code = [
|
|
|
|
|
`for ${value_index} in range(${value_from}, ${value_to}, ${value_by}) :`,
|
|
|
|
|
statements_do,
|
|
|
|
|
''
|
|
|
|
|
].join('\n');
|
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Blockly.Blocks['ugj_controls_foreach'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.appendValueInput("list")
|
|
|
|
|
.setCheck("Array")
|
|
|
|
|
.appendField("リスト");
|
|
|
|
|
this.appendValueInput("item")
|
|
|
|
|
.setCheck("Variable")
|
|
|
|
|
.appendField("の各");
|
|
|
|
|
this.appendDummyInput()
|
|
|
|
|
.appendField("について");
|
|
|
|
|
this.appendStatementInput("do")
|
|
|
|
|
.setCheck(null);
|
|
|
|
|
this.setInputsInline(true);
|
|
|
|
|
this.setPreviousStatement(true, null);
|
|
|
|
|
this.setNextStatement(true, null);
|
|
|
|
|
this.setTooltip("リストの各項目について、その項目の内容を変数「項目」に代入してステートメントを実行します。");
|
|
|
|
|
this.setHelpUrl("");
|
|
|
|
|
this.setStyle('loop_blocks');
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_controls_foreach'] = function (block, generator) {
|
2022-07-26 08:09:53 +00:00
|
|
|
|
var value_list = Blockly.JavaScript.valueToCode(block, 'list', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var value_item = Blockly.JavaScript.valueToCode(block, 'item', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var statements_do = Blockly.JavaScript.statementToCode(block, 'do');
|
|
|
|
|
var code = [
|
|
|
|
|
`for (let _index in ${value_list}) {`,
|
|
|
|
|
`${value_item} = ${value_list}[_index];`,
|
|
|
|
|
statements_do,
|
|
|
|
|
`}`,
|
|
|
|
|
''
|
|
|
|
|
].join('\n');
|
|
|
|
|
return code;
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
python.pythonGenerator.forBlock['ugj_controls_foreach'] = function (block, generator) {
|
2022-07-26 08:09:53 +00:00
|
|
|
|
var value_list = Blockly.Python.valueToCode(block, 'list', Blockly.Python.ORDER_ATOMIC);
|
|
|
|
|
var value_item = Blockly.Python.valueToCode(block, 'item', Blockly.Python.ORDER_ATOMIC);
|
|
|
|
|
var statements_do = Blockly.Python.statementToCode(block, 'do');
|
|
|
|
|
if (statements_do === '') statements_do = ' pass';
|
|
|
|
|
var code = [
|
|
|
|
|
`for ${value_item} in ${value_list}:`,
|
|
|
|
|
statements_do,
|
|
|
|
|
''
|
|
|
|
|
].join('\n');
|
|
|
|
|
return code;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
2022-06-07 11:14:29 +00:00
|
|
|
|
// /******************/
|
|
|
|
|
// /** Set Interval **/
|
|
|
|
|
// /******************/
|
|
|
|
|
// Blockly.Blocks['ugj_set_interval'] = {
|
|
|
|
|
// init: function () {
|
|
|
|
|
// this.appendValueInput("sec")
|
|
|
|
|
// .setCheck("Number");
|
|
|
|
|
// this.appendDummyInput()
|
|
|
|
|
// .appendField("秒ごとにくり返す");
|
|
|
|
|
// this.appendStatementInput("do")
|
|
|
|
|
// .setCheck(null);
|
|
|
|
|
// this.setInputsInline(true);
|
|
|
|
|
// this.setPreviousStatement(true, null);
|
|
|
|
|
// this.setNextStatement(true, null);
|
|
|
|
|
// this.setStyle('special_blocks')
|
|
|
|
|
// this.setTooltip("非同期で繰り返し処理を行います(停止ボタンまたは停止ブロックで停止)。");
|
|
|
|
|
// this.setHelpUrl("");
|
|
|
|
|
// }
|
|
|
|
|
// };
|
2023-08-18 23:53:45 +00:00
|
|
|
|
// javascript.javascriptGenerator.forBlock['ugj_set_interval'] = function (block, generator) {
|
2022-06-07 11:14:29 +00:00
|
|
|
|
// var value_sec = Blockly.JavaScript.valueToCode(block, 'sec', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
// var statements_do = Blockly.JavaScript.statementToCode(block, 'do');
|
|
|
|
|
// var code = [
|
|
|
|
|
// 'let _interval = setInterval( async () => {',
|
|
|
|
|
// statements_do,
|
|
|
|
|
// `}, ${value_sec}*1000);`,
|
|
|
|
|
// ''
|
|
|
|
|
// ].join('\n');
|
|
|
|
|
// return code;
|
|
|
|
|
// };
|
|
|
|
|
// /******************** */
|
|
|
|
|
// /** Clear Interval ** */
|
|
|
|
|
// /******************** */
|
|
|
|
|
// Blockly.Blocks['ugj_special_clearinterval'] = {
|
|
|
|
|
// init: function () {
|
|
|
|
|
// this.appendDummyInput()
|
|
|
|
|
// .appendField("繰り返しを停止する");
|
|
|
|
|
// this.setInputsInline(true);
|
|
|
|
|
// this.setPreviousStatement(true, null);
|
|
|
|
|
// this.setNextStatement(true, null);
|
|
|
|
|
// this.setStyle('special_blocks')
|
|
|
|
|
// this.setTooltip("非同期の繰り返し処理を停止します。");
|
|
|
|
|
// this.setHelpUrl("");
|
|
|
|
|
// }
|
|
|
|
|
// };
|
2023-08-18 23:53:45 +00:00
|
|
|
|
// javascript.javascriptGenerator.forBlock['ugj_special_clearinterval'] = function (block, generator) {
|
2022-06-07 11:14:29 +00:00
|
|
|
|
// var code = 'clearInterval(_interval);\n';
|
|
|
|
|
// return code;
|
|
|
|
|
// };
|
|
|
|
|
// /********+********/
|
|
|
|
|
// /** Set Timeout **/
|
|
|
|
|
// /********+********/
|
|
|
|
|
// Blockly.Blocks['ugj_set_timeout'] = {
|
|
|
|
|
// init: function () {
|
|
|
|
|
// this.appendValueInput("sec")
|
|
|
|
|
// .setCheck("Number");
|
|
|
|
|
// this.appendDummyInput()
|
|
|
|
|
// .appendField("秒待ってから");
|
|
|
|
|
// this.appendStatementInput("do")
|
|
|
|
|
// .setCheck(null);
|
|
|
|
|
// this.setInputsInline(true);
|
|
|
|
|
// this.setPreviousStatement(true, null);
|
|
|
|
|
// this.setNextStatement(true, null);
|
|
|
|
|
// this.setStyle('special_blocks')
|
|
|
|
|
// this.setTooltip("指定した秒数だけ待ってから実行します。");//内側のブロック部を 外側下に接続したものは待たずに直ちに実行されます(非同期動作)。
|
|
|
|
|
// this.setHelpUrl("");
|
|
|
|
|
// }
|
|
|
|
|
// };
|
2023-08-18 23:53:45 +00:00
|
|
|
|
// javascript.javascriptGenerator.forBlock['ugj_set_timeout'] = function (block, generator) {
|
2022-06-07 11:14:29 +00:00
|
|
|
|
// var value_sec = Blockly.JavaScript.valueToCode(block, 'sec', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
// var statements_do = Blockly.JavaScript.statementToCode(block, 'do');
|
|
|
|
|
// var code = `let _interval = setTimeout(async () => {\n${statements_do}}, ${value_sec}*1000);\n`;
|
|
|
|
|
// return code;
|
2022-12-20 14:16:28 +00:00
|
|
|
|
// };
|
2023-01-12 12:59:17 +00:00
|
|
|
|
|
2023-06-25 12:18:33 +00:00
|
|
|
|
// 削除予定
|
|
|
|
|
/********************** */
|
|
|
|
|
/** Open Serial Port ** */
|
|
|
|
|
/********************** */
|
|
|
|
|
var ugjSerialOpenDefinition = {
|
|
|
|
|
"type": "ugj_serial_open",
|
|
|
|
|
"message0": "%{BKY_SERIAL_OPEN_TITLE}",
|
|
|
|
|
"args0": [
|
|
|
|
|
{
|
|
|
|
|
"type": "field_dropdown",
|
|
|
|
|
"name": "baud",
|
|
|
|
|
"options": [
|
|
|
|
|
[
|
|
|
|
|
"9600",
|
|
|
|
|
"9600"
|
|
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
"19200",
|
|
|
|
|
"19200"
|
|
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
"115200",
|
|
|
|
|
"115200"
|
|
|
|
|
]
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"inputsInline": true,
|
|
|
|
|
"previousStatement": null,
|
|
|
|
|
"nextStatement": null,
|
|
|
|
|
"tooltip": "%{BKY_SERIAL_OPEN_TOOLTIP}",
|
|
|
|
|
"helpUrl": "",
|
|
|
|
|
"style": "gpio_blocks"
|
|
|
|
|
};
|
|
|
|
|
Blockly.Blocks['ugj_serial_open'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.jsonInit(ugjSerialOpenDefinition);
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_serial_open'] = function (block, generator) {
|
2023-06-25 12:18:33 +00:00
|
|
|
|
// var value_tty = Blockly.JavaScript.valueToCode(block, 'tty', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var dropdown_baud = block.getFieldValue('baud');
|
|
|
|
|
// Blockly.JavaScript.provideFunction_(
|
|
|
|
|
// 'require_gpio', require_gpio
|
|
|
|
|
// );
|
|
|
|
|
var code = `let _ser_hand = await _rg.serial_open('/dev/ttyACM0', ${dropdown_baud});\nconsole.log(_ser_hand);\n`;
|
|
|
|
|
// var code = `await _rg.serial_open('/dev/serial0', ${dropdown_baud});\n`;
|
|
|
|
|
return code;
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
// python.pythonGenerator.forBlock['ugj_serial_open'] = function (block, generator) {
|
2023-06-25 12:18:33 +00:00
|
|
|
|
// var value_tty = Blockly.Python.valueToCode(block, 'tty', Blockly.Python.ORDER_ATOMIC);
|
|
|
|
|
// var dropdown_baud = block.getFieldValue('baud');
|
|
|
|
|
// Blockly.Python.provideFunction_(
|
|
|
|
|
// 'import_lgpio', ['import lgpio as pi']
|
|
|
|
|
// );
|
|
|
|
|
// var code = `ser_hand = pi.serial_open(${value_tty}, ${dropdown_baud}, 0)\n`;
|
|
|
|
|
// return code;
|
|
|
|
|
// };
|
|
|
|
|
/*********************** */
|
|
|
|
|
/** Close Serial Port ** */
|
|
|
|
|
/*********************** */
|
|
|
|
|
var ugjSerialCloseDefinition = {
|
|
|
|
|
"type": "ugj_serial_close",
|
|
|
|
|
"message0": "%{BKY_SERIAL_CLOSE_TITLE}",
|
|
|
|
|
"inputsInline": true,
|
|
|
|
|
"previousStatement": null,
|
|
|
|
|
"nextStatement": null,
|
|
|
|
|
"tooltip": "%{BKY_SERIAL_CLOSE_TOOLTIP}",
|
|
|
|
|
"helpUrl": "",
|
|
|
|
|
"style": "gpio_blocks"
|
|
|
|
|
};
|
|
|
|
|
Blockly.Blocks['ugj_serial_close'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.jsonInit(ugjSerialCloseDefinition);
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_serial_close'] = function (block, generator) {
|
2023-06-25 12:18:33 +00:00
|
|
|
|
var code = 'await _rg.serial_close(_ser_hand);\n';
|
|
|
|
|
return code;
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
// python.pythonGenerator.forBlock['ugj_serial_close'] = function (block, generator) {
|
2023-06-25 12:18:33 +00:00
|
|
|
|
// var code = 'pi.serial_close(ser_hand)\n';
|
|
|
|
|
// return code;
|
|
|
|
|
// };
|
|
|
|
|
/************************** */
|
|
|
|
|
/** Write Data to Serial ** */
|
|
|
|
|
/************************** */
|
|
|
|
|
var ugjSerialWriteDefinition = {
|
|
|
|
|
"type": "ugj_serial_write",
|
|
|
|
|
"message0": "%{BKY_SERIAL_WRITE_TITLE}",
|
|
|
|
|
"args0": [
|
|
|
|
|
{
|
|
|
|
|
"type": "input_value",
|
|
|
|
|
"name": "data",
|
|
|
|
|
"check": "String"
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"inputsInline": true,
|
|
|
|
|
"previousStatement": null,
|
|
|
|
|
"nextStatement": null,
|
|
|
|
|
"tooltip": "%{BKY_SERIAL_WRITE_TOOLTIP}",
|
|
|
|
|
"helpUrl": "",
|
|
|
|
|
"style": "gpio_blocks"
|
|
|
|
|
};
|
|
|
|
|
Blockly.Blocks['ugj_serial_write'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.jsonInit(ugjSerialWriteDefinition);
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_serial_write'] = function (block, generator) {
|
2023-06-25 12:18:33 +00:00
|
|
|
|
var value_data = Blockly.JavaScript.valueToCode(block, 'data', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var code = `let ret = await _rg.serial_write(_ser_hand, ${value_data});\nconsole.log(ret);\n`;
|
|
|
|
|
return code;
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
// python.pythonGenerator.forBlock['ugj_serial_write'] = function (block, generator) {
|
2023-06-25 12:18:33 +00:00
|
|
|
|
// var value_data = Blockly.Python.valueToCode(block, 'data', Blockly.Python.ORDER_ATOMIC);
|
|
|
|
|
// var code = `await pi.serial_write(ser_hand, ${value_data}.encode())\n`;
|
|
|
|
|
// return code;
|
|
|
|
|
// };
|
|
|
|
|
|
|
|
|
|
/************************ */
|
|
|
|
|
/** Read Data from Serial */
|
|
|
|
|
/************************ */
|
|
|
|
|
var ugjSerialReadDefinition = {
|
|
|
|
|
"type": "ugj_serial_read",
|
|
|
|
|
"message0": "%{BKY_SERIAL_READ_TITLE}",
|
|
|
|
|
"args0": [
|
|
|
|
|
{
|
|
|
|
|
"type": "input_value",
|
|
|
|
|
"name": "count",
|
|
|
|
|
"check": "Number"
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"inputsInline": true,
|
|
|
|
|
"output": null,
|
|
|
|
|
"tooltip": "%{BKY_SERIAL_READ_TOOLTIP}",
|
|
|
|
|
"helpUrl": "",
|
|
|
|
|
"style": "gpio_blocks"
|
|
|
|
|
};
|
|
|
|
|
Blockly.Blocks['ugj_serial_read'] = {
|
|
|
|
|
init: function () {
|
|
|
|
|
this.jsonInit(ugjSerialReadDefinition);
|
|
|
|
|
}
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
javascript.javascriptGenerator.forBlock['ugj_serial_read'] = function (block, generator) {
|
2023-06-25 12:18:33 +00:00
|
|
|
|
var value_count = Blockly.JavaScript.valueToCode(block, 'count', Blockly.JavaScript.ORDER_ATOMIC);
|
|
|
|
|
var code = `await _rg.serial_read(_ser_hand, ${value_count})`;
|
|
|
|
|
return [code, Blockly.JavaScript.ORDER_ATOMIC];
|
|
|
|
|
};
|
2023-08-18 23:53:45 +00:00
|
|
|
|
// python.pythonGenerator.forBlock['ugj_serial_read'] = function (block, generator) {
|
2023-06-25 12:18:33 +00:00
|
|
|
|
// var value_count = Blockly.Python.valueToCode(block, 'count', Blockly.Python.ORDER_ATOMIC);
|
|
|
|
|
// var code = `await pi.serial_read(ser_hand, ${value_count}).decode()`;
|
|
|
|
|
// return [code, Blockly.Python.ORDER_ATOMIC];
|
|
|
|
|
// };
|