Files
sea/tcl/archive/drivers/taskit.tcl
l_samenv 4d9961fe5c add archive (files probably no longer used)
here we can find old files
2022-08-22 15:28:09 +02:00

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
}