# 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 controller bin chksum-crc 1 2 # 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=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 }