[update] Web Demo でもセンサーブロックが表示されるようにした

This commit is contained in:
ocogeclub 2023-01-10 21:46:36 +09:00
parent 49f3712704
commit ef8f659468
15 changed files with 416 additions and 398 deletions

View File

@ -9,9 +9,9 @@ const ugj_const = {
mascot_defname: 'tamachee.png',
library_dirname: 'lib',
document_root: 'Documents',
tmp_dir: '.ocogeclub/tmp',
executable_path: '.ocogeclub/apps/',
blocks_sensors_dir: 'blocks/sensors/',
tmp_dir: '.ocogeclub/tmp', //ホームディレクトリからのパス
executable_path: '.ocogeclub/apps/', //ホームディレクトリからのパス
blocks_dir: './blocks', // 動作するコードを web demo で生成するためには「./」をつける
localStorage_fname: 'ocoge.json',
error_ja_all: 'エラーが発生しました。\n『おこげ倶楽部』までお問い合わせください。',
pig: 'pigpio',
@ -38,7 +38,7 @@ class appTool {
this.doc_root = this.path.join(process.env["HOME"], ugj_const.document_root);
this.doc_current = this.path.join(process.env["HOME"], ugj_const.document_root);
this.executable_path = this.path.join(process.env["HOME"], ugj_const.executable_path);
// this.blocks_sensors_dir = this.path.join(process.env["HOME"], ugj_const.blocks_sensors_dir);
// this.blocks_dir = this.path.join(process.env["HOME"], ugj_const.blocks_dir);
this.tmp_dir = this.path.join(process.env["HOME"], ugj_const.tmp_dir);
const EventEmitter = require('events');
this.ugjEmitter = new EventEmitter();
@ -51,44 +51,44 @@ class appTool {
this.app_path = await this.ipcRenderer.invoke('get_app_path');
this.mascotFilePath = this.path.join(this.app_path, ugj_const.mascot_dirname, ugj_const.mascot_defname);
this.library_path = this.path.join(this.app_path, ugj_const.library_dirname);
this.blocks_sensors_dir = this.path.join(this.app_path, ugj_const.blocks_sensors_dir);
this.loadSensorblocks();
this.blocks_dir = this.path.join(this.app_path, ugj_const.blocks_dir);
// this.loadSensorblocks();
}
// センサーブロックのロード
loadSensorblocks() {
// ディレクトリの有無
if (!this.fs.existsSync(this.blocks_sensors_dir)) return;
// ブロックデータ格納ディレクトリのリスト
const allDirents = this.fs.readdirSync(this.blocks_sensors_dir, { withFileTypes: true });
const blocks_list = allDirents.filter(dirent => dirent.isDirectory()).map(({ name }) => name);
// センサーカテゴリのインスタンス
let category_sensors = workspace.getToolbox().getToolboxItemById('category_sensors');
let flyout_contents = []; // フライアウトのjsonのリスト
for (let sensor_dir of blocks_list) { //ディレクトリ巡り
if (sensor_dir.charAt(0) == '.') continue; //隠しディレクトリをスキップ
// フライアウトのjsonを取得してパース、リストに追加
let fname = this.path.join(this.blocks_sensors_dir, sensor_dir, 'index.json');
let json_text = this.fs.readFileSync(fname);
let obj = JSON.parse(json_text);
flyout_contents = flyout_contents.concat(obj);
// ブロック定義のスクリプト要素をbody要素の最後に追加
fname = this.path.join(this.blocks_sensors_dir, sensor_dir, 'index.js');
let script = document.createElement('script');
script.type = 'text/javascript';
script.src = fname;
document.body.appendChild(script);
}
let lastline = [{
"kind": "label",
"text": " ",
"web-line": "4.0",
"web-line-width": "200"
}];
flyout_contents = flyout_contents.concat(lastline);
// センサーカテゴリのフライアウトをアップデート
category_sensors.updateFlyoutContents(flyout_contents);
}
// loadSensorblocks() {
// // ディレクトリの有無
// if (!this.fs.existsSync(this.blocks_dir)) return;
// // ブロックデータ格納ディレクトリのリスト
// const allDirents = this.fs.readdirSync(this.blocks_dir, { withFileTypes: true });
// const blocks_list = allDirents.filter(dirent => dirent.isDirectory()).map(({ name }) => name);
// // センサーカテゴリのインスタンス
// let category_sensors = workspace.getToolbox().getToolboxItemById('category_sensors');
// let flyout_contents = []; // フライアウトのjsonのリスト
// for (let sensor_dir of blocks_list) { //ディレクトリ巡り
// if (sensor_dir.charAt(0) == '.') continue; //隠しディレクトリをスキップ
// // フライアウトのjsonを取得してパース、リストに追加
// let fname = this.path.join(this.blocks_dir, sensor_dir, 'index.json');
// let json_text = this.fs.readFileSync(fname);
// let obj = JSON.parse(json_text);
// flyout_contents = flyout_contents.concat(obj);
// // ブロック定義のスクリプト要素をbody要素の最後に追加
// fname = this.path.join(this.blocks_dir, sensor_dir, 'index.js');
// let script = document.createElement('script');
// script.type = 'text/javascript';
// script.src = fname;
// document.body.appendChild(script);
// }
// let lastline = [{
// "kind": "label",
// "text": " ",
// "web-line": "4.0",
// "web-line-width": "200"
// }];
// flyout_contents = flyout_contents.concat(lastline);
// // センサーカテゴリのフライアウトをアップデート
// category_sensors.updateFlyoutContents(flyout_contents);
// }
// 0で数値の桁合わせ : NUM=値 LEN=桁数
@ -332,6 +332,7 @@ class webTool {
// GPIOブロックは使えません
this.gpio_backend = ugj_const.pig;
this.lang = 'js';
this.blocks_dir = ugj_const.blocks_dir;
}
// マスコット
@ -378,7 +379,12 @@ class webTool {
cleanupGPIO() { ; }
path = {
join: function (a = '', b = '', c = '', d = '', e = '') {
return a + b + c + d + e;
const removeTrailingSlash = path => path.endsWith('/') ? path.substr(0, path.length - 1) : path;
return removeTrailingSlash(a) +
(b ? '/' + removeTrailingSlash(b) : '') +
(c ? '/' + removeTrailingSlash(c) : '') +
(d ? '/' + removeTrailingSlash(d) : '') +
(e ? '/' + removeTrailingSlash(e) : '')
}
}
}

20
blocks/index.js Normal file
View File

@ -0,0 +1,20 @@
var flyout_contents = [];
const registerCategory = (category_dir, subcategories) => {
for (let sbctgr of subcategories) {
let fname = ugj_const.blocks_dir + '/' + category_dir + "/" + sbctgr + "/index.js";
let script = document.createElement('script');
script.type = 'text/javascript';
script.src = fname;
script.async = false;
document.body.appendChild(script);
}
}
// センサーカテゴリ
registerCategory('sensors', [ // カテゴリディレクトリ名
"amg8833",
"paj7620",
"bme280",
"dht11",
"z-line" // フライアウト下端の不可視ライン。スクリプトにカテゴリ名を含むので注意
]);

View File

@ -25,7 +25,7 @@ Blockly.Msg["UGJ_TENSORSET_PARSE_TOOLTIP"] = "JSONテキストをパースして
/******************* */
/** Init Grid-Eye ** */
/******************* */
var ugjGridEyeInitDefinition = {
Blockly.defineBlocksWithJsonArray([{
"type": "ugj_grideye_init",
"message0": "%{BKY_UGJ_GRIDEYE_INIT_TITLE}",
"args0": [
@ -50,18 +50,13 @@ var ugjGridEyeInitDefinition = {
"tooltip": "%{BKY_UGJ_GRIDEYE_INIT_TOOLTIP}",
"helpUrl": "",
"style": "sensor_blocks"
};
Blockly.Blocks['ugj_grideye_init'] = {
init: function () {
this.jsonInit(ugjGridEyeInitDefinition);
}
};
}]);
Blockly.JavaScript['ugj_grideye_init'] = function (block) {
var dropdown_addr = block.getFieldValue('addr');
Blockly.JavaScript.provideFunction_(
'require_gpio', [`const _pi = require('@ocoge.club/` + apptool.gpio_backend + `');`]
);
let modpath = apptool.path.join(apptool.blocks_sensors_dir, 'amg8833', 'AMG8833x.js');
let modpath = apptool.path.join(apptool.blocks_dir, 'sensors', 'amg8833', 'AMG8833x.js');
Blockly.JavaScript.provideFunction_(
'require_amg8833', [`const _amg8833 = require('${modpath}');`]
);
@ -71,19 +66,14 @@ Blockly.JavaScript['ugj_grideye_init'] = function (block) {
/********************** */
/** Grid-Eye 本体温度 ** */
/********************** */
var ugjGridEyeThermistorDefinition = {
Blockly.defineBlocksWithJsonArray([{
"type": "ugj_grideye_thermistor",
"message0": "%{BKY_UGJ_GRIDEYE_THERMISTOR_TITLE}",
"output": "Number",
"tooltip": "%{BKY_UGJ_GRIDEYE_THERMISTOR_TOOLTIP}",
"helpUrl": "",
"style": "sensor_blocks"
};
Blockly.Blocks['ugj_grideye_thermistor'] = {
init: function () {
this.jsonInit(ugjGridEyeThermistorDefinition);
}
};
}]);
Blockly.JavaScript['ugj_grideye_thermistor'] = function (block) {
var code = `await _amg8833.read_thermistor()`;
return [code, Blockly.JavaScript.ORDER_NONE];
@ -92,7 +82,7 @@ Blockly.JavaScript['ugj_grideye_thermistor'] = function (block) {
/**************************** */
/** Read Temperature Array ** */
/**************************** */
var ugjGridEyeReadDefinition = {
Blockly.defineBlocksWithJsonArray([{
"type": "ugj_grideye_read",
"message0": "%{BKY_UGJ_GRIDEYE_READ_TITLE}",
"inputsInline": true,
@ -100,12 +90,7 @@ var ugjGridEyeReadDefinition = {
"tooltip": "%{BKY_UGJ_GRIDEYE_READ_TOOLTIP}",
"helpUrl": "",
"style": "sensor_blocks"
};
Blockly.Blocks['ugj_grideye_read'] = {
init: function () {
this.jsonInit(ugjGridEyeReadDefinition);
}
};
}]);
Blockly.JavaScript['ugj_grideye_read'] = function (block) {
var code = 'await _amg8833.read_temp_array()';
return [code, Blockly.JavaScript.ORDER_ATOMIC];
@ -113,7 +98,7 @@ Blockly.JavaScript['ugj_grideye_read'] = function (block) {
/******************* */
/** Stop Grid-Eye ** */
/******************* */
var ugjGridEyeStopDefinition = {
Blockly.defineBlocksWithJsonArray([{
"type": "ugj_grideye_stop",
"message0": "%{BKY_UGJ_GRIDEYE_STOP_TITLE}",
"inputsInline": true,
@ -122,12 +107,7 @@ var ugjGridEyeStopDefinition = {
"tooltip": "%{BKY_UGJ_GRIDEYE_STOP_TOOLTIP}",
"helpUrl": "",
"style": "sensor_blocks"
};
Blockly.Blocks['ugj_grideye_stop'] = {
init: function () {
this.jsonInit(ugjGridEyeStopDefinition);
}
};
}]);
Blockly.JavaScript['ugj_grideye_stop'] = function (block) {
var code = 'await _amg8833.stop();\n';
return code;
@ -137,7 +117,7 @@ Blockly.JavaScript['ugj_grideye_stop'] = function (block) {
/***************************** */
/** GridEye 表示キャンバス作成 ** */
/***************************** */
var ugjGridEyeCanvasCreateDefinition = {
Blockly.defineBlocksWithJsonArray([{
"type": "ugj_grideye_canvas_create",
"message0": "%{BKY_UGJ_GRIDEYE_CANVAS_CREATE_TITLE}",
"inputsInline": true,
@ -146,12 +126,7 @@ var ugjGridEyeCanvasCreateDefinition = {
"tooltip": "%{BKY_UGJ_GRIDEYE_CANVAS_CREATE_TOOLTIP}",
"helpUrl": "",
"style": "multimedia_blocks"
};
Blockly.Blocks['ugj_grideye_canvas_create'] = {
init: function () {
this.jsonInit(ugjGridEyeCanvasCreateDefinition);
}
};
}]);
Blockly.JavaScript['ugj_grideye_canvas_create'] = function (block) {
var code = `let _grideye_canvas = document.createElement('canvas');
_grideye_canvas.setAttribute('width', 8);
@ -169,7 +144,8 @@ Blockly.JavaScript['ugj_grideye_canvas_create'] = function (block) {
/********************************************** */
/** Draw IR Array Data to Image Data ** */
/********************************************** */
var ugjDrawGrideyedataDefinition = {
Blockly.defineBlocksWithJsonArray([{
"type": "ugj_draw_grideyedata",
"message0": "%{BKY_UGJ_DRAW_GRIDEYEDATA_TITLE}",
"args0": [
@ -211,12 +187,7 @@ var ugjDrawGrideyedataDefinition = {
"tooltip": "%{BKY_UGJ_DRAW_GRIDEYEDATA_TOOLTIP}",
"helpUrl": "",
"style": "multimedia_blocks"
};
Blockly.Blocks['ugj_draw_grideyedata'] = {
init: function () {
this.jsonInit(ugjDrawGrideyedataDefinition);
}
};
}]);
Blockly.JavaScript['ugj_draw_grideyedata'] = function (block) {
var value_amg8833data = Blockly.JavaScript.valueToCode(block, 'amg8833data', Blockly.JavaScript.ORDER_ATOMIC);
var colour_color_high = block.getFieldValue('color_high');
@ -258,7 +229,7 @@ Blockly.JavaScript['ugj_draw_grideyedata'] = function (block) {
/**************************** */
/** Teachable Machine を開始** */
/**************************** */
var ugjTeachableMachineDefinition = {
Blockly.defineBlocksWithJsonArray([{
"type": "ugj_teachable_machine",
"message0": "%{BKY_UGJ_TEACHABLE_MACHINE_TITLE}",
"inputsInline": true,
@ -267,12 +238,7 @@ var ugjTeachableMachineDefinition = {
"tooltip": "%{BKY_UGJ_TEACHABLE_MACHINE_TOOLTIP}",
"helpUrl": "",
"style": "multimedia_blocks"
};
Blockly.Blocks['ugj_teachable_machine'] = {
init: function () {
this.jsonInit(ugjTeachableMachineDefinition);
}
};
}]);
Blockly.JavaScript['ugj_teachable_machine'] = function (block) {
Blockly.JavaScript.provideFunction_(
'require_ts', [`const _tf = require('@tensorflow/tfjs-node');`]
@ -292,7 +258,7 @@ Blockly.JavaScript['ugj_teachable_machine'] = function (block) {
/************************* */
/** GridEye で推論を行う ** */
/************************* */
var ugjGridEyePredictClassDefinition = {
Blockly.defineBlocksWithJsonArray([{
"type": "ugj_grideye_predict_class",
"message0": "%{BKY_UGJ_GRIDEYE_PREDICT_CLASS_TITLE}",
"inputsInline": true,
@ -300,12 +266,7 @@ var ugjGridEyePredictClassDefinition = {
"tooltip": "%{BKY_UGJ_GRIDEYE_PREDICT_CLASS_TOOLTIP}",
"helpUrl": "",
"style": "multimedia_blocks"
};
Blockly.Blocks['ugj_grideye_predict_class'] = {
init: function () {
this.jsonInit(ugjGridEyePredictClassDefinition);
}
};
}]);
Blockly.JavaScript['ugj_grideye_predict_class'] = function (block) {
var functionName = Blockly.JavaScript.provideFunction_( // left output にするための関数化
'_predictClass',
@ -327,7 +288,7 @@ Blockly.JavaScript['ugj_grideye_predict_class'] = function (block) {
/******************************************** */
/** ラベルをつけて Example をデータセットに追加 ** */
/******************************************** */
var ugjGridEyeAddExampleDefinition = {
Blockly.defineBlocksWithJsonArray([{
"type": "ugj_grideye_add_example",
"message0": "%{BKY_UGJ_GRIDEYE_ADD_EXAMPLE_TITLE}",
"args0": [
@ -343,12 +304,7 @@ var ugjGridEyeAddExampleDefinition = {
"tooltip": "%{BKY_UGJ_GRIDEYE_ADD_EXAMPLE_TOOLTIP}",
"helpUrl": "",
"style": "multimedia_blocks"
};
Blockly.Blocks['ugj_grideye_add_example'] = {
init: function () {
this.jsonInit(ugjGridEyeAddExampleDefinition);
}
};
}]);
Blockly.JavaScript['ugj_grideye_add_example'] = function (block) {
var value_class_id = Blockly.JavaScript.valueToCode(block, 'class_id', Blockly.JavaScript.ORDER_ATOMIC);
var code = `_classifier.addExample (_net.infer(_grideye_canvas, true), ${value_class_id});`;
@ -357,19 +313,14 @@ Blockly.JavaScript['ugj_grideye_add_example'] = function (block) {
/*************************** */
/** 学習したクラスを文字列化 ** */
/*************************** */
var ugjTensorsetStringifyDefinition = {
Blockly.defineBlocksWithJsonArray([{
"type": "ugj_tensorset_stringify",
"message0": "%{BKY_UGJ_TENSORSET_STRINGIFY_TITLE}",
"output": null,
"tooltip": "%{BKY_UGJ_TENSORSET_STRINGIFY_TOOLTIP}",
"helpUrl": "",
"style": "multimedia_blocks"
};
Blockly.Blocks['ugj_tensorset_stringify'] = {
init: function () {
this.jsonInit(ugjTensorsetStringifyDefinition);
}
};
}]);
Blockly.JavaScript['ugj_tensorset_stringify'] = function (block) {
var code = `JSON.stringify( Object.entries(_classifier.getClassifierDataset()).map(([label, data])=>[label, Array.from(data.dataSync()), data.shape]) )`;
return [code, Blockly.JavaScript.ORDER_NONE];
@ -377,7 +328,7 @@ Blockly.JavaScript['ugj_tensorset_stringify'] = function (block) {
/***************************************** */
/** jsonをデータセットに戻して分類器にセット ** */
/***************************************** */
var ugjTensorsetParseDefinition = {
Blockly.defineBlocksWithJsonArray([{
"type": "ugj_tensorset_parse",
"message0": "%{BKY_UGJ_TENSORSET_PARSE_TITLE}",
"args0": [
@ -392,17 +343,124 @@ var ugjTensorsetParseDefinition = {
"tooltip": "%{BKY_UGJ_TENSORSET_PARSE_TOOLTIP}",
"helpUrl": "",
"style": "multimedia_blocks"
};
Blockly.Blocks['ugj_tensorset_parse'] = {
init: function () {
this.jsonInit(ugjTensorsetParseDefinition);
}
};
}]);
Blockly.JavaScript['ugj_tensorset_parse'] = function (block) {
var value_class_data_json = Blockly.JavaScript.valueToCode(block, 'class_data_json', Blockly.JavaScript.ORDER_ATOMIC);
var code = `_classifier.setClassifierDataset( Object.fromEntries( JSON.parse(${value_class_data_json}).map(([label, data, shape])=>[label, _tf.tensor(data, shape)]) ) );`;
return code;
};
// 温度ブロック(ツールボックス上非表示)
Blockly.defineBlocksWithJsonArray([{
"type": "ugj_temp",
"message0": "%1",
"args0": [
{
"type": "field_slider",
"name": "temp",
"value": 15,
"min": 0,
"max": 40,
"precision": 1
}
],
"inputsInline": true,
"output": "Number",
"tooltip": "",
"helpUrl": "",
"style": "math_blocks"
}]);
Blockly.JavaScript['ugj_temp'] = function (block) {
var number_temp = block.getFieldValue('temp');
var code = `${number_temp}`;
return [code, Blockly.JavaScript.ORDER_NONE];
};
flyout_contents = flyout_contents.concat([
{
"kind": "label",
"text": "赤外線アレイセンサーサーマルカメラAMG8833",
"web-line": "4.0",
"web-line-width": "200"
},
{
"kind": "block",
"type": "ugj_grideye_init",
"fields": {
"addr": "0x69"
}
},
{
"kind": "block",
"type": "ugj_grideye_thermistor"
},
{
"kind": "block",
"type": "ugj_grideye_read"
},
{
"kind": "block",
"type": "ugj_grideye_stop"
},
{
"kind": "block",
"type": "ugj_grideye_canvas_create"
},
{
"kind": "block",
"type": "ugj_draw_grideyedata",
"fields": {
"color_high": "#ff0000",
"color_low": "#3333ff"
},
"inputs": {
"temp_high": {
"shadow": {
"type": "ugj_temp",
"fields": {
"temp": "28"
}
}
},
"temp_low": {
"shadow": {
"type": "ugj_temp",
"fields": {
"temp": "15"
}
}
}
}
},
{
"kind": "block",
"type": "ugj_teachable_machine"
},
{
"kind": "block",
"type": "ugj_grideye_predict_class"
},
{
"kind": "block",
"type": "ugj_grideye_add_example",
"inputs": {
"class_id": {
"shadow": {
"type": "math_number",
"fields": {
"NUM": "0"
}
}
}
}
},
{
"kind": "block",
"type": "ugj_tensorset_stringify"
},
{
"kind": "block",
"type": "ugj_tensorset_parse"
}
]);

View File

@ -1,87 +0,0 @@
[
{
"kind": "label",
"text": "赤外線アレイセンサーサーマルカメラAMG8833",
"web-line": "4.0",
"web-line-width": "200"
},
{
"kind": "block",
"type": "ugj_grideye_init",
"fields": {
"addr": "0x69"
}
},
{
"kind": "block",
"type": "ugj_grideye_thermistor"
},
{
"kind": "block",
"type": "ugj_grideye_read"
},
{
"kind": "block",
"type": "ugj_grideye_stop"
},
{
"kind": "block",
"type": "ugj_grideye_canvas_create"
},
{
"kind": "block",
"type": "ugj_draw_grideyedata",
"fields": {
"color_high": "#ff0000",
"color_low": "#3333ff"
},
"inputs": {
"temp_high": {
"shadow": {
"type": "math_number",
"fields": {
"NUM": "28"
}
}
},
"temp_low": {
"shadow": {
"type": "math_number",
"fields": {
"NUM": "15"
}
}
}
}
},
{
"kind": "block",
"type": "ugj_teachable_machine"
},
{
"kind": "block",
"type": "ugj_grideye_predict_class"
},
{
"kind": "block",
"type": "ugj_grideye_add_example",
"inputs": {
"class_id": {
"shadow": {
"type": "math_number",
"fields": {
"NUM": "0"
}
}
}
}
},
{
"kind": "block",
"type": "ugj_tensorset_stringify"
},
{
"kind": "block",
"type": "ugj_tensorset_parse"
}
]

View File

@ -20,7 +20,7 @@ Blockly.JavaScript['ugj_bme280'] = function (block) {
Blockly.JavaScript.provideFunction_(
'require_gpio', [`const _pi = require('@ocoge.club/` + apptool.gpio_backend + `');`]
);
let modpath = apptool.path.join(apptool.blocks_sensors_dir, 'bme280', 'BME280x.js');
let modpath = apptool.path.join(ugj_const.blocks_dir, 'sensors', 'bme280', 'BME280x.js');
Blockly.JavaScript.provideFunction_(
'require_bme280', [`const _bme280 = require('${modpath}');`]
);
@ -54,3 +54,27 @@ Blockly.JavaScript['ugj_bme280_data'] = function (block) {
var code = `_bmedata[${dropdown_thp}]`;
return [code, Blockly.JavaScript.ORDER_ATOMIC];
};
flyout_contents = flyout_contents.concat([
{
"kind": "label",
"text": "温湿度気圧センサー BME280",
"web-line": "4.0",
"web-line-width": "200"
},
{
"kind": "block",
"type": "ugj_bme280",
"fields": {
"addr": "0x76"
}
},
{
"kind": "block",
"type": "ugj_bme280_data",
"fields": {
"thp": "0"
}
}
]);

View File

@ -1,22 +0,0 @@
[
{
"kind": "label",
"text": "温湿度気圧センサー BME280",
"web-line": "4.0",
"web-line-width": "200"
},
{
"kind": "block",
"type": "ugj_bme280",
"fields": {
"addr": "0x76"
}
},
{
"kind": "block",
"type": "ugj_bme280_data",
"fields": {
"thp": "0"
}
}
]

View File

@ -15,7 +15,7 @@ Blockly.Blocks['ugj_dht11'] = {
};
Blockly.JavaScript['ugj_dht11'] = function (block) {
var value_pin = Blockly.JavaScript.valueToCode(block, 'pin', Blockly.JavaScript.ORDER_ATOMIC);
let pypath = apptool.path.join(apptool.blocks_sensors_dir, 'dht11', 'dht11.py');
let pypath = apptool.path.join(ugj_const.blocks_dir, 'sensors', 'dht11', 'dht11.py');
var code = `let _th = require('child_process').spawnSync('python3', ['${pypath}', '${value_pin}'], {timeout: 5000}).stdout.toString();
let _dhtdata = JSON.parse(_th);`;
// let _dht11data[0] =
@ -39,3 +39,33 @@ Blockly.JavaScript['ugj_dht11_data'] = function (block) {
var code = `_dhtdata.${dropdown_th}`;
return [code, Blockly.JavaScript.ORDER_ATOMIC];
};
flyout_contents = flyout_contents.concat([
{
"kind": "label",
"text": "温湿度センサー DHT11",
"web-line": "4.0",
"web-line-width": "200"
},
{
"kind": "block",
"type": "ugj_dht11",
"inputs": {
"pin": {
"shadow": {
"type": "math_number",
"fields": {
"NUM": "8"
}
}
}
}
},
{
"kind": "block",
"type": "ugj_dht11_data",
"fields": {
"th": "temperature"
}
}
]);

View File

@ -1,29 +0,0 @@
[
{
"kind": "label",
"text": "温湿度センサー DHT11",
"web-line": "4.0",
"web-line-width": "200"
},
{
"kind": "block",
"type": "ugj_dht11",
"inputs": {
"pin": {
"shadow": {
"type": "math_number",
"fields": {
"NUM": "8"
}
}
}
}
},
{
"kind": "block",
"type": "ugj_dht11_data",
"fields": {
"th": "temperature"
}
}
]

View File

@ -35,7 +35,7 @@ Blockly.JavaScript['ugj_gesture_init'] = function (block) {
Blockly.JavaScript.provideFunction_(
'require_gpio', [`const _pi = require('@ocoge.club/` + apptool.gpio_backend + `');`]
);
let modpath = apptool.path.join(apptool.blocks_sensors_dir, 'paj7620', 'PAJ7620x.js');
let modpath = apptool.path.join(ugj_const.blocks_dir, 'sensors', 'paj7620', 'PAJ7620x.js');
Blockly.JavaScript.provideFunction_(
'require_paj7620', [`const _paj7620 = require('${modpath}');`]
);
@ -87,3 +87,41 @@ Blockly.JavaScript['ugj_gesture_stop'] = function (block) {
var code = 'await _paj7620.stop();\n';
return code;
};
flyout_contents = flyout_contents.concat([
{
"kind": "label",
"text": "ジェスチャーセンサー PAJ7620",
"web-line": "4.0",
"web-line-width": "200"
},
{
"kind": "block",
"type": "ugj_gesture_init",
"inputs": {
"i2c_addr": {
"shadow": {
"type": "ugj_hextodec",
"inputs": {
"hex": {
"shadow": {
"type": "text",
"fields": {
"TEXT": "73"
}
}
}
}
}
}
}
},
{
"kind": "block",
"type": "ugj_gesture_read"
},
{
"kind": "block",
"type": "ugj_gesture_stop"
}
]);

View File

@ -1,37 +0,0 @@
[
{
"kind": "label",
"text": "ジェスチャーセンサー PAJ7620",
"web-line": "4.0",
"web-line-width": "200"
},
{
"kind": "block",
"type": "ugj_gesture_init",
"inputs": {
"i2c_addr": {
"shadow": {
"type": "ugj_hextodec",
"inputs": {
"hex": {
"shadow": {
"type": "text",
"fields": {
"TEXT": "73"
}
}
}
}
}
}
}
},
{
"kind": "block",
"type": "ugj_gesture_read"
},
{
"kind": "block",
"type": "ugj_gesture_stop"
}
]

View File

@ -0,0 +1,10 @@
(() => {
let category = workspace.getToolbox().getToolboxItemById('category_sensors');
category.updateFlyoutContents(flyout_contents.concat([{
"kind": "label",
"text": " ",
"web-line": "4.0",
"web-line-width": "200"
}]));
flyout_contents = [];
})();

View File

@ -12,7 +12,12 @@
</link>
<link rel="stylesheet" href="./index.css">
</link>
<link rel="shortcut icon" type="image/png" href="https://ocoge.club/assets/img/favicon.png">
<meta property="og:url" content="https://ocoge.club/demo/" />
<meta property="og:title" content="『オコゲ』Web 体験版" />
<meta property="og:description" content="ブロックプログラミングを体験してみましょう" />
<meta property="og:site_name" content="『オコゲ』Web 体験版" />
<meta property="og:image" content="https://ocoge.club/assets/img/mimmy_360.webp" />
</head>
<body>
@ -1046,11 +1051,13 @@
<script src="./blocks/blocks.js"></script>
<script src="./apptool.js"></script>
<script src="./index.js"></script>
<script src="./blocks/index.js"></script>
<script src="./node_modules/js-beautify/js/lib/beautify.js"></script>
<script src="./node_modules/prismjs/prism.js"></script>
<script src="./node_modules/prismjs/plugins/line-numbers/prism-line-numbers.min.js"></script>
<script src="./node_modules/prismjs/plugins/toolbar/prism-toolbar.min.js"></script>
<script src="./node_modules/prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js"></script>
<script src="./node_modules/prismjs/components/prism-python.js"></script>
<script src="./node_modules/prismjs/plugins/line-numbers/prism-line-numbers.js"></script>
<script src="./node_modules/prismjs/plugins/toolbar/prism-toolbar.js"></script>
<script src="./node_modules/prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard.js"></script>
</body>
</html>

View File

@ -1,6 +1,6 @@
'use strict';
const { checkPrimeSync } = require('crypto');
// const { checkPrimeSync } = require('crypto');
let apptool = appTool_new();

184
package-lock.json generated
View File

@ -1,26 +1,26 @@
{
"name": "ocoge",
"version": "0.1.9",
"version": "0.1.10",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "ocoge",
"version": "0.1.9",
"version": "0.1.10",
"license": "ISC",
"dependencies": {
"@blockly/field-slider": "^4.0.3",
"@blockly/field-slider": "^4.0.4",
"@ocoge.club/pigpio": "file:local_modules/pigpio",
"@tensorflow-models/blazeface": "^0.0.7",
"@tensorflow-models/knn-classifier": "^1.2.4",
"@tensorflow-models/mobilenet": "^2.1.0",
"@tensorflow-models/speech-commands": "^0.5.4",
"@tensorflow/tfjs-node": "^4.1.0",
"@tensorflow/tfjs-node": "^4.2.0",
"axios": "^1.2.2",
"blockly": "^9.2.0",
"dracula-prism": "^2.1.13",
"js-beautify": "^1.14.7",
"node-abi": "^3.30.0",
"node-abi": "^3.31.0",
"nodemailer": "^6.8.0",
"prismjs": "^1.29.0"
},
@ -46,9 +46,9 @@
"integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg=="
},
"node_modules/@blockly/field-slider": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/@blockly/field-slider/-/field-slider-4.0.3.tgz",
"integrity": "sha512-jbTEp4pHf+WG8eac3czUW+CvE+IKa8poZ97Jd3l+QPfeKuljWt9YYQ6x+7iOBx135kpHAZXUmPbQtRCjZA5oCw==",
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/@blockly/field-slider/-/field-slider-4.0.4.tgz",
"integrity": "sha512-T3lMHzG1uaTLkv9WfDLO6Mo4uYLCQVP3mJzS/yICPvEAWzYXps+Ig5MJBLe3Mfh4qBkQyFO3jG2EgYK+jytJ9w==",
"engines": {
"node": ">=8.0.0"
},
@ -728,16 +728,16 @@
}
},
"node_modules/@tensorflow/tfjs": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/@tensorflow/tfjs/-/tfjs-4.1.0.tgz",
"integrity": "sha512-jlrJ6MIBos8NkmF+NHIWBnKVBGYJTG06QmW/A0vgyXwkp+3PgzX8TJ4MWIv/7oZr7g27zfY6dXA1OFzrrgvklA==",
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/@tensorflow/tfjs/-/tfjs-4.2.0.tgz",
"integrity": "sha512-iZmtyGC9IJkx+TpFnkgDol8BHv2BU3zJ01HyNcuvnm1w1EqoNe+1n8bwvLzI/sxHMcHTqzuu7VugMaphryxE+A==",
"dependencies": {
"@tensorflow/tfjs-backend-cpu": "4.1.0",
"@tensorflow/tfjs-backend-webgl": "4.1.0",
"@tensorflow/tfjs-converter": "4.1.0",
"@tensorflow/tfjs-core": "4.1.0",
"@tensorflow/tfjs-data": "4.1.0",
"@tensorflow/tfjs-layers": "4.1.0",
"@tensorflow/tfjs-backend-cpu": "4.2.0",
"@tensorflow/tfjs-backend-webgl": "4.2.0",
"@tensorflow/tfjs-converter": "4.2.0",
"@tensorflow/tfjs-core": "4.2.0",
"@tensorflow/tfjs-data": "4.2.0",
"@tensorflow/tfjs-layers": "4.2.0",
"argparse": "^1.0.10",
"chalk": "^4.1.0",
"core-js": "3",
@ -749,9 +749,9 @@
}
},
"node_modules/@tensorflow/tfjs-backend-cpu": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/@tensorflow/tfjs-backend-cpu/-/tfjs-backend-cpu-4.1.0.tgz",
"integrity": "sha512-NqxrwpYa/hXGaBa1RzxfHsLAsaniIZryhF5CxQM9uSp1ny8wUJMH+Mda/Y8+llS3weHug8JDAbAW2cabn8l84A==",
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/@tensorflow/tfjs-backend-cpu/-/tfjs-backend-cpu-4.2.0.tgz",
"integrity": "sha512-8HWg9J69m0Ovc6w8TVhhixMOcwA3t/NPXLblOA/sgJ+/JD5gsbpLWJk4QISQyb1RnpSVzw6PX3BSMTJU7hWVOg==",
"dependencies": {
"@types/seedrandom": "^2.4.28",
"seedrandom": "^3.0.5"
@ -760,15 +760,15 @@
"yarn": ">= 1.3.2"
},
"peerDependencies": {
"@tensorflow/tfjs-core": "4.1.0"
"@tensorflow/tfjs-core": "4.2.0"
}
},
"node_modules/@tensorflow/tfjs-backend-webgl": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/@tensorflow/tfjs-backend-webgl/-/tfjs-backend-webgl-4.1.0.tgz",
"integrity": "sha512-RDjwbFCPESjh+QTrTvKC623MO58gIqxQvtX3DfJLhlsSbnsvIpA5s1CXNJYzNVmFDia35mPYKmQQWvEvhl9weA==",
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/@tensorflow/tfjs-backend-webgl/-/tfjs-backend-webgl-4.2.0.tgz",
"integrity": "sha512-Qvf+hD5pSh+xi48kChSGzcDKJemkc4EKfoVVjuxl4k25ZUPwuEd7zZUAtinkLu1dzgHNyvePZY8k+9rVm59HJA==",
"dependencies": {
"@tensorflow/tfjs-backend-cpu": "4.1.0",
"@tensorflow/tfjs-backend-cpu": "4.2.0",
"@types/offscreencanvas": "~2019.3.0",
"@types/seedrandom": "^2.4.28",
"@types/webgl-ext": "0.0.30",
@ -778,21 +778,21 @@
"yarn": ">= 1.3.2"
},
"peerDependencies": {
"@tensorflow/tfjs-core": "4.1.0"
"@tensorflow/tfjs-core": "4.2.0"
}
},
"node_modules/@tensorflow/tfjs-converter": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/@tensorflow/tfjs-converter/-/tfjs-converter-4.1.0.tgz",
"integrity": "sha512-pR4TSUI949a/5uUWjHga8xzxD7Y9AbobHJtCmg86Bldfl2GV8aibz87cNjpoO+iUhH8WZo1TOJy8GpM+MPT2DA==",
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/@tensorflow/tfjs-converter/-/tfjs-converter-4.2.0.tgz",
"integrity": "sha512-m+E2KJM6yGQdi8ElzWpChdD/JaqhWMCi9yK70v/ndkOaCL2q2UN48nYP2T5S15vkDvMIgzAQyZfh7hxQsMuvRQ==",
"peerDependencies": {
"@tensorflow/tfjs-core": "4.1.0"
"@tensorflow/tfjs-core": "4.2.0"
}
},
"node_modules/@tensorflow/tfjs-core": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/@tensorflow/tfjs-core/-/tfjs-core-4.1.0.tgz",
"integrity": "sha512-zERD4xtxNq3dV3+wPEMi2HWSV68FA8WucSAogzErp38/q98Byv9G1x8DhxQ+jowTcqN4srGWcBfK59jYwjlAvA==",
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/@tensorflow/tfjs-core/-/tfjs-core-4.2.0.tgz",
"integrity": "sha512-uuHkiWVC8b00ngFbHvAV7J7haRlN/9PEdeenCi0CzBjgKd7aN25wPWaoN0TSQcU+GT4FJ8mofMZ9VBYZ/s/WLg==",
"dependencies": {
"@types/long": "^4.0.1",
"@types/offscreencanvas": "~2019.7.0",
@ -813,35 +813,35 @@
"integrity": "sha512-PGcyveRIpL1XIqK8eBsmRBt76eFgtzuPiSTyKHZxnGemp2yzGzWpjYKAfK3wIMiU7eH+851yEpiuP8JZerTmWg=="
},
"node_modules/@tensorflow/tfjs-data": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/@tensorflow/tfjs-data/-/tfjs-data-4.1.0.tgz",
"integrity": "sha512-H6ef6NXPwi2xKYB6tVNZi5RqniMFpfUSlxG3q0BNxnyuyeCUSjJvHJFpah9hT/ysYjVdwspzh/I6B67h+lBchg==",
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/@tensorflow/tfjs-data/-/tfjs-data-4.2.0.tgz",
"integrity": "sha512-11t7Q+ikseduJgkd9iSeRrtor1aA3o5PVCFhC5yYvR3JLO55ic1+4Ryo0EJfhRoismS6zBUJrpzX4K0zlLbIfw==",
"dependencies": {
"@types/node-fetch": "^2.1.2",
"node-fetch": "~2.6.1",
"string_decoder": "^1.3.0"
},
"peerDependencies": {
"@tensorflow/tfjs-core": "4.1.0",
"@tensorflow/tfjs-core": "4.2.0",
"seedrandom": "^3.0.5"
}
},
"node_modules/@tensorflow/tfjs-layers": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/@tensorflow/tfjs-layers/-/tfjs-layers-4.1.0.tgz",
"integrity": "sha512-lzHNTZu1GwKl7hW5tt2COSpflE0m7xrsOf8AzRzpTDVJYYRx/x5ScMt/y//5jbRuaDOnb3EjT1FxWxwkD44/sg==",
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/@tensorflow/tfjs-layers/-/tfjs-layers-4.2.0.tgz",
"integrity": "sha512-SO0KTmCFOjrW+PlP9nKYXz07XGFq6uE7am9yH2bRaRPWpEeaKT/+k0C9vFMxI/GzRwY8AK4sLe4U+jE1mhYxGw==",
"peerDependencies": {
"@tensorflow/tfjs-core": "4.1.0"
"@tensorflow/tfjs-core": "4.2.0"
}
},
"node_modules/@tensorflow/tfjs-node": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/@tensorflow/tfjs-node/-/tfjs-node-4.1.0.tgz",
"integrity": "sha512-2H7UJqVafuM9fbsMdzUkcfWLpH/owgvVHWES+gQsiueIqyOjpq6ZGSQLDxyuKtHP2D/8/kWeVIbnzAjnIRniuA==",
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/@tensorflow/tfjs-node/-/tfjs-node-4.2.0.tgz",
"integrity": "sha512-dkyExfqTjMVDpKLBzHH2b7JWzGK+QORtYswvoNHbeHwx7kvYYRAQeiHxp+xrgry6LdbWfZs88IWCwNGoOiZ21w==",
"hasInstallScript": true,
"dependencies": {
"@mapbox/node-pre-gyp": "1.0.9",
"@tensorflow/tfjs": "4.1.0",
"@tensorflow/tfjs": "4.2.0",
"adm-zip": "^0.5.2",
"google-protobuf": "^3.9.2",
"https-proxy-agent": "^2.2.1",
@ -1798,9 +1798,9 @@
"integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ=="
},
"node_modules/core-js": {
"version": "3.26.1",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.26.1.tgz",
"integrity": "sha512-21491RRQVzUn0GGM9Z1Jrpr6PNPxPi+Za8OM9q4tksTSnlbXXGKK1nXNg/QvwFYettXvSX6zWKCtHHfjN4puyA==",
"version": "3.27.1",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.27.1.tgz",
"integrity": "sha512-GutwJLBChfGCpwwhbYoqfv03LAfmiz7e7D/BNxzeMxwQf10GRSzqiOjx7AmtEk+heiD/JWmBuyBPgFtx0Sg1ww==",
"hasInstallScript": true,
"funding": {
"type": "opencollective",
@ -4306,9 +4306,9 @@
"dev": true
},
"node_modules/node-abi": {
"version": "3.30.0",
"resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.30.0.tgz",
"integrity": "sha512-qWO5l3SCqbwQavymOmtTVuCWZE23++S+rxyoHjXqUmPyzRcaoI4lA2gO55/drddGnedAyjA7sk76SfQ5lfUMnw==",
"version": "3.31.0",
"resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.31.0.tgz",
"integrity": "sha512-eSKV6s+APenqVh8ubJyiu/YhZgxQpGP66ntzUb3lY1xB9ukSRaGnx0AIxI+IM+1+IVYC1oWobgG5L3Lt9ARykQ==",
"dependencies": {
"semver": "^7.3.5"
},
@ -6315,9 +6315,9 @@
},
"dependencies": {
"@blockly/field-slider": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/@blockly/field-slider/-/field-slider-4.0.3.tgz",
"integrity": "sha512-jbTEp4pHf+WG8eac3czUW+CvE+IKa8poZ97Jd3l+QPfeKuljWt9YYQ6x+7iOBx135kpHAZXUmPbQtRCjZA5oCw=="
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/@blockly/field-slider/-/field-slider-4.0.4.tgz",
"integrity": "sha512-T3lMHzG1uaTLkv9WfDLO6Mo4uYLCQVP3mJzS/yICPvEAWzYXps+Ig5MJBLe3Mfh4qBkQyFO3jG2EgYK+jytJ9w=="
},
"@electron-forge/cli": {
"version": "6.0.4",
@ -6814,16 +6814,16 @@
"integrity": "sha512-r0c/MvC15/09xWujx1pKe6mA0nta+4jQWDXGkqfSVkXLo8ARrwcZ4mTGLlfvT43ySfidiveUo0m+P51+UK821Q=="
},
"@tensorflow/tfjs": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/@tensorflow/tfjs/-/tfjs-4.1.0.tgz",
"integrity": "sha512-jlrJ6MIBos8NkmF+NHIWBnKVBGYJTG06QmW/A0vgyXwkp+3PgzX8TJ4MWIv/7oZr7g27zfY6dXA1OFzrrgvklA==",
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/@tensorflow/tfjs/-/tfjs-4.2.0.tgz",
"integrity": "sha512-iZmtyGC9IJkx+TpFnkgDol8BHv2BU3zJ01HyNcuvnm1w1EqoNe+1n8bwvLzI/sxHMcHTqzuu7VugMaphryxE+A==",
"requires": {
"@tensorflow/tfjs-backend-cpu": "4.1.0",
"@tensorflow/tfjs-backend-webgl": "4.1.0",
"@tensorflow/tfjs-converter": "4.1.0",
"@tensorflow/tfjs-core": "4.1.0",
"@tensorflow/tfjs-data": "4.1.0",
"@tensorflow/tfjs-layers": "4.1.0",
"@tensorflow/tfjs-backend-cpu": "4.2.0",
"@tensorflow/tfjs-backend-webgl": "4.2.0",
"@tensorflow/tfjs-converter": "4.2.0",
"@tensorflow/tfjs-core": "4.2.0",
"@tensorflow/tfjs-data": "4.2.0",
"@tensorflow/tfjs-layers": "4.2.0",
"argparse": "^1.0.10",
"chalk": "^4.1.0",
"core-js": "3",
@ -6863,20 +6863,20 @@
}
},
"@tensorflow/tfjs-backend-cpu": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/@tensorflow/tfjs-backend-cpu/-/tfjs-backend-cpu-4.1.0.tgz",
"integrity": "sha512-NqxrwpYa/hXGaBa1RzxfHsLAsaniIZryhF5CxQM9uSp1ny8wUJMH+Mda/Y8+llS3weHug8JDAbAW2cabn8l84A==",
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/@tensorflow/tfjs-backend-cpu/-/tfjs-backend-cpu-4.2.0.tgz",
"integrity": "sha512-8HWg9J69m0Ovc6w8TVhhixMOcwA3t/NPXLblOA/sgJ+/JD5gsbpLWJk4QISQyb1RnpSVzw6PX3BSMTJU7hWVOg==",
"requires": {
"@types/seedrandom": "^2.4.28",
"seedrandom": "^3.0.5"
}
},
"@tensorflow/tfjs-backend-webgl": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/@tensorflow/tfjs-backend-webgl/-/tfjs-backend-webgl-4.1.0.tgz",
"integrity": "sha512-RDjwbFCPESjh+QTrTvKC623MO58gIqxQvtX3DfJLhlsSbnsvIpA5s1CXNJYzNVmFDia35mPYKmQQWvEvhl9weA==",
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/@tensorflow/tfjs-backend-webgl/-/tfjs-backend-webgl-4.2.0.tgz",
"integrity": "sha512-Qvf+hD5pSh+xi48kChSGzcDKJemkc4EKfoVVjuxl4k25ZUPwuEd7zZUAtinkLu1dzgHNyvePZY8k+9rVm59HJA==",
"requires": {
"@tensorflow/tfjs-backend-cpu": "4.1.0",
"@tensorflow/tfjs-backend-cpu": "4.2.0",
"@types/offscreencanvas": "~2019.3.0",
"@types/seedrandom": "^2.4.28",
"@types/webgl-ext": "0.0.30",
@ -6884,14 +6884,14 @@
}
},
"@tensorflow/tfjs-converter": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/@tensorflow/tfjs-converter/-/tfjs-converter-4.1.0.tgz",
"integrity": "sha512-pR4TSUI949a/5uUWjHga8xzxD7Y9AbobHJtCmg86Bldfl2GV8aibz87cNjpoO+iUhH8WZo1TOJy8GpM+MPT2DA=="
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/@tensorflow/tfjs-converter/-/tfjs-converter-4.2.0.tgz",
"integrity": "sha512-m+E2KJM6yGQdi8ElzWpChdD/JaqhWMCi9yK70v/ndkOaCL2q2UN48nYP2T5S15vkDvMIgzAQyZfh7hxQsMuvRQ=="
},
"@tensorflow/tfjs-core": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/@tensorflow/tfjs-core/-/tfjs-core-4.1.0.tgz",
"integrity": "sha512-zERD4xtxNq3dV3+wPEMi2HWSV68FA8WucSAogzErp38/q98Byv9G1x8DhxQ+jowTcqN4srGWcBfK59jYwjlAvA==",
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/@tensorflow/tfjs-core/-/tfjs-core-4.2.0.tgz",
"integrity": "sha512-uuHkiWVC8b00ngFbHvAV7J7haRlN/9PEdeenCi0CzBjgKd7aN25wPWaoN0TSQcU+GT4FJ8mofMZ9VBYZ/s/WLg==",
"requires": {
"@types/long": "^4.0.1",
"@types/offscreencanvas": "~2019.7.0",
@ -6911,9 +6911,9 @@
}
},
"@tensorflow/tfjs-data": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/@tensorflow/tfjs-data/-/tfjs-data-4.1.0.tgz",
"integrity": "sha512-H6ef6NXPwi2xKYB6tVNZi5RqniMFpfUSlxG3q0BNxnyuyeCUSjJvHJFpah9hT/ysYjVdwspzh/I6B67h+lBchg==",
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/@tensorflow/tfjs-data/-/tfjs-data-4.2.0.tgz",
"integrity": "sha512-11t7Q+ikseduJgkd9iSeRrtor1aA3o5PVCFhC5yYvR3JLO55ic1+4Ryo0EJfhRoismS6zBUJrpzX4K0zlLbIfw==",
"requires": {
"@types/node-fetch": "^2.1.2",
"node-fetch": "~2.6.1",
@ -6921,17 +6921,17 @@
}
},
"@tensorflow/tfjs-layers": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/@tensorflow/tfjs-layers/-/tfjs-layers-4.1.0.tgz",
"integrity": "sha512-lzHNTZu1GwKl7hW5tt2COSpflE0m7xrsOf8AzRzpTDVJYYRx/x5ScMt/y//5jbRuaDOnb3EjT1FxWxwkD44/sg=="
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/@tensorflow/tfjs-layers/-/tfjs-layers-4.2.0.tgz",
"integrity": "sha512-SO0KTmCFOjrW+PlP9nKYXz07XGFq6uE7am9yH2bRaRPWpEeaKT/+k0C9vFMxI/GzRwY8AK4sLe4U+jE1mhYxGw=="
},
"@tensorflow/tfjs-node": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/@tensorflow/tfjs-node/-/tfjs-node-4.1.0.tgz",
"integrity": "sha512-2H7UJqVafuM9fbsMdzUkcfWLpH/owgvVHWES+gQsiueIqyOjpq6ZGSQLDxyuKtHP2D/8/kWeVIbnzAjnIRniuA==",
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/@tensorflow/tfjs-node/-/tfjs-node-4.2.0.tgz",
"integrity": "sha512-dkyExfqTjMVDpKLBzHH2b7JWzGK+QORtYswvoNHbeHwx7kvYYRAQeiHxp+xrgry6LdbWfZs88IWCwNGoOiZ21w==",
"requires": {
"@mapbox/node-pre-gyp": "1.0.9",
"@tensorflow/tfjs": "4.1.0",
"@tensorflow/tfjs": "4.2.0",
"adm-zip": "^0.5.2",
"google-protobuf": "^3.9.2",
"https-proxy-agent": "^2.2.1",
@ -7661,9 +7661,9 @@
"integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ=="
},
"core-js": {
"version": "3.26.1",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.26.1.tgz",
"integrity": "sha512-21491RRQVzUn0GGM9Z1Jrpr6PNPxPi+Za8OM9q4tksTSnlbXXGKK1nXNg/QvwFYettXvSX6zWKCtHHfjN4puyA=="
"version": "3.27.1",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.27.1.tgz",
"integrity": "sha512-GutwJLBChfGCpwwhbYoqfv03LAfmiz7e7D/BNxzeMxwQf10GRSzqiOjx7AmtEk+heiD/JWmBuyBPgFtx0Sg1ww=="
},
"cross-spawn": {
"version": "7.0.3",
@ -9544,9 +9544,9 @@
"dev": true
},
"node-abi": {
"version": "3.30.0",
"resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.30.0.tgz",
"integrity": "sha512-qWO5l3SCqbwQavymOmtTVuCWZE23++S+rxyoHjXqUmPyzRcaoI4lA2gO55/drddGnedAyjA7sk76SfQ5lfUMnw==",
"version": "3.31.0",
"resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.31.0.tgz",
"integrity": "sha512-eSKV6s+APenqVh8ubJyiu/YhZgxQpGP66ntzUb3lY1xB9ukSRaGnx0AIxI+IM+1+IVYC1oWobgG5L3Lt9ARykQ==",
"requires": {
"semver": "^7.3.5"
}

View File

@ -28,18 +28,18 @@
"electron": "^22.0.0"
},
"dependencies": {
"@blockly/field-slider": "^4.0.3",
"@blockly/field-slider": "^4.0.4",
"@ocoge.club/pigpio": "file:local_modules/pigpio",
"@tensorflow-models/blazeface": "^0.0.7",
"@tensorflow-models/knn-classifier": "^1.2.4",
"@tensorflow-models/mobilenet": "^2.1.0",
"@tensorflow-models/speech-commands": "^0.5.4",
"@tensorflow/tfjs-node": "^4.1.0",
"@tensorflow/tfjs-node": "^4.2.0",
"axios": "^1.2.2",
"blockly": "^9.2.0",
"dracula-prism": "^2.1.13",
"js-beautify": "^1.14.7",
"node-abi": "^3.30.0",
"node-abi": "^3.31.0",
"nodemailer": "^6.8.0",
"prismjs": "^1.29.0"
},