🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Electron

Electronは、HTML5とNode.jsというWebの技術を用いてデスクトップアプリケーションを作成できるクロスプラットフォームな実行環境です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

475閲覧

JINS MEMEでマウスカーソルの操作を行いたい

erua

総合スコア5

Electron

Electronは、HTML5とNode.jsというWebの技術を用いてデスクトップアプリケーションを作成できるクロスプラットフォームな実行環境です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2019/10/30 09:59

前提・実現したいこと

JinsMemeSDK(https://github.com/jins-meme/JinsMemeSDK-Samples-NodeJS/tree/master/jinsmeme-mouse)のコードの1部を変更し、視線移動を検知した時にマウスカーソルを移動させ、瞬きをしたときに移動停止させたいと考えています。

発生している問題・エラーメッセージ

初めはWhile文を使ってマウスカーソルの制御を行おうと考えていたのですが、ループ中瞬きなどの処理を検知しなくなったため、現在タイマーイベントを使って制御を行おうと考えています。
視線移動を検知した時にマウスカーソルが動き続け、ループ中も瞬きを検出できるようにはなったのですが、瞬きを検知しても停止せずに動き続けてしまう状態です。

該当のソースコード

現在試作として右を見たときの反応だけコード入力しています。

main.js

1//リアルタイムモードを処理する部分 2const realtimeModeCB_dev1 = data => { 3 4 var mouse = robot.getMousePos(); 5 let right = false; 6 let date_now = Date.now(); 7 8 var cmr = function() { 9 robot.moveMouse(mouse.x += cm, mouse.y); 10 setTimeout(cmr, 250); 11 }; 12 13 if (data.eyeMoveRight > 1) { 14 right = true; 15 console.log("Right"); 16 } 17 18 if (data.blinkStrength > 40) { 19 console.log("stop") 20 right = false; 21 } 22 23 if (right == true) { 24 cmr(); 25 } 2627}

試したこと

clearTimeoutを用いてループを終了させる方法など考えられることは試したのですが移動を停止させることが出来ませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2019/10/30 18:13 編集

今、ご提示のコードは setTimeoutで250ミリ秒ごとにcmrを定周期で呼び出し続けるようなコードですが、clearTimeoutで停止する部分が見当たりません。そのためにマウスが移動し続けているのでは。 clearTimeoutを用いてループを終了するようにしたけどダメだったとのことですが、その時のコードはどういうものだったのでしょうか。
erua

2019/10/31 15:28 編集

返信遅くなって申し訳ないです。 clearTimeoutを用いたコードは以下の2通りになります。 ``` const realtimeModeCB_dev1 = data => { var mouse = robot.getMousePos(); let right = false; let cm = 2; let date_now = Date.now(); var stopcmr; var cmr = function() { if (data.eyeMoveRight > 1) { console.log("right"); robot.moveMouse(mouse.x += cm, mouse.y); stopcmr = setTimeout(cmr, 250); } if (data.blinkStrength > 40) { console.log("stop") clearTimeout(stopcmr); } } cmr(); ~ } ``` ``` const realtimeModeCB_dev1 = data => { var mouse = robot.getMousePos(); let cm = 2; let date_now = Date.now(); var stopcmr; var cmr = function() { robot.moveMouse(mouse.x += cm, mouse.y); stopcmr =setTimeout(cmr, 250); }; var csr = function() { clearTimeout(stopcmr); }; if (data.eyeMoveRight > 1) { cmr(); console.log("Right"); } if (data.blinkStrength > 40) { csr(); console.log("stop"); } ~ } ```
dodox86

2019/11/01 18:14

clearTimeoutを使用しての旧コードのご提示、ありがとうございました。実機で未確認のコードですが、回答に示してみましたのでご覧になってみてください。
guest

回答1

0

ベストアンサー

視線移動を検知した時にマウスカーソルが動き続け、ループ中も瞬きを検出できるようにはなったのですが、瞬きを検知しても停止せずに動き続けてしまう状態です。

現状のコードですと、瞬きの検知後でもsetTimeoutで登録したタイムアウト時の関数が呼ばれてしまい、マウスは依然として右へ移動してしまうと思います。瞬きを検知したらsetTimeoutで始動したタイマーをキャンセルすれば、ご要望の動きになりませんでしょうか。

修正案としてのコードを以下に示してみます。ただ、私自身はJINS MEMEを試せる環境に無いので、動作確認はできていません。
※JINS MEMEに関しては「外観は普通のメガネで、アプリを造れるウェアラブルデバイスとして面白いのではないか。」と発売当初から興味を抱き、情報をあたっていてはみたものの、実機には触れて居ない状況です。そんな訳で推測での回答すみません。

JavaScript

1// リアルタイムモードを処理する部分のスコープ外で宣言 2var tid = null; 3 4//リアルタイムモードを処理する部分 5const realtimeModeCB_dev1 = data => { 6 7 var mouse = robot.getMousePos(); 8 let right = false; 9 let date_now = Date.now(); 10 11 var cmr = function() { 12 robot.moveMouse(mouse.x += cm, mouse.y); 13 tid = setTimeout(cmr, 250); 14 }; 15 16 if (data.eyeMoveRight > 1) { 17 right = true; 18 console.log("Right"); 19 } 20 21 if (data.blinkStrength > 40) { 22 // 瞬きを検知 23 console.log("stop") 24 right = false; 25 } 26 27 if (right == true) { 28 // 引き続き右へ移動中 29 cmr(); 30 } else { 31 if (tid != null) { 32 // 瞬きを検知、かつタイマーセット済みであればキャンセル 33 clearTimeout(tid); 34 tid = null; 35 } 36 } 37 3839 40}

投稿2019/11/01 18:11

dodox86

総合スコア9256

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

erua

2019/11/02 05:29

ご回答いただきありがとうございます。 修正案として頂いたコードを試してみたところ、マウスが1度動いたら止まるという単発処理になっていました。 そこでコードを以下のようにし、コンソールにデータ出力を行ってみました。 ``` if (right == true) { // 引き続き右へ移動中 console.log(right) cmr(); } else if (tid != null) { // 瞬きを検知、かつタイマーセット済みであればキャンセル console.log("clear") clearTimeout(tid); tid = null; } ``` すると Right true clear と出力され、右への視線検知とともにタイマーキャンセルが行われていることが分かりました。 現在解決法を模索し、試しているのですが、自分の知識が浅いためなかなか解決できない状況です。 重ね重ね申し訳ありませんが、こちらについてもご教示いただけると幸いです。
dodox86

2019/11/02 06:00

やはり、私の修正では足りなかったようです。すみません。質問なのですが、「リアルタイムモード」の部分と言うのは、 setTimeoutによる実行に限らず、何度も何度もずっと呼ばれている部分と思ってよいでしょうか。SDKのオリジナルのコードは読みましたが、いまだ、実際の動きがイメージつかめていないところがあります。
dodox86

2019/11/02 06:15

マウス移動と停止の条件をもう少し洗い出します。 (1) 視線を右に向ける-->マウス移動開始 (2) 視線が右に向いたまま-->マウス移動続行 (3) マウス移動中で、瞬きしたことを検出していない-->マウス移動続行。 (4) マウス移動中で、瞬きしたことを検出した-->マウス移動停止。 この時点で視線が右に向いたままだと、またすぐにマウス移動を開始してしまいますが、それはきっと不本意なものですよね。瞬きによるマウス移動停止後、しばらくは視線を無視するなどが必要な気もします。
erua

2019/11/03 08:05

返信遅くなってしまい申し訳ありません。 ご返信ありがとうございます。 リアルタイムモードの部分はJINSMEMEとPC接続後はずっと処理が行われている部分だと思います。 単発処理で試していた時に不本意な移動等があったのでdodox86様が仰るように、他の処理を受け付けない時間を設ける等追加し、試してみたいと思います。
dodox86

2019/11/03 08:55 編集

そうですね。私の方で実機で試せない以上、私が書いてみたお試しのコードを提示しても混乱させてしまうかと思いますので、控えようと思います。方法として助言できることとしては、「状態」を意識し、管理する、ということです。先のコメントと少し重なりますが、 1: 初期状態(何もしていない) 2: 初期状態で、視線を右向けた瞬間から、「マウス移動」状態へ遷移 3: 「マウス移動」状態から、瞬きを検出するまではずっと「マウス移動」状態をキープ 4: 「マウス移動」状態であるときに瞬きを検出したら、「マウス停止」状態へ遷移。 この状態で、次に視線を右に向けたことを検出するタイミングをいつにするか、が課題だと思います。 具体的にどうコードを書くというよりは、考え方の問題になります。 > 返信遅くなってしまい申し訳ありません。 いえいえ、特に急いで返信を求めているわけではないので、ご自分のタイミングでご対応ください。 ただ、最終的にはなんらかの形で質問を閉じていただけますと良いです。
erua

2019/11/03 12:46

何度もご教示いただきありがとうございます。 ご助言いただいたことを意識して問題解決できるように努めます。 改めましてありがとうございました。
erua

2019/11/08 08:00 編集

修正案として頂いたコードを以下のように少し順序を変えてみた所マウスカーソルが止まるようになりました。 ``` var tid = null; //リアルタイムモードを処理する部分 const realtimeModeCB_dev1 = data => { var mouse = robot.getMousePos(); let right = false; let date_now = Date.now(); var cmr = function() { robot.moveMouse(mouse.x += cm, mouse.y); tid = setTimeout(cmr, 250); }; if (data.eyeMoveRight > 1) { right = true; console.log("Right"); } if (right == true) { // 引き続き右へ移動中 console.log(right) cmr(); } if (data.blinkStrength > 40) { // 瞬きを検知 console.log("stop") right = false; if (tid != null) { // 瞬きを検知、かつタイマーセット済みであればキャンセル console.log("clear") clearTimeout(tid); tid = null; } } ~ } ```
dodox86

2019/11/08 07:58

実現できましたか! おめでとうございます。:-)  コードをご提示してのご報告も、ありがとうございます。
erua

2019/11/08 08:09

dodox86様のおかげさまでようやく解決することが出来ました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問