Andrew Kerrigan's script context driver for the Pfeiffer 261 pressure gauge

This commit is contained in:
Douglas Clowes
2013-06-21 13:37:31 +10:00
parent 5970a05aaa
commit 95d8a565e3

View File

@@ -0,0 +1,135 @@
# sct_pfeiffer_tpg261.tcl
# Created 23/1/13 by Andrew Kerrigan, summer student in the ANSTO sample environment
# SICS ScriptContext setup for the pfeiffer 261 pressure gauge
#
# Usage:
# add_tpg261 name IP port [filename]
#
# Example:
# add_tpg261 myObj 137.157.202.78 4004 /home/nbi/pressurelog_060213.txt
#
# This will set up:
# SCT_OBJECT myObj
# SCT_CONTROLLER sct_tpg261_myObj
# Log file /home/nbi/pressurelog_060213.txt
# The SCT_OBJECT has a node "currentPressure" containing the
# current pressure reading from the tpg261 as a float, in whatever
# units the tpg261 is currently reading in
#
# The current pressure will be written to the log file along with a time stamp every time it is polled.
namespace eval ::scobj::tpg261 {
proc sendPR1 {par nextState} {
if [hpropexists [sct] geterror] {
hdelprop [sct] geterror
}
sct send "$par"
return $nextState
}
proc isReady {nextState} {
set data [sct result]
switch -glob -- $data {
"ASCERR:*" {
sct geterror $data
set nextState idle
}
default {
if {$data == "\x06"} {
sct send "\x05"
}
}
}
return $nextState
}
proc getPR1 {path nextState} {
set data [sct result]
switch -glob -- $data {
"ASCERR:*" {
sct geterror $data
set nextState idle
}
default {
set val [string range $data 3 12]
set status [string range $data 0 0]
sct update $val
hsetprop ${path}/currentPressure status $status
sct utime readtime
set nextState statusUpdate
if {[hgetpropval $path/currentPressure logging] = 1} {
set floc [hval ${path}/filename]
set fn [open $floc a+]
set curtime [hgetpropval ${path}/currentPressure readtime]
puts $fn "$curtime, $pressure, $status"
close $fn
}
}
return $nextState
}
}
proc statusUpdate {path} {
set status [hgetpropval $path/currentPressure status]
switch $status {
0 { set text "Sensor OK" }
1 { set text "Sensor underrange" }
2 { set text "Sensor overrange" }
3 { set text "Sensor error" }
4 { set text "Sensor off" }
5 { set text "No sensor" }
6 { set text "Identification error" }
default { set text "Status unreadable" }
}
hsetprop $path/currentPressure statusText $text
return idle
}
proc mk_sct_pfeiffer_tpg261 {sct_controller klass tempobj filename} {
set ns ::scobj::tpg261
makesicsobj $tempobj SCT_OBJECT
sicslist setatt $tempobj klass $klass
sicslist setatt $tempobj long_name $tempobj
set scobj_hpath /sics/$tempobj
hfactory ${scobj_hpath}/currentPressure plain user float
hsetprop ${scobj_hpath}/currentPressure read ${ns}::sendPR1 "PR1" isReady
hsetprop ${scobj_hpath}/currentPressure isReady ${ns}::isReady getPR1
hsetprop ${scobj_hpath}/currentPressure getPR1 ${ns}::getPR1 $scobj_hpath statusUpdate
hsetprop ${scobj_hpath}/currentPressure statusUpdate ${ns}::statusUpdate $scobj_hpath
hsetprop ${scobj_hpath}/currentPressure status 0
hsetprop ${scobj_hpath}/currentPressure statusText UNKNOWN
hsetprop ${scobj_hpath}/currentPressure readtime UNKNOWN
hfactory ${scobj_hpath}/filename plain user text
hset ${scobj_hpath}/filename $filename
if {$filename = "noFile"} {
hsetprop ${scobj_hpath}/currentPressure logging 0
} else {
hsetprop ${scobj_hpath}/currentPressure logging 1
set floc $filename
set fn [open $floc a+]
puts $fn "Time (s), Pressure (mbar), Status"
close $fn
}
::scobj::hinitprops $tempobj
::scobj::set_required_props $scobj_hpath
if {[SplitReply [environment_simulation]]=="false"} {
$sct_controller poll ${scobj_hpath}/currentPressure
}
}
proc add_tpg261 {name IP port {filename "noFile"} {
if {[SplitReply [environment_simulation]]=="false"} {
makesctcontroller sct_tpg261_$name std ${IP}:$port "\r\n"
}
mk_sct_pfeiffer_tpg261 sct_tpg261_$name environment $name $filename
}
}
publish ::scobj::tpg261::add_tpg261 user
#::scobj::tpg261::add_tpg261 prgauge 137.157.202.78 4002
namespace import ::scobj::tpg261::*