Files
sea/tcl/luft.tclsh
2022-10-17 17:10:39 +02:00

115 lines
2.3 KiB
Tcl
Executable File

#!/usr/bin/tclsh
foreach {adr obj} {
IKA-GAMA:Luft_S10 luft
IKA-GAMA:Luft_S2 luft_wlga
} {
set values($adr) -1
set objects($adr) $obj
}
proc readpipe {} {
global sea values
set line [gets $sea(pipe)]
if {$sea(debug)} {
puts stdout "> $line"
}
if {[eof $sea(pipe)]} {
puts stdout EOF
exit
}
lassign $line adr date time value
set values($adr) $value
send_to_sea
}
proc seacom {line} {
global sea
puts $sea(sock) $line
flush $sea(sock)
if {$sea(debug)} {
puts stdout "> $line"
}
}
proc send_to_sea {} {
global sea values objects
foreach adr [array names values] {
if {$values($adr) >= 0} {
seacom "$objects($adr) confirm $sea(heartbeat) $values($adr)"
}
}
catch {after cancel $sea(afterid)}
set sea(afterid) [after [expr int(1000 * $sea(heartbeat))] send_to_sea]
}
proc readsea {} {
global sea values
set line [gets $sea(sock)]
if {[eof $sea(sock)]} {
exit
}
if {$sea(debug)} {
puts stdout "< $line"
}
# if {[scan $line {HEARTBEAT %d %s} sea(heartbeat) values($adr)]} {
# send_to_sea
# }
}
set env(EPICS_CA_ADDR_LIST) cryo-cagw:5062
set env(EPICS_CA_AUTO_ADDR_LIST) NO
set env(PATH) $env(PATH):/afs/psi.ch/project/sinq/rhel7/stow/base-3.15.5/bin/linux-x86_64-debug/
set sea(debug) [lindex "$argv 0" 0]
if {$sea(debug) eq "1"} {
set sea(heartbeat) 20
} else {
set sea(heartbeat) 300
set sea(debug) 0
}
# connect to sea server prep0
set sea(sock) [socket samenv.psi.ch 8640]
fileevent $sea(sock) readable readsea
if {$sea(debug)} {
seacom "seauser seaser"
} else {
seacom "Spy 007"
}
set cmd "/afs/psi.ch/project/sinq/rhel7/stow/base-3.15.5/bin/linux-x86_64-debug/camonitor [array names values]"
set ret [catch {set proc [exec ps ax -o pid,args | grep $cmd]} msg]
set killed [list]
if {$ret == 0} {
foreach line [split $proc "\n"] {
set l [split [string trim $line]]
set c [lrange $l 1 end]
if {"$c" eq "$cmd"} {
# process was still running
lappend killed [lindex $l 0]
exec kill -9 [lindex $l 0]
}
}
}
set sea(pipe) [open "|$cmd" r]
fileevent $sea(pipe) readable readpipe
set mypid [pid $sea(pipe)]
set f [open $env(HOME)/monitfiles/luft_camonitor.pid w]
puts $f $mypid
close $f
puts stdout $mypid
if {[llength $killed] > 0 && $sea(debug)} {
puts stdout "killed $killed"
}
seacom "clientlog luft started"
vwait forever