128 lines
3.2 KiB
Tcl
128 lines
3.2 KiB
Tcl
# note: in order to activate the sensirion flow meter
|
|
# instconfig sensirion has to be set to 1
|
|
|
|
namespace eval sensirion {} {
|
|
}
|
|
|
|
proc stdConfig::sensirion {} {
|
|
variable name
|
|
|
|
# bin <checksum-algorithm> <timeout> <number-of-retries>
|
|
controller bin chksum-crc 1 2
|
|
|
|
# <fast> <slow> <history resolution>
|
|
pollperiod 1 10 5
|
|
obj sensirion rd
|
|
prop readcmd "str1 ? int 10 / str18"
|
|
# overwrite controller properties on trinamic:
|
|
prop read stdSct::read
|
|
prop update sensirion::updateFlow
|
|
|
|
kids "n.v. flow" {
|
|
|
|
node stddev upd
|
|
|
|
# ?<nsample>_ nsample=160: <~= 1 sec, nsample=800: <~= 5 sec
|
|
node nsamples -int wr
|
|
prop read stdSct::read
|
|
prop complete sensirion::update
|
|
prop update sensirion::update
|
|
prop write stdSct::write
|
|
prop readcmd "str1 n int 10 / str9"
|
|
prop writecmd "str7 n%-6d int 10 / str9"
|
|
|
|
node offset wr
|
|
prop read stdSct::read
|
|
prop complete sensirion::update_and_check
|
|
prop update sensirion::update
|
|
prop write stdSct::write
|
|
prop readcmd "str1 o int 10 / str9"
|
|
prop writecmd "str7 o%-6.2f int 10 / str9"
|
|
|
|
node scale wr
|
|
prop read stdSct::read
|
|
prop complete sensirion::update_and_check
|
|
prop update sensirion::updateScale
|
|
prop write stdSct::write
|
|
prop readcmd "str1 g int 10 / str9"
|
|
prop writecmd "str7 g%-6.4f int 10 / str9"
|
|
|
|
node save wr
|
|
prop enum 1
|
|
prop read sensirion::readSave
|
|
prop write sensirion::saveCalib
|
|
prop help "unchecked: current calib is not saved. set checked: save calib"
|
|
|
|
}
|
|
|
|
hset $name/nsamples 160
|
|
hset $name/scale 2.3
|
|
}
|
|
|
|
proc sensirion::updateFlow {} {
|
|
lassign [sct result] flow stddev
|
|
if {$flow == 0 && $stddev == 0 || [silent 0 sct simerror]} {
|
|
set use_pressure [silent 0 hval /nv/use_pressure]
|
|
if {! $use_pressure} {
|
|
hset /nv/use_pressure 1
|
|
clientput "ERROR: invalid flow -> switched to pressure"
|
|
}
|
|
}
|
|
sct update $flow
|
|
updateval [sct]/stddev $stddev
|
|
if {[silent "" hgetpropval [sct]/save saved] eq "" && [silent "" currentCalib] ne ""} {
|
|
hsetprop [sct]/save saved [currentCalib]
|
|
hupdate [sct]/save 1
|
|
}
|
|
return idle
|
|
}
|
|
|
|
proc sensirion::currentCalib {} {
|
|
return [format {%.4f %.4f} [hval [sct objectPath]/offset] [hval [sct objectPath]/scale]]
|
|
}
|
|
|
|
proc sensirion::saveCalib {} {
|
|
if {[sct target]} {
|
|
sct send "str1 s int 10 / str1"
|
|
sct saved [currentCalib]
|
|
sct print "saved calib [sct saved]"
|
|
} else {
|
|
sct print "marked calib as dirty"
|
|
}
|
|
sct update [sct target]
|
|
return stdSct::complete
|
|
}
|
|
|
|
proc sensirion::update {} {
|
|
sct update [sct result]
|
|
return idle
|
|
}
|
|
|
|
proc sensirion::update_and_check {} {
|
|
sct update [sct result]
|
|
[sct controller] queue [sct parent]/save progress read
|
|
return idle
|
|
}
|
|
|
|
proc sensirion::readSave {} {
|
|
set current [silent "" currentCalib]
|
|
set saved [silent "" sct saved]
|
|
if {$current eq $saved} {
|
|
sct update 1
|
|
} else {
|
|
sct update 0
|
|
}
|
|
return idle
|
|
}
|
|
|
|
proc sensirion::updateScale {} {
|
|
if {[sct result] == 1 && [silent 0 sct target] != 1} {
|
|
# probably an uncalibrated sensor was replaced and not initialized
|
|
sct target 2.3
|
|
clientput "change nvflow scale from 1 to 2.3"
|
|
return write
|
|
}
|
|
sct update [sct result]
|
|
return idle
|
|
}
|