HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2017
0618
富士島0.1秒ごとにキーボードの指定したキーが押されているか判定するアルゴリズムを教えてください!8解決


富士島

リンク

2017/6/18(Sun) 00:20:31|NO.80273

HSP初心者です.聴覚検査的なアルゴリズムが作成したいです.

アルゴリズムの使用用途
“鏝骸圓3人(以上)
被験者それぞれに1つキーを指定して,その指定したキーを好きな時にそれぞれに押してもらう

アルゴリズムの流れ
0.1秒毎に指定したキーの状態を判定する.押してあったら「1」押してなかったら「0」
⊆存海終わった時点(だいたい1時間)でそのデータを1つのテキストファイルに保存する(リアルタイムに画面に表示しなくても大丈夫です)
このような流れを想定しています

保存するデータのイメージが下図のような感じです
例)
 秒 被験者A 被験者B 被験者C
 0 0 0     0
0.1  0     0     1
0.2  1     1     0
0.3  1     0     0
0.4  1     1     1
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
3600  0 0 0

試行錯誤してみたのですが全く手も足も出ないのでよろしくお願いします.



この記事に返信する


窓月らら

リンク

2017/6/18(Sun) 00:56:35|NO.80274

即席ですが、こんな感じで。

// ログ保存用(1分で600バイト分必要) sdim log_a, 50000 sdim log_b, 50000 sdim log_c, 50000 i=0 // カウンタ初期化 t=36000 // 1時間 repeat t // キーの状態を取得 getkey a,65 // A getkey b,66 // B getkey c,67 // C // 結果を1バイトデータとして順次書き込んでいく(0か1) poke log_a,i,a poke log_b,i,b poke log_c,i,c redraw 0 color 0,0,0: boxf color 255,255,255: pos 8,8: mes "A:"+a+" B:"+b+" C:"+c redraw 1 await 100 // 0.1秒 i++ // カウンタ loop // 時間分ループするとここから下が実行されるので // ログを保存する処理を書く



窓月らら

リンク

2017/6/18(Sun) 01:01:23|NO.80275

経過時間を見たい場合。

color 255,255,255: pos 8,8: mes "A:"+a+" B:"+b+" C:"+c+" 経過時間:"+i/10+"秒"



kino

リンク

2017/6/18(Sun) 11:54:28|NO.80278

>“鏝骸圓3人(以上)
最近のパソコンはよく知らないですが
Nキーロールオーバー対策が必要かもですね



富士島

リンク

2017/6/18(Sun) 14:03:17|NO.80287

夜中にも関わらず全体像を作っていただきありがとうございます!
ログの保存方法は、notesaveを使うのでしょうか?
実験が終わった後に名前をつけて保存がしたいのですが保存して見ても真っ白で書き込めてないです…

被検者は3人以上と書いてましたが3人であれば問題はないので大丈夫だと思います



窓月らら

リンク

2017/6/18(Sun) 19:46:20|NO.80292

気が向いたので完成型を作ってしまいました。
最初のやつはバイナリで保存していましたが、テキストでログファイルを
作成しながら処理するように変更しています。

csvで出力しますので、Excelなどでも処理しやすいと思います。

初心者とのことですので、これで解決とせず1つ1つリファレンスを見て
何をしているのか覚えてみてください。

#packopt name "keylog" #packopt hide 1 title "キーの状態を記録" screen 0,480,480,0,ginfo_dispx/2-240,ginfo_dispy/2-260 t=3600 // 初期値(1時間=3600) color 0,0,0: boxf // 黒で全体をクリア color 0,255,255 // 文字色 pos 32,32: mes "実行する秒数を入力してスタートボタンを押してください。" pos 192,80: input t,100,20,5 objsize 160,40 pos 160,128: button goto "スタート",*main stop *main clrobj // オブジェクトをクリア t=t*10 // 秒→0.1秒単位にする i=0 // カウンタ初期化 log="時間(0.1秒),A,B,C\n" // 文字列型にしておく(ログ用) notesel log // メモリノートパッドの対象にしておく // ループ処理 repeat t i++ // カウンタ // キーの状態を取得 getkey a,65 // A getkey b,66 // B getkey c,67 // C // 結果をテキストで追記していく log+=strf("%06d",i)+","+str(a)+","+str(b)+","+str(c)+"\n" redraw 0 // 仮想画面に描画開始 color 0,0,0: boxf // 黒で全体をクリア color 255,255,255: pos 112,16 // 文字の色と描画開始位置 mes "A:"+a+" B:"+b+" C:"+c+"\n経過時間: "+i/10+" 秒 ("+i+" / "+t+")" // ログプレビュー color 0,255,255: mes "----------------------------------" if i>22 { j=22 } else { j=i } repeat j noteget stmp1,cnt+i-j+1 // 1行読み出し split stmp1,",",stmp2 // 表示用に分割する mes stmp2(0)+"\tA:"+stmp2(1)+" B:"+stmp2(2)+" C:"+stmp2(3) // 表示 loop redraw 1 // 画面に反映 await 100 // 0.1秒待つ loop // 時間分ループするとここから下が実行される // ダイアログを出してログを保存するか問う dialog "処理が完了しました。\nログをファイルに保存しますか?",2,"完了" if stat=7 { goto *exit } // [いいえ]なら終了 *save // 保存ダイアログ dialog "csv",17,"csvファイル" // キャンセルなら何もせず終了 if stat=0 { goto *exit } // 保存ファイルのフルパス stmp1=refstr strrep stmp1,".csv","" // 二重拡張子にならないよう一旦拡張子を除去 stmp1=stmp1+".csv" // 拡張子追加 // ファイルが存在するか確認 exist stmp1 if strsize!-1 { dialog stmp1+"\n同名のファイルが存在します。上書きしてよろしいですか?",2,"上書きの確認" if stat=7 { goto *save } // [いいえ]なら保存ダイアログに戻る } // ファイルに保存して終了 notesave stmp1 dialog stmp1+"\n上記に保存しました。アプリケーションを終了します。",0,"保存完了" *exit end




富士島

リンク

2017/6/18(Sun) 19:48:29|NO.80293

プログラムを全て作っていただきありがとうございます!!

自分で1から作っていたら間違いなくここまでのものは作れなかったです.
リアルタイム表示やcsv保存まで作っていただき助かりました.

おっしゃる通りこれで終わりにせず,1つ1つ内容を見ていき今後に活かしていきます.
本当にありがとうございました!



窓月らら

リンク

2017/6/18(Sun) 20:14:13|NO.80295

どういたしまして。
ちなみにさっき投稿してからバグを見つけて再投稿していますので
新しいほうを使ってください。



富士島

リンク

2017/6/18(Sun) 23:20:04|NO.80302

再びありがとうございます!



ONION software Copyright 1997-2021(c) All rights reserved.