110 lines
2.3 KiB
Tcl
110 lines
2.3 KiB
Tcl
namespace eval pinp {
|
|
}
|
|
|
|
# pressure input module
|
|
proc stdConfig::pinp {} {
|
|
variable name
|
|
|
|
if {[controller std "\r" 2]} {
|
|
controllerDesc "PINP pressure input module"
|
|
}
|
|
|
|
obj pinp rd
|
|
pollperiod 1
|
|
prop name0 "gnd"
|
|
prop name1 "max"
|
|
prop name2 "a2"
|
|
prop name3 "a3"
|
|
prop name4 "a4"
|
|
prop name5 "a5"
|
|
prop name6 "a6"
|
|
prop name7 "a7"
|
|
prop read pinp::read
|
|
|
|
kids "sensors" {
|
|
|
|
node gnd upd
|
|
prop inprange "0,2.5"
|
|
prop outrange "0,2500"
|
|
|
|
node max upd
|
|
prop inprange "0,2.5"
|
|
prop outrange "0,2500"
|
|
|
|
node a2 upd
|
|
prop inprange "0.055,2.1936"
|
|
prop outrange "0,1000"
|
|
|
|
node a3 upd
|
|
prop inprange "0.432,2.0"
|
|
prop outrange "0,250"
|
|
|
|
node a4 upd
|
|
prop inprange "0.432,2.0"
|
|
prop outrange "0,1100"
|
|
|
|
node a5 upd
|
|
prop inprange "0.435,2.0"
|
|
prop outrange "0,4000"
|
|
|
|
node a6 upd
|
|
prop inprange "0.055,2.1936"
|
|
prop outrange "0,1000"
|
|
|
|
node a7 upd
|
|
prop inprange "0.055,2.1936"
|
|
prop outrange "0,1000"
|
|
}
|
|
return "PINP pressure input module"
|
|
}
|
|
|
|
proc pinp::start {} {
|
|
# set adc rate to 8
|
|
sct send ":10000D0001020008.."
|
|
return pinp::getidn
|
|
}
|
|
|
|
proc pinp::getidn {} {
|
|
sct send ":0300030001.."
|
|
return stdSct::completeStart
|
|
}
|
|
|
|
proc pinp::read {} {
|
|
set min 8
|
|
set max 0
|
|
for {set c 0} {$c <= 7} {incr c} {
|
|
if {[silent none sct name$c] ne "none"} {
|
|
if {$min == 8} {
|
|
set min $c
|
|
}
|
|
set max $c
|
|
}
|
|
}
|
|
sct firstChan $min
|
|
sct lastChan $max
|
|
sct nChan [expr $max - $min + 1]
|
|
sct send [format ":04%4.4x%4.4x.." [sct firstChan] [sct nChan]]
|
|
return pinp::update
|
|
}
|
|
|
|
proc pinp::update {} {
|
|
set fmt [format ":04%2.2X%s" [expr 2 * [sct nChan]] [string repeat %4x [sct nChan]]]
|
|
set vars [lrange {a(0) a(1) a(2) a(3) a(4) a(5) a(6) a(7)} [sct firstChan] [sct lastChan]]
|
|
if {[eval scan [sct result] $fmt $vars] != [sct nChan]} {
|
|
error "bad response to '[sct send]': '[sct result]' $fmt $vars"
|
|
}
|
|
for {set c [sct firstChan]} {$c <= [sct lastChan]} {incr c} {
|
|
set name [silent none sct name$c]
|
|
if {$name ne "none"} {
|
|
sct with $name {
|
|
scan [sct inprange] "%f,%f" imin imax
|
|
scan [sct outrange] "%f,%f" omin omax
|
|
set val [expr (2.5 * $a($c)/65535. - $imin) / ($imax - $imin) * ($omax - $omin) + $omin]
|
|
sct update $val
|
|
}
|
|
}
|
|
}
|
|
sct update 0
|
|
return idle
|
|
}
|