From 7c248d9481acabf4f88dd99ed86ad854bde39ded Mon Sep 17 00:00:00 2001 From: ocogeclub Date: Fri, 19 Nov 2021 22:12:03 +0900 Subject: [PATCH] =?UTF-8?q?[fix]=20=E4=BD=93=E9=A8=93=E7=89=88=E3=83=A2?= =?UTF-8?q?=E3=83=BC=E3=83=89=E3=81=8C=E5=8B=95=E4=BD=9C=E3=81=97=E3=81=AA?= =?UTF-8?q?=E3=81=8F=E3=81=AA=E3=81=A3=E3=81=A6=E3=81=84=E3=81=9F=E3=81=AE?= =?UTF-8?q?=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- index.js | 4 +--- index_elutil.js | 17 +++++++++++++--- main.js | 2 +- ugj_blocks.js | 52 +++++++++++++++++++++---------------------------- 5 files changed, 39 insertions(+), 38 deletions(-) diff --git a/README.md b/README.md index 13e51c5..9e00d2a 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # ocoge "大岩産 Code Generator" は、Google Blockly ライブラリを使用した、Raspberry Pi 上で動作するブロックプログラム開発・実行環境です。 -インストール方法・操作・サンプルなどは、今後『[おこげ倶楽部](https://ocoge.club)』([ミラー](http://ocogeclub.starfree.jp/))にて公開予定です。 +インストール方法・操作・サンプルなどは、今後『[おこげ倶楽部](https://ocoge.club)』にて公開予定です。 ### 免責 このアプリケーションは特定の環境下で使用する目的で、専門知識を持たない日曜プログラマによって無計画に開発されています。アドバイス・ご意見・ご要望は有難く承りますが、対応の保証はいたしかねます。 diff --git a/index.js b/index.js index e9e6d3f..31e3124 100644 --- a/index.js +++ b/index.js @@ -183,8 +183,6 @@ Blockly.Msg["UGJ_DECTOHEX_TOOLTIP"] = "10進数を16進数に変換します。" Blockly.Msg["UGJ_CANVAS_INIT_TITLE"] = "キャンバスを表示"; Blockly.Msg["UGJ_CANVAS_INIT_TOOLTIP"] = "キャンバスを表示し、使用できるようにします。"; -Blockly.Msg["UGJ_FACEAPI_TITLE"] = "TensorFlowによる顔検出: %1 ランドマークを検出 %2 %3"; -Blockly.Msg["UGJ_FACEAPI_TOOLTIP"] = "TensorFlow とFaceAPI をロードし、顔検出をできるようにします。"; Blockly.Msg["UGJ_SLEEP_TITLE"] = "%1 秒待つ"; Blockly.Msg["UGJ_SLEEP_TOOLTIP"] = "指定した秒数だけ処理を中断します。"; @@ -409,7 +407,7 @@ const ugj_runCode = async () => { // await eval(code).catch(e => { alert(e); }); let AsyncFunction = Object.getPrototypeOf(async function () { }).constructor let ocogeFunc = new AsyncFunction(ugj_createCode({})); - await ocogeFunc(); + await ocogeFunc().catch(e => { alert(e); }); console.log('Code Execution done.'); } diff --git a/index_elutil.js b/index_elutil.js index da341dd..4e8234e 100644 --- a/index_elutil.js +++ b/index_elutil.js @@ -4,7 +4,7 @@ // 定数 const ugj_const = { - doc_root: process.env["HOME"] + '/Documents', + // doc_root: process.env["HOME"] + '/Documents', app_name: 'ocoge', mascot_path: './img/', mascot_defname: 'tamachee.png', @@ -32,7 +32,7 @@ class elUtil { this.children = []; this.gpio_backend = ugj_const.pig; this.i2c_bus = ugj_const.i2c_defbus; - this.doc_current = ugj_const.doc_root; + this.doc_current = process.env["HOME"] + '/Documents'; } // 0で数値の桁合わせ : NUM=値 LEN=桁数 zeroPadding(NUM, LEN) { @@ -255,6 +255,11 @@ class elUtil { } // ブラウザ動作用 class brUtil { + constructor() { + // GPIOブロックは使えません + this.gpio_backend = ugj_const.pig; + } + // マスコット getMascotFilePath() { return `./img/${ugj_const.mascot_defname}`; } //ワークスペースのダウンロード @@ -326,18 +331,24 @@ if (!is_el) { case 'nodemailer': block = 'メール送信'; break; - case '@ocogeclub/gpio': + case '@ocogeclub/pigpio': block = 'GPIO'; break; case '@ocogeclub/bme280': block = 'BME280'; break; + case '@ocogeclub/amg8833': + block = '赤外線アレイセンサ'; + break; case 'fs': block = 'ファイル'; break; case 'path': block = 'キャンバス保存'; break; + case 'child_process': + block = '外部プログラム実行'; + break; default: throw new Error(ugj_const.error_ja_all); } diff --git a/main.js b/main.js index 497f461..ee03d65 100644 --- a/main.js +++ b/main.js @@ -29,7 +29,7 @@ function createWindow() { win.loadFile('index.html') // Open the DevTools. - win.webContents.openDevTools() + // win.webContents.openDevTools() // Emitted when the window is closed. // win.on('closed', () => { diff --git a/ugj_blocks.js b/ugj_blocks.js index c51f084..91be51d 100644 --- a/ugj_blocks.js +++ b/ugj_blocks.js @@ -1364,39 +1364,29 @@ Blockly.Python['ugj_grideye_stop'] = function (block) { /** Face Detection ** */ /******************** */ var with_landmark; -var ugjFaceapiDefinition = { - "type": "ugj_faceapi", - "message0": "%{BKY_UGJ_FACEAPI_TITLE}", - "args0": [ - { - "type": "field_checkbox", - "name": "with_landmark", - "checked": false - }, - { - "type": "input_dummy" - }, - { - "type": "input_statement", - "name": "do" - } - ], - "inputsInline": true, - "tooltip": "%{BKY_UGJ_FACEAPI_TOOLTIP}", - "helpUrl": "", - "style": "multimedia_blocks" -}; Blockly.Blocks['ugj_faceapi'] = { init: function () { - this.jsonInit(ugjFaceapiDefinition); + this.appendDummyInput() + .appendField("TensorFlowによる顔検出を1秒に") + .appendField(new Blockly.FieldDropdown([["1", "1000"], ["2", "500"], ["5", "200"], ["10", "100"]]), "interval_sec") + .appendField("回実行:") + .appendField(new Blockly.FieldCheckbox("TRUE"), "with_landmark") + .appendField("ランドマークを検出"); + this.appendStatementInput("do") + .setCheck(null); + this.setTooltip("TensorFlow とFaceAPI をロードし、顔検出をできるようにします。"); + this.setHelpUrl(""); + this.setStyle('multimedia_blocks'); } }; Blockly.JavaScript['ugj_faceapi'] = function (block) { + var dropdown_interval_sec = block.getFieldValue('interval_sec'); with_landmark = block.getFieldValue('with_landmark') == 'TRUE'; var statements_do = Blockly.JavaScript.statementToCode(block, 'do'); var code = [ `require('@tensorflow/tfjs-node');`, `const faceapi = require('@vladmandic/face-api/dist/face-api.node.js');`, + `const detect_intvl = ${dropdown_interval_sec};`, statements_do, '' ].join('\n'); @@ -1409,7 +1399,7 @@ Blockly.Blocks['ugj_face_init'] = { this.setInputsInline(true); this.setPreviousStatement(true, null); this.setNextStatement(true, null); - this.setStyle('multimedia_blocks') + this.setStyle('multimedia_blocks'); this.setTooltip("顔検出のためのビデオストリームを開始します。"); this.setHelpUrl(""); } @@ -1496,17 +1486,18 @@ Blockly.JavaScript['ugj_face_detect'] = function (block) { var code = [ code_model, "const options = new faceapi.TinyFaceDetectorOptions({ inputSize: 128, scoreThreshold : 0.3 });", - `const onPlay = async () => {`, - // ` const detectInterval = setInterval(async () => {`, + // `const onPlay = async () => {`, + // `console.log('onplay');`, + ` const detectInterval = setInterval(async () => {`, code_detect_face, " if (result) {", code_rect, statements_do, " }", - // ` }, 500);`, - " setTimeout(() => onPlay())", - "}", - "videoEl.onplay = onPlay;", + ` }, detect_intvl);`, + // " setTimeout(() => onPlay())", + // "}", + // "videoEl.onplay = onPlay;", "" ].join('\n'); return code; @@ -1850,6 +1841,7 @@ _grideye_canvas.setAttribute('height', 8); _grideye_canvas.className = 'subdisplay'; _grideye_canvas.style.width = '160px'; _grideye_canvas.style.height = '160px'; +_grideye_canvas.id = 'subcanvas'; document.getElementById('display_area').appendChild(_grideye_canvas); _grideye_ctx = _grideye_canvas.getContext('2d'); _grideye_imgData = _grideye_ctx.createImageData(8, 8);