Files
sea/tcl/drivers/svu.tcl
2022-08-18 15:04:28 +02:00

99 lines
1.8 KiB
Tcl

# solenoid valve unit
namespace eval svu {} {
}
proc stdConfig::svu {valves} {
controller std "\r" 5
prop startcmd "*IDN?"
pollperiod 1 1
obj SolenoidValveUnit -text rd
prop read svu::read
prop @valves $valves
prop visible false
kids "valves" {
foreach {v i} $valves {
node $v out
prop number $i
prop write svu::write
prop enum off=0,on=1
prop label $v
prop lineend 0
node ${v}_time -int wr
prop writecmd "t$i %d"
prop readcmd t$i
prop readfmt %d
prop label "timer \[ms\], 0=off"
prop lineend 0
node ${v}_pwm par 0
prop enum 1
}
node idn -text wr
prop width 30
prop write svu::store
prop readcmd i
prop label "store timer settings"
# prop readfmt %s
}
}
proc svu::read {} {
sct send "s"
return svu::update
}
proc svu::update {{kid 0}} {
set res [sct result]
set ocmd ""
foreach {v i} [sct @valves] {
set val [string equal [string index $res [expr $i - 1]] $i]
hupdate [sct objectPath]/$v $val
hdelprop [sct objectPath]/$v geterror
if {[hvali [sct objectPath]/${v}_pwm]} {
set t [hvali [sct objectPath]/${v}_time]
if {$t > 0} {
append ocmd o$i
} else {
append ocmd c$i
}
}
}
if {$kid} {
hupdate [sct objectPath] $res
hdelprop [sct objectPath] geterror
} else {
sct update $res
}
if {$ocmd eq ""} {
return idle
} else {
sct send $ocmd
return stdSct::complete
}
}
proc svu::write {} {
if {[sct target]} {
sct send "o[sct number]"
} else {
sct send "c[sct number]"
}
return "svu::update 1"
}
proc svu::store {} {
sct send "i[sct target]"
return svu::updatestore
}
proc svu::updatestore {} {
sct update [sct result]
sct send "store"
return stdSct::complete
}