130 lines
2.8 KiB
Tcl
130 lines
2.8 KiB
Tcl
namespace eval taskit {} {
|
|
}
|
|
|
|
proc stdConfig::taskit {} {
|
|
controller std "\r" 5
|
|
|
|
obj TaskitADC rd
|
|
prop readcmd ":0400000008.."
|
|
prop update taskit::update
|
|
|
|
kids "Taskit Settings" {
|
|
node dig out -text
|
|
default 00
|
|
prop write taskit::write
|
|
|
|
node mode out -text
|
|
default ff
|
|
prop write taskit::write
|
|
|
|
node pulse out -int
|
|
prop write taskit::pulse
|
|
|
|
node res wr -int
|
|
prop write taskit::writeRes
|
|
prop read taskit::readRes
|
|
|
|
node a0 upd
|
|
node a1 upd
|
|
node a2 upd
|
|
node a3 upd
|
|
node a4 upd
|
|
node a5 upd
|
|
node a6 upd
|
|
node a7 upd
|
|
|
|
node p upd
|
|
|
|
}
|
|
|
|
return "new taskit"
|
|
}
|
|
|
|
proc taskit::writeRes {} {
|
|
sct send [format ":10000D00010200%2.2x.." [sct target]]
|
|
return taskit::readRes
|
|
}
|
|
|
|
proc taskit::readRes {} {
|
|
sct send ":03000D0001.."
|
|
return taskit::updateRes
|
|
}
|
|
|
|
proc taskit::updateRes {} {
|
|
set res 0
|
|
scan [sct result] ":0302%4x" res
|
|
sct update $res
|
|
return idle
|
|
}
|
|
|
|
proc taskit::update {} {
|
|
if {[scan [sct result] ":0410%4x%4x%4x%4x%4x%4x%4x%4x" \
|
|
a(0) a(1) a(2) a(3) a(4) a(5) a(6) a(7)] == 8} {
|
|
set vmax 2.5
|
|
foreach i {0 1 2 3 4 5 6 7} {
|
|
set a($i) [expr 2.5 * $a($i) / 65535.]
|
|
hupdate [sct]/a$i $a($i)
|
|
}
|
|
hupdate [sct]/p [expr 250 * ($a(2) - 0.4) / 1.6]
|
|
set x [expr ($a(6) - $vmax * 0.5)]
|
|
set y [expr ($a(7) - $vmax * 0.5)]
|
|
set r [expr abs($x) + abs($y)]
|
|
set old [silent 0 sct old]
|
|
if {$r < $vmax * 0.4 || $r > $vmax * 0.6} {
|
|
error "illegal value $r = |$x| + |$y|"
|
|
} elseif {$y > 0} {
|
|
if {$x > 0} {
|
|
set ang [expr $y/$r * 90]
|
|
} else {
|
|
set ang [expr - $x/$r * 90 + 90]
|
|
}
|
|
} else {
|
|
if {$x < 0} {
|
|
set ang [expr - $y/$r * 90 + 180]
|
|
} else {
|
|
set ang [expr $x/$r * 90 + 270]
|
|
}
|
|
}
|
|
set ang [expr $ang + 360 * round(($old - $ang) / 360.0)]
|
|
sct update $ang
|
|
sct old $ang
|
|
} else {
|
|
error "bad result: [sct result]"
|
|
}
|
|
return idle
|
|
}
|
|
|
|
proc taskit::write {} {
|
|
set value 0
|
|
set mode ff
|
|
sct update [sct target]
|
|
scan [hvali [sct objectPath]/dig] %x value
|
|
scan [hvali [sct objectPath]/mode] %x mode
|
|
sct send [format ":10000000030600FF%4.4X%4.4X.." $mode $value]
|
|
return taskit::completeOut
|
|
}
|
|
|
|
proc taskit::completeOut {} {
|
|
sct update [sct target]
|
|
return idle
|
|
}
|
|
|
|
proc taskit::pulse {} {
|
|
scan [hvali [sct objectPath]/dig] %x value
|
|
scan [hvali [sct objectPath]/mode] %x mode
|
|
set p [expr 1 << [sct target]]
|
|
set value [expr $value & (255 - $p)]
|
|
sct send [format ":10000000030600FF%4.4X%4.4X.." $mode $value]
|
|
sct update [sct target]
|
|
return taskit::pulsEnd
|
|
}
|
|
|
|
proc taskit::pulsEnd {} {
|
|
scan [hvali [sct objectPath]/dig] %x value
|
|
scan [hvali [sct objectPath]/mode] %x mode
|
|
set p [expr 1 << [sct target]]
|
|
set value [expr $value | $p]
|
|
sct send [format ":10000000030600FF%4.4X%4.4X.." $mode $value]
|
|
return taskit::completeOut
|
|
}
|