« Cabbage Town Festival | トップページ | レベチラセタムが日本で発売 (Levetiracetam came to Japan) »

2010/09/23

MATLABでC言語 (C language with MATLAB)

MATLABで脳波分析プログラムを書いているのですが、どうしてもできないことがあったのです。

それは、「現在、特定のキーが押されているかどうか」を検出すること。

長時間かかる処理を特定のキーを押して中断させたい場合があります。これには、上記の処理が必要なのですが、MATLABにはこれを行う関数が見当たりません。

見えないFigureを使うという技があるのですが、ちょっとスマートじゃない。

なので、この処理を行う関数を作ることにしました。

この処理を行うには、GetAsyncKeyStateというWindows APIを使います。これをMATLABから呼び出すために、C言語でプログラムすることにしました。C言語は、Palmwareを作っていた頃以降は使っていないので、ちょっと不安でしたが...

MATLABには、MATLAB用にC言語で作ったファイルをコンパイルするためのmex関数があります。これを使って、GetAsyncKeyState.cというファイルを作りました。

#include "mex.h"
#include <windows.h>

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
    int c;
    bool hit;
       
    if (nrhs != 1) {
        mexErrMsgTxt("GetAsyncKeyState: Only 1 input variable is accepted.");
    } else if (nlhs > 1) {
        mexErrMsgTxt("GetAsyncKeyState: Too many output variables.");
    }
   
    if (!mxIsChar(prhs[0])) {
        mexErrMsgTxt("GetAsyncKeyState: Input variable must be Char.");
    }
   
    c = mxGetScalar(prhs[0]);
   
    if (HIBYTE(GetAsyncKeyState(c))) {
        hit = true;
    } else {
        hit = false;
    }
   
    plhs[0] = mxCreateLogicalScalar(hit);
}

ちょっと冗長な書き方の部分がありますが、まぁよしということで。

あとは、mex GetAsyncKeyState.cでコンパイルを行うと、GetAsyncKeyState関数が使用可能になります。

使用法ですが、この関数に検出したい文字1文字を渡して呼び出すと、その時点でそのキーが押されていたかどうかを論理値で返してくれます。

例えば、エスケープキーでループを脱出したいときは、MATLABで以下のとおり。

if GetAsyncKeyState(char(27))
    break;
end

これでだいぶ便利になりました♪

 

|

« Cabbage Town Festival | トップページ | レベチラセタムが日本で発売 (Levetiracetam came to Japan) »

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



« Cabbage Town Festival | トップページ | レベチラセタムが日本で発売 (Levetiracetam came to Japan) »