2013年8月30日金曜日

Gtkでホール効果測定のプログラムを書くための準備

今回ホール効果測定装置を立ち上げるにあたって,初心に帰ってCで書いています.
ただコマンドラインで順繰りにプログラムを動かすのでは21世紀っぽくないなぁ,と思い,思い切ってGUIで操作できるようにすることにしました.

そこで,練習のためにGtkをつかって,(でもmain関数がバカでかい)接続したデバイスのIDをGPIB経由でとってきて,画面上に表示させるプログラムをちょちょいと書いてみました.

(Gtkでは全然21世紀っぽくもないのですが...)




つないであるデバイスは今のところ三つなのでボタン三つ.
構成は,メニューバー,ラベル1,三つボタンの入ったhbox,ラベル2をvboxに入れて,ボタンをクリックすると各装置に"*idn?"をなげ,帰ってきたテキストをラベル2に"g_signal_connect_swapped"をつかって反映させる,というだけのものです.

ボタンのソースコードは,

    button1 = gtk_button_new_with_label ("TR6861");
    gtk_widget_set_size_request (button1, BTN_WIDTH, BTN_HEIGHT);
    gtk_container_add (GTK_CONTAINER (hbox), button1);
    gtk_signal_connect (GTK_OBJECT (button1), "clicked", G_CALLBACK (TR6861read), NULL);
    g_signal_connect_swapped (GTK_OBJECT (button1), "clicked", G_CALLBACK (cb_label), (gpointer) label2);
    gtk_container_set_border_width (GTK_CONTAINER (button1), 5);

button1をクリックしたときに,gtk_signal_connectで一つ目のコールバック関数を呼び出し,この関数の中で測定器からIDNをとってきてBufferに入れ,その次の行でg_signal_connect_swappedでlabel2の内容をBufferで書き換えるコールバック関数を呼び出しています.
ここで問題は,一つ目のGPIB通信に時間がかかってしまった場合,すぐに下の行のg_signal_connect_swappedでラベルを書き換えるコールバック関数が呼ばれてしまうと,Bufferに測定器からの読み取り値が代入される前に古いBufferの値でlabel2を書き換えてしまうのではないかという心配です.
そこで,わざとgtk_signal_connect で呼び出しているコールバック関数の中にsleep行を入れてみて,どんなに待っても逐次的に処理されるかを試したところ,しっかり待ってからg_signal_connect_swappedのコールバック関数を実行していたので,問題はありませんでした.

GPIBで測定するところは,

static void Agilent34420Aread (){

  PrimaryAddress = 22;
  Device = ibdev(
BoadIndex,
PrimaryAddress,
SecondaryAddress,
T10s,
1,
0
);
  ibwrt (Device, "*IDN?\n", 5);
  ibrd (Device, Buffer, 100);
  Buffer[ibcntl] = '\0';

  ibloc(Device);
//  sleep(1);

}


こんな感じでエラー処理とか細かいことは一切していないのですが,本番はきちんとエラーが出たときに処理して標準出力にいろいろ吐くようにします.

メニューバーにはFile > Quitのシンプルなメニューしかありません.

ちなみに,プログラムはウインドウのクローズボックスをクリックしても,メニューで終了を選んでもどちらでも終了できるようにしてあります.

この程度に半日近くかかってしまった.

作業はすべて,自室のMacからssh -Xで実験室につないで行っているので,画像でもmacっぽく見えていますが,実際はLinux上で動いています.

2013年8月7日水曜日

Mountain Lionにfinkでwine

久しぶりにfinkのパッケージを検索してみたら,wineが復活している模様.
現在MacBookAirにVirtualBoxを入れてWindows2000を使っていますが,finkにwineが復活したならもはやwineを使った方がいいに決まっています.

$ sudo fink selfupdate
$ sudo fink update-all
$ sudo fink install wine-32bit

かなりの時間の後,無事インストール完了.
バージョンは1.6の模様.

まずは通常どおりwinefileを起動.

$ winefile

すると,.netをインストールしろとか,いろいろ言ってくる.
とりあえず,.net関係のインストールには失敗し,GECKOエンジンのインストールには成功.

Cドライブが ~/.wine/drive_c以下に出来,無事うまく行っている様子.



画像はすでにWiMDAとGhostscript,Ghostview,GLEをインストール済み.
最近は環境変数をいじらなくてもきちんと解析からフィットまで出来るようになっている模様.

ここで興味深いことに気づく.
なんと,X11が動いていない,つまり,Aqua上で動いているように見える,ということです.
ただ,このwinefile,まだまだ実装されていない機能もあるようで,たとえばファイルのコピペがうまく出来ません.
なので,ファイルのコピペはMacのFinderをつかって行い,winefile上で.exeをダブルクリックしてアプリをインストールしたり起動したりします.
多少不安定な感じは否めないので,代わりにexplorerを使ってみることに.

$ wine explorer

すると,もう少しおシャンなエクスプローラーが立ち上がる.


こちらも,winefileと同様にダブルクリックでファイル操作ができ,なおかつもう少し安定している様子.
しかも,見た目がMacっぽくってすばらしい!

懸案のWiMDAを立ち上げる.


きちんと使えます.
撃速です.

regeditで編集するまでもなく,きちんとパスが通っているようで,解析が可能.

ただし,MacBookAirの解像度ではちょっと厳しい.