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

119 lines
2.6 KiB
Tcl

namespace eval motorvalve {
}
proc stdConfig::motorvalve {} {
variable name
controller syncedprot
prop write stdSct::complete
pollperiod 1 1
obj MotorValve -int wr
prop enum closed,closing,opening,opened,undefined
prop check motorvalve::check_valve
prop write motorvalve::set_valve
prop read motorvalve::get_valve
prop buttontitle "operate valve"
prop buttons open/2/2,3:close/1/0,1
prop mot ${name}_mot
prop try 0
kids "$name motor valve" {
}
}
proc motorvalve::set_valve_status {new} {
set old [silent "" sct valvestatus]
set path [sct objectPath]/status
set status [hvali $path]
if {$new ne "" || $old eq $status} {
hupdate $path $new
}
sct valvestatus $new
}
proc motorvalve::check_valve {} {
set_valve_status ""
sct try 5
sct slowspeed 50
}
proc motorvalve::set_valve {} {
set val [hvali [sct]]
if {[sct target] < 2} {
if {[hvali [sct]/[sct mot]/encoder] > 20} {
[sct mot] maxspeed 200
sctsync {
run [sct mot] 15
}
}
set val 1
sct update 1
return motorvalve::slow_close
} elseif {[sct target] < 4} {
[sct mot] maxspeed 200
hset [sct]/[sct mot] [hval [sct]/[sct mot]/upperlimit]
set val 2
}
sct update $val
return idle
}
proc motorvalve::slow_close {} {
[sct mot] maxspeed [sct slowspeed]
sct slowspeed [expr max(10,[sct slowspeed] - 10)]
run [sct mot] [hval [sct]/[sct mot]/lowerlimit]
return idle
}
proc motorvalve::get_valve {} {
set p [sct]/[sct mot]
set stat [hgetpropval $p status]
set pos [hvali $p/encoder]
if {$pos < [hval $p/lowerlimit] - 15 ||
$pos > [hval $p/upperlimit] + 15} {
hsetprop $p/encoder adjust_zero 1
return idle
}
set dir [string map {0 close 1 close 2 open 3 open 4 undefined} [silent 4 sct target]]
if {[sct try] == 0} {
set dir undefined
}
if {$stat eq "run"} {
if {[hgetpropval $p target] > $pos} {
sct update 2
} else {
sct update 1
}
} elseif {$pos < 2 && $dir ne "open"} {
sct update 0 ;# closed
sct try 0
set_valve_status ""
} elseif {$pos > 30 && $dir ne "close"} {
sct update 3 ;# opened
sct try 0
set_valve_status ""
} else {
if {[sct try] > 1 && $dir ne "undefined"} {
set try [sct try]
incr try -1
if {$try <= 3} {
clientput "[sct] try again to $dir ($try)"
}
hset [sct] [sct target]
sct try $try
} else {
sct try 0
if {$dir ne "undefined"} {
set txt "cannot $dir valve at He pump. Please do it manually"
clientput "ERROR: $txt"
set_valve_status $txt
sct target 4
}
sct update 4 ;# undefined
}
}
return idle
}