Files
sea/tcl/archive/drivers/asm142.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

131 lines
3.4 KiB
Tcl

namespace eval asm142 {} {
}
proc stdConfig::asm142 {} {
controller bin
pollperiod 0.01
obj ASM142 rd
prop read asm142::read
kids "leak detector" {
node p upd
node state upd
prop enum standby,cycle,test
node vent upd
prop enum 1
node manualvalve par 0
prop enum 1
}
}
proc asm142::read {} {
# we wait for at least one byte. the bin driver adds additional bytes
# arriving immediately, but as we are sending nothing, nothing is purged
# (modification of SICS 22.10.2014)
sct send " / hex"
return asm142::update
}
proc asm142::update {} {
# Format of data sent from ASM142 to its remote control:
# ff <adr> <data>
# for <adr>==04 <data> is 2 bytes, for all other known <adr> 1 byte
# several (not always all) data chunks are sent one by one
# at the end, "ff 00 00" is sent, and the remote control respond is
# "00 00" (or i.e. "00 02" when CYCLE is pressed)
# if the remote control is not connected, only ff "00 00" is sent
# known data chunks:
# 01 <i>: mbar bargraph (<i> = 1 ... 20, meaning 1e-3 ... 2e+3, 3 per magnitude)
# 02 <i>: leak rate bargraph (<i> = 1 ... 40, meaning 1.7e-12 ... 1e-2)
# 04 nm cl: leak rate (n.mE-l, BCD format, where c seems to be the code for "-")
# 06 10tzaclr (LEDs bits: test, zero, autocal, cycle, left, right)
# 07 0000v0s0 (LEDs bits: vent, snif)
# 0d <i>: threshold for leak rate (blinking) (<i> = 128 + bar number)
set buf [silent "" sct buf]
set res [concat [silent "" sct oldres] [sct result]]
#clientput $res
foreach byte $res {
if {$byte eq "ff"} {
if {[llength $buf] > 0} {
set adr [lindex $buf 1]
set val [lrange $buf 2 end]
switch $adr {
04 {
set exp1 0
scan $val "%1s%1s %1s%1s" dig1 dig2 exp1 exp2
switch $exp1 {
3 {set exp1 "e-1"}
c {set exp1 "e-"}
}
if {$exp1 ne "0"} {
sct update "${dig1}.${dig2}${exp1}${exp2}"
}
}
01 {
set p 0
scan $val "%x" p
updateval [sct]/p [expr pow(10, ($p-1)/3.0) * 0.001]
}
06 {
set state 0
set led 0
scan $val "%x" led
if {$led & 32} {
set state 2
} elseif {$led & 4} {
set state 1
}
updateval [sct]/state $state
}
07 {
set vent 0
set led 0
scan $val "%x" led
if {$led & 8} {
set vent 1
}
updateval [sct]/vent $vent
}
# 02 - 0d {
# # ignore leak rate bar and level
# set press 0
# scan $val "%x" p
# updateval [sct]/p [expr pow(10, ($p-1)/3.0) * 0.001]
# }
# default {
# set old ""
# global pars
# catch {set old $pars($adr)}
# if {$old ne $val} {
# set pars($adr) $val
# clientput "${adr}:${val}"
# }
# }
}
set buf ""
}
set buf $byte
} else {
append buf " $byte"
if {$buf eq "ff 00 00" && [silent 0 sct noremote]} {
#clientput "send 00 00"
sct buf ""
sct send "00 00 /"
return asm142::readnext
}
}
}
sct buf $buf
return idle
}
proc asm142::readnext {} {
sct oldres [sct result]
return idle
}