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

433 lines
9.3 KiB
Tcl

# CCU 4
namespace eval ccu4_6 {} {
variable deviceaction 1
variable newdevice ""
}
proc stdConfig::ccu4_6 {} {
variable name
variable node
controller std "\n" 5
prop startcmd "cid csf"
hsetprop $node/tasks complete ccu4_6::completeStart
prop write ccu4_6::write
prop commerror ccu4_6::errorScript
prop obj /$name
pollperiod 0.5 0.5
obj ccu4_6 rd -int
prop enum 1
prop label on
prop read ccu4_6::read
prop cfgtablefile ccu4.cfgtable
prop layoutpos 99
default 1
kids CCU4 {
node autodevice par -int 1
prop enum 1
node f upd
prop label flow
node fav out -int
prop enum 1
prop label "flow available"
node fs out -int
prop enum ok,no_sens
node fm upd -int
prop enum idle,opening,closing,opened,closed,no_motor
node fa out -int
prop enum fixed,controlled,automatic
node mav out -int
prop enum 1
prop label "n.v. motor available"
node mp out
prop label "motor pulse"
node mc out
prop label "motor current"
node mfc out
prop label "free current"
node moc out
prop label "overrun const"
node mtc out
prop label "torque const"
node mtl upd
prop label "torque limit"
node mft out
prop label "flow target"
node mt upd
prop label "torque"
node mo upd
prop label "overrun"
node mcr upd
prop label "read current"
node mot upd
prop label "open time"
node mw out
prop label "wiggle"
node h upd
prop label "he level"
node hr upd
prop label "he sensor mm"
node hav out
prop enum 1
prop label "He lev. available"
node hc upd
prop label "He meas. current"
node hu upd
prop label "He meas. volt"
node hh out
prop label "He full level"
node hl out
prop label "He fill level"
node htf out
prop label "fast period"
prop help "meas. period in fast mode"
node hts out
prop label "slow period"
prop help "meas. period in slow mode"
node hd out
prop label "He driv. current"
node hwr out
prop label "He wire res."
node hem out
prop label "empty"
prop help "sensor length in mm from top to empty pos."
node hfu out
prop label "full"
prop help "sensor length in mm from top to full pos."
node hcd out -int
prop enum stop,fill,off,auto
node hv upd -int
prop enum fill_valve_off,filling,no_fill_valve,timeout,timeout1
node hsf upd -int
prop enum sens_ok,sens_warm,no_sens,timeout,not_yet_read,disabled
node ha out -int
prop enum 1
prop label "He auto fill"
node hm upd -int
prop enum 1
prop label measure
node hf out -int
prop enum slow,fast
node hbe out -int
prop enum 1
prop label LHe 48V enabled
node hmf upd
prop label "meas first"
node hms upd
prop label "meas speed"
node hit out
prop label "increase tolerance"
node hft out -int
prop label "fast/fill timeout"
node hea out
prop label "add. He channels"
node hch out -int
prop label "LHe channel"
for {set ch 0} {$ch < 6} {incr ch} {
node h$ch upd
prop errvar hs$ch
prop newline 1
node hs$ch upd -int
prop enum sens_ok,sens_warm,no_sens,timeout,not_yet_read,disabled
prop nonewline 1
}
node nav out -int
prop newline 1
prop enum 1
prop label "N2 available"
node nu upd
prop label "N2 upper"
node nl upd
prop label "N2 lower"
node nth out
prop label "N2 threshold"
node ntc out
prop label "N2 tube cool delay"
node ntm out
prop label "N2 fill timeout"
node ns upd -int
prop enum sens_ok,no_sens,short_circuit,upside_down,sens_warm,empty
node na out -int
prop enum 1
prop label "N2 auto fill"
node nv upd -int
prop enum fill_valve_off,filling,no_fill_valve,timeout,timeout1
node nc out -int
prop enum stop,fill,off,auto
node cda upd
prop label "code res. a"
node cdb upd
prop label "code res. b"
node cba upd
prop label "code a invalid"
node cbb upd
prop label "code b invalid"
node cvs -int upd
prop label "config version"
node csp -int upd
prop label "hardware type"
node cdv out -text
prop label "device"
node cds out
prop label "device state"
prop enum local,remote,loading,by_code,by_touch
node tc upd
node tn upd
node th upd
node tf upd
node tm upd
node tv upd
node tq upd
node hfb upd
node nfb upd
node bdl out
prop label "valve boost delay"
}
return "CCU4"
}
proc ccu4_6::completeStart {} {
set cid 0
stdSct::scanf {cid=%s csf=%s} cid csf
sct result $cid
set old [silent 0 result device ccu4version]
if {$old ne $csf} {
catch {device makeitem ccu4version $csf}
error "WARNING: CCU4 version has changed from $old to $csf, please make 'samenv reload'"
}
hsetprop [sct parent] freelist ""
return [stdSct::completeStart]
}
proc ccu4_6::errorScript {} {
hupdate [sct obj]/status [sct result]
stdSct::errorScript
}
proc ccu4_6::read {} {
if {![hvali [sct]]} {
sct update 0
return idle
}
sct update 1
sct send "?"
return ccu4_6::update
}
proc ccu4_6::loadcodes {} {
if {[sct codeidx] >= [sct codelen]} {
# set version and save
sct send "cvs=[sct codeversion] c=s"
clientput "CCU4: updated cfgtable to version from [clock format [sct codeversion] -format {%Y-%m-%d %H:%M}]"
return ccu4_6::loadcomplete
}
# add item to device list
sct send "c=[lindex [sct codelist] [sct codeidx]]"
sct codeidx [expr [sct codeidx] + 1]
return stdSct::complete
}
proc ccu4_6::loadcomplete {} {
hupdate [sct]/cvs [sct codeversion]
return unpoll
}
proc ccu4_6::update {} {
variable deviceaction
variable newdevice
hupdate [sct]/status ""
catch {device ccu4_available 1}
set fdone 0
foreach item [sct result] {
set item [split $item "="]
if {[catch {
set name [lindex $item 0]
set value [lindex $item 1]
if {"$name" eq "f"} {
set fdone 1
} elseif {$name eq "cds"} {
if {$value >= 3 || $value == 0} { # device changed
set deviceaction $value
}
set newdevice ""
} elseif {$name eq "cdv" && $deviceaction >= 3} {
set newdevice $value
}
set errvar [silent "" hgetpropval [sct]/$name errvar]
if {$errvar ne ""} {
set errval [hvali [sct]/$errvar]
if {$errval > 0} {
hsetprop [sct]/$name geterror [lindex [split [hgetpropval [sct]/$errvar enum] ,] $errval]
hupdate [sct]/$name $value
} else {
updateval [sct]/$name $value
}
} else {
updateval [sct]/$name $value
}
} msg]} {
clientput $msg
clientput $item
}
}
# update flow anyway, as this triggers control
if {!$fdone} {
hupdate [sct]/f [hvali [sct]/f]
}
hdelprop [sct] geterror
set cvs [hvali [sct]/cvs]
if {$cvs != 0 && [file exists [sct cfgtablefile]]} {
sct codeversion [file mtime [sct cfgtablefile]]
if {$cvs != [sct codeversion]} {
clientput "CCU4: replace cfgtable version from [clock format $cvs -format {%Y-%m-%d %H:%M}]"
hupdate [sct]/cvs 0
set fil [open [sct cfgtablefile]]
set codelist [list ]
foreach line [split [::read $fil] \n] {
if {[string index $line 0] ne "#" && [string length $line] > 1} {
set lline [split $line "\t"]
while {[llength $lline] < 6} {
lappend lline {}
}
lappend codelist [join $lline ","]
}
}
sct codelist $codelist
close $fil
sct codeidx 0
sct codelen [llength [sct codelist]]
sct send "cvs=0 c=c"
[sct controller] poll [sct] 0.1 slow ccu4_6::loadcodes
return stdSct::complete
}
}
if {$deviceaction == 0} {
# CCU4 was restarted
device makeitem action renew
sct send cds=1
set deviceaction 1
return stdSct::complete
}
if {$deviceaction >= 3} {
if {$newdevice eq ""} {
# get new device name
sct send cdv
return ccu4_6::update
}
if {[sctval [sct]/autodevice]} {
device makeitem newdevice [string tolower $newdevice]
if {$deviceaction == 3} {
device makeitem action "plugged"
} else {
device makeitem action "selected on touch display"
}
# set device state to "loading"
clientput loading
sct send cds=2
} elseif {$deviceaction == 3} {
clientput "plugged [string tolower $newdevice] but autodevice off"
# set device state to "remote"
sct send cds=1
} else {
clientput "[string tolower $newdevice] selected on CCU4, but autodevice off"
# set device state to "remote"
sct send cds=1
}
set deviceaction 1
return stdSct::complete
}
return idle
}
proc ccu4_6::write {} {
if {![hvali [sct parent]]} {
sct update [sct target]
return idle
}
set name [lindex [split [sct] "/"] 2]
#clientput "[expr [clock seconds] % 60] $name=[sct target]"
sct send "$name=[sct target]"
return ccu4_6::complete
}
proc ccu4_6::complete {} {
set res [split [sct result] "="]
sct update [lindex $res 1]
return idle
}