081104

|



ホストでの表示部分はTcl/Tkで書きました。Tcl/Tkなんて10年振りだ。昔はデ
ザイナさん向けのちょこっとしたツールを作るのによく使っていた。Tclはシェ
ルスクリプトなので変数の展開のタイミングを考えながら書かないといけない
のが、慣れるまでモヤモヤするんだよね。

シリアルの通信をどうしようか悩んでいたのだけれど、最近のTclはシリアル が使えるようになってたので、おあつらえむき。
で、できたのがこれ。ゼロリセットはスクリプト側で処理しています。いずれ ノギスのパワーON/OFFなどの制御も入れたいな...と、口だけつけてあります。 (Tclモードのうちに書いておかないとまた面倒だし^^)

#!/usr/pkg/bin/wish

set row 0
foreach i { X Y Z } {
    set dro_offset($i) 0.
    set dro_value($i) 0.
    set dro_power($i) 0
    checkbutton .c$i -text $i: -variable dro_power($i) -command "dro_power $i" \
	-font {{bandal} 50 bold}
    .c$i configure -anchor e
    button .b$i  -height 1 -width 7 -pady 0 -font {{bandal} 50 bold} \
	-command "dro_zero $i"
    grid configure .c$i -column 0 -row $row
    grid configure .b$i -column 1 -row $row
    incr row
}

button .e -text "Quit" -command {
    set a [tk_messageBox -type yesno -default no -icon question -message "Quit?"]
    if { $a == "yes" } { exit }
}
grid configure .e -row 3

proc dro_power { axis } {
    global dro_power
# not yet.
    puts stdout $axis
    puts stdout $dro_power($axis)
}

proc dro_zero { axis } {
    global dro_offset
    global dro_value
    set dro_offset($axis) $dro_value($axis)
}

proc dro_update { axis val } {
    global dro_offset
    set v [expr $val - $dro_offset($axis)]
    set t [format "%5.2f" $v]
    .b$axis configure -text $t -anchor e
}

proc dro_main { } {
    global dro_value
    set device "/dev/dty00"
    set fd [open $device {RDWR}]
    fconfigure $fd -mode 57600,n,8,1

    while { 1 } {
	gets $fd buf
	scan $buf "%d %d %d" X Y Z
	foreach i { X Y Z } {
	    set dro_value($i) [expr ($$i - ($$i / 100)/1.27)/100.0]
	    dro_update  $i $dro_value($i)
# Redraw all.
	    update
	}
    }
}

dro_main
本当、ちょこっとしたことにはTcl/Tkパワフルだよね〜。