Files
sea/tcl/drivers/bruker.tcl
2022-08-18 15:04:28 +02:00

97 lines
1.7 KiB
Tcl

# bruker electromagnet
namespace eval bruker {
}
proc stdConfig::bruker {} {
controller std "\r" 2 "\r"
pollperiod 5 5
obj Bruker wr -drive
prop read bruker::readcur
prop write bruker::writecur
prop checklimits bruker::checklimits
prop halt bruker::halt
prop status idle
prop label "set field"
kids "bruker" {
node field rd
prop read bruker::readfield
node lowerlimit par -45
node upperlimit par 45
}
return "bruker electromagnet"
}
proc bruker::checklimits {} {
if {[sct target] > [hval [sct]/upperlimit]} {
error "target value above upper limit"
}
if {[sct target] < [hval [sct]/lowerlimit]} {
error "target value below lower limit"
}
sct status run
[sct controller] poll [sct] 0.5 progress bruker::progress
}
proc bruker::halt {} {
sct status idle
sct send RST=0
return bruker::haltcomplete
}
proc bruker::haltcomplete {} {
return idle
}
proc bruker::writecur {} {
sct send PNT=[sct target]
return bruker::complete
}
proc bruker::readcur {} {
sct send "CUR/"
return bruker::update
}
proc bruker::parse {} {
regexp {([A-Z]*)/(E[0-9][0-9])?([+-]) *(.*)} [sct result] -> nam err sig num
return $sig$num
}
proc bruker::progress {} {
sct send "CUR/"
return bruker::compro
}
proc bruker::compro {} {
set res [parse]
sct update $res
if {abs($res-[sct target]) < 0.01} {
sct status idle
[sct controller] queue [sct]/field read read
return unpoll
}
return idle
}
proc bruker::readfield {} {
sct send "FIE/"
return bruker::update
}
proc bruker::complete {} {
sct print "run current to [sct target]"
return idle
}
proc bruker::update {} {
sct update [parse]
return idle
}