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

124 lines
2.6 KiB
Tcl

# ACM Capacitance Meter
namespace eval acm {} {
}
proc stdConfig::acm {} {
controller std "\n" 5
prop startcmd "*IDN?"
obj acm rd -float
prop read acm::read
kids "ACM" {
node stdev upd
node offset par 00.0
prop label "tune offset"
node tstat upd -text
prop label ""
default ""
prop nonewline 1
node offset_tune par 0
prop enum "off,set,auto"
}
}
proc acm::read {} {
sct send "readAVCVT"
return acm::update
}
proc acm::update {} {
set dat [split [sct result] "," ]
sct update [lindex $dat 2]
hupdate [sct]/stdev [lindex $dat 3]
# hupdate [sct objectPath]/tstat ""
hdelprop [sct]/stdev geterror
# hdelprop [sct objectPath]/tstat geterror
if {[hvali [sct objectPath]/offset_tune]} {
return acm::twrite
}
return idle
}
#works with poll but is replaced by : return "stdSct::after wait time next script"
#proc acm::wait {} {
# if {[sct firstround]} {
# sct firstround [expr [sct firstround] -1]
# return idle
# }
# [sct controller] queue [sct] write acm::aread
# return unpoll
#}
proc acm::aread {} {
sct send "readCVT"
return acm::aupdate
}
proc acm::aupdate {} {
set dat [lindex [split [sct result] "," ] 0]
return "acm::achange $dat"
}
proc acm::achange {cap} {
set cap $cap
set scap [hvali [sct objectPath]/offset]
# clientput offset $scap
if {[expr abs($cap -$scap)] > 0.2 } {
set scap [expr $cap]
hupdate [sct objectPath]/offset $scap
if {$scap > 17} {
set scap 17
if {$scap > 21} {
hupdate [sct objectPath]/tstat "capacitance out of range"
} else {
hupdate [sct objectPath]/tstat "upper limit reached"
}
hupdate [sct objectPath]/offset $scap
hupdate [sct objectPath]/offset_tune 0
return idle
}
return acm::twrite
}
hupdate [sct objectPath]/tstat "auto tune O.K."
hupdate [sct objectPath]/offset_tune 0
return idle
}
proc acm::twrite {} {
set cap [format "%04.1f" [hvali [sct objectPath]/offset] ]
sct send "setCIN 1,0,$cap,99.9,0,99.9,99.9"
return acm::tread
}
proc acm::tread {} {
set resp [string range [sct result] 6 end]
# clientput resp: $resp
set dat [split $resp "," ]
# clientput [lindex $dat 2]
hupdate [sct objectPath]/offset [lindex $dat 2]
if {[hvali [sct objectPath]/offset_tune] == 2} {
hupdate [sct objectPath]/tstat "...tuning"
# sct firstround 2
# [sct controller] poll [sct] 0.5 start acm::wait
# return idle
return "stdSct::after 1.0 acm::aread"
}
hupdate [sct objectPath]/tstat "O.K."
hupdate [sct objectPath]/offset_tune 0
return idle
}
proc acm::checktune {} {
clientput checktune
sct update [result sct]
return idle
}