Files
sea/tcl/drivers/sensirion.tcl
2025-06-17 11:39:38 +02:00

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
}