Add some more read-only fields to the huber

This commit is contained in:
Douglas Clowes
2014-06-17 17:17:41 +10:00
parent 171342c97e
commit bcb28e68c1
2 changed files with 182 additions and 32 deletions

View File

@ -12,29 +12,69 @@ driver huber_pilot = {
type = float;
readable = 1;
mutable = true;
var sensor = {
read_command = '01';
permlink = 'T.S01';
}
var setpoint = {
read_command = '00';
read_function = rdTemp;
writeable = 1;
write_command = '00';
driveable = Loop1/sensor;
lowerlimit = 5.0; upperlimit = 30.0;
tolerance = 0.5; property settle_time = 10;
driveable = Loop1/sensor_int;
lowerlimit = 5.0; upperlimit = 30.0; tolerance = 0.5;
property settle_time = 10;
permlink = 'T.SP01';
}
var sensor_int = {
read_command = '01';
read_function = rdTemp;
permlink = 'T.S01';
}
var vTE = {
read_command = '07';
read_function = rdTemp;
permlink = 'T.S07';
}
var vTmpMode = {
type = int;
read_command = '13';
read_function = rdStatus;
}
var vTmpActive = {
type = int;
read_command = '14';
read_function = rdStatus;
}
var vMinSP = {
read_command = '30';
read_function = rdTemp;
}
var vMaxSP = {
read_command = '31';
read_function = rdTemp;
}
}
code getValue = {%%
set cmd "\{M${cmd_str}****"
%%}
code rdValue = {%%
code rdStatus = {%%
if {[string length ${data}] < 8} {
sct geterror "rdValue short response ${data}"
} elseif { ![string equal -nocase [string range ${data} 1 2] "S0"] } {
} elseif { ![string equal -nocase [string range ${data} 1 1] "S"] } {
sct geterror "rdValue syntax error ${data}"
} else {
set resp [scan [string range ${data} 4 end] "%x" val]
if { ${resp} < 1 } {
sct geterror "rdValue scan error ${data}"
} else {
set data ${val}
}
}
%%}
code rdTemp = {%%
if {[string length ${data}] < 8} {
sct geterror "rdValue short response ${data}"
} elseif { ![string equal -nocase [string range ${data} 1 1] "S"] } {
sct geterror "rdValue syntax error ${data}"
} else {
set resp [scan [string range ${data} 4 end] "%x" val]

View File

@ -164,9 +164,9 @@ proc ::scobj::huber_pilot::noResponse {tc_root} {
}
# function to parse the read of a parameter on a device
proc ::scobj::huber_pilot::rdValue {tc_root} {
proc ::scobj::huber_pilot::rdStatus {tc_root} {
set catch_status [ catch {
debug_log ${tc_root} 1 "rdValue tc_root=${tc_root} sct=[sct] result=[sct result]"
debug_log ${tc_root} 1 "rdStatus tc_root=${tc_root} sct=[sct] result=[sct result]"
if { [hpropexists [sct] geterror] } {
hdelprop [sct] geterror
}
@ -177,10 +177,53 @@ proc ::scobj::huber_pilot::rdValue {tc_root} {
sct geterror "${data}"
error "[sct geterror]"
}
# rdValue hook code starts
# rdStatus hook code starts
if {[string length ${data}] < 8} {
sct geterror "rdValue short response ${data}"
} elseif { ![string equal -nocase [string range ${data} 1 2] "S0"] } {
} elseif { ![string equal -nocase [string range ${data} 1 1] "S"] } {
sct geterror "rdValue syntax error ${data}"
} else {
set resp [scan [string range ${data} 4 end] "%x" val]
if { ${resp} < 1 } {
sct geterror "rdValue scan error ${data}"
} else {
set data ${val}
}
}
# rdStatus hook code ends
if { [hpropexists [sct] geterror] } {
debug_log ${tc_root} 9 "[sct] error: [sct geterror]"
error "[sct geterror]"
}
if { ${data} != [sct oldval] } {
debug_log ${tc_root} 1 "[sct] changed to new:${data}, from old:[sct oldval]"
sct oldval ${data}
sct update ${data}
sct utime readtime
}
return ${nextState}
} catch_message ]
handle_exception ${catch_status} ${catch_message}
}
# function to parse the read of a parameter on a device
proc ::scobj::huber_pilot::rdTemp {tc_root} {
set catch_status [ catch {
debug_log ${tc_root} 1 "rdTemp tc_root=${tc_root} sct=[sct] result=[sct result]"
if { [hpropexists [sct] geterror] } {
hdelprop [sct] geterror
}
set data [sct result]
set nextState "idle"
if {[string equal -nocase -length 7 ${data} "ASCERR:"]} {
# the protocol driver has reported an error
sct geterror "${data}"
error "[sct geterror]"
}
# rdTemp hook code starts
if {[string length ${data}] < 8} {
sct geterror "rdValue short response ${data}"
} elseif { ![string equal -nocase [string range ${data} 1 1] "S"] } {
sct geterror "rdValue syntax error ${data}"
} else {
set resp [scan [string range ${data} 4 end] "%x" val]
@ -196,7 +239,7 @@ proc ::scobj::huber_pilot::rdValue {tc_root} {
}
}
}
# rdValue hook code ends
# rdTemp hook code ends
if { [hpropexists [sct] geterror] } {
debug_log ${tc_root} 9 "[sct] error: [sct geterror]"
error "[sct geterror]"
@ -260,23 +303,23 @@ proc ::scobj::huber_pilot::mkDriver { sct_controller name } {
hfactory ${scobj_hpath}/Loop1 plain spy none
hfactory ${scobj_hpath}/Loop1/sensor plain user float
hsetprop ${scobj_hpath}/Loop1/sensor read ${ns}::getValue ${scobj_hpath} rdValue {01}
hsetprop ${scobj_hpath}/Loop1/sensor rdValue ${ns}::rdValue ${scobj_hpath}
hsetprop ${scobj_hpath}/Loop1/sensor control true
hsetprop ${scobj_hpath}/Loop1/sensor data true
hsetprop ${scobj_hpath}/Loop1/sensor mutable true
hsetprop ${scobj_hpath}/Loop1/sensor nxsave true
hsetprop ${scobj_hpath}/Loop1/sensor permlink data_set "T${permlink_device_number}S01"
hsetprop ${scobj_hpath}/Loop1/sensor @description "T${permlink_device_number}S01"
hsetprop ${scobj_hpath}/Loop1/sensor oldval 0.0
hsetprop ${scobj_hpath}/Loop1/sensor sdsinfo "::nexus::scobj::sdsinfo"
hsetprop ${scobj_hpath}/Loop1/sensor type "part"
hsetprop ${scobj_hpath}/Loop1/sensor nxalias "${name}_Loop1_sensor"
hfactory ${scobj_hpath}/Loop1/sensor_int plain user float
hsetprop ${scobj_hpath}/Loop1/sensor_int read ${ns}::getValue ${scobj_hpath} rdTemp {01}
hsetprop ${scobj_hpath}/Loop1/sensor_int rdTemp ${ns}::rdTemp ${scobj_hpath}
hsetprop ${scobj_hpath}/Loop1/sensor_int control true
hsetprop ${scobj_hpath}/Loop1/sensor_int data true
hsetprop ${scobj_hpath}/Loop1/sensor_int mutable true
hsetprop ${scobj_hpath}/Loop1/sensor_int nxsave true
hsetprop ${scobj_hpath}/Loop1/sensor_int permlink data_set "T${permlink_device_number}S01"
hsetprop ${scobj_hpath}/Loop1/sensor_int @description "T${permlink_device_number}S01"
hsetprop ${scobj_hpath}/Loop1/sensor_int oldval 0.0
hsetprop ${scobj_hpath}/Loop1/sensor_int sdsinfo "::nexus::scobj::sdsinfo"
hsetprop ${scobj_hpath}/Loop1/sensor_int type "part"
hsetprop ${scobj_hpath}/Loop1/sensor_int nxalias "${name}_Loop1_sensor_int"
hfactory ${scobj_hpath}/Loop1/setpoint plain user float
hsetprop ${scobj_hpath}/Loop1/setpoint read ${ns}::getValue ${scobj_hpath} rdValue {00}
hsetprop ${scobj_hpath}/Loop1/setpoint rdValue ${ns}::rdValue ${scobj_hpath}
hsetprop ${scobj_hpath}/Loop1/setpoint read ${ns}::getValue ${scobj_hpath} rdTemp {00}
hsetprop ${scobj_hpath}/Loop1/setpoint rdTemp ${ns}::rdTemp ${scobj_hpath}
hsetprop ${scobj_hpath}/Loop1/setpoint write ${ns}::setValue ${scobj_hpath} noResponse {00}
hsetprop ${scobj_hpath}/Loop1/setpoint noResponse ${ns}::noResponse ${scobj_hpath}
hsetprop ${scobj_hpath}/Loop1/setpoint check ${ns}::checkrange ${scobj_hpath}
@ -284,7 +327,7 @@ proc ::scobj::huber_pilot::mkDriver { sct_controller name } {
hsetprop ${scobj_hpath}/Loop1/setpoint checklimits ${ns}::checklimits ${scobj_hpath}
hsetprop ${scobj_hpath}/Loop1/setpoint checkstatus ${ns}::checkstatus ${scobj_hpath}
hsetprop ${scobj_hpath}/Loop1/setpoint halt ${ns}::halt ${scobj_hpath}
hsetprop ${scobj_hpath}/Loop1/setpoint driveable Loop1/sensor
hsetprop ${scobj_hpath}/Loop1/setpoint driveable Loop1/sensor_int
hsetprop ${scobj_hpath}/Loop1/setpoint control true
hsetprop ${scobj_hpath}/Loop1/setpoint data true
hsetprop ${scobj_hpath}/Loop1/setpoint mutable true
@ -300,11 +343,78 @@ proc ::scobj::huber_pilot::mkDriver { sct_controller name } {
hsetprop ${scobj_hpath}/Loop1/setpoint type "drivable"
hsetprop ${scobj_hpath}/Loop1/setpoint nxalias "${name}_Loop1_setpoint"
hfactory ${scobj_hpath}/Loop1/vMaxSP plain user float
hsetprop ${scobj_hpath}/Loop1/vMaxSP read ${ns}::getValue ${scobj_hpath} rdTemp {31}
hsetprop ${scobj_hpath}/Loop1/vMaxSP rdTemp ${ns}::rdTemp ${scobj_hpath}
hsetprop ${scobj_hpath}/Loop1/vMaxSP control true
hsetprop ${scobj_hpath}/Loop1/vMaxSP data true
hsetprop ${scobj_hpath}/Loop1/vMaxSP mutable true
hsetprop ${scobj_hpath}/Loop1/vMaxSP nxsave true
hsetprop ${scobj_hpath}/Loop1/vMaxSP oldval 0.0
hsetprop ${scobj_hpath}/Loop1/vMaxSP sdsinfo "::nexus::scobj::sdsinfo"
hsetprop ${scobj_hpath}/Loop1/vMaxSP type "part"
hsetprop ${scobj_hpath}/Loop1/vMaxSP nxalias "${name}_Loop1_vMaxSP"
hfactory ${scobj_hpath}/Loop1/vMinSP plain user float
hsetprop ${scobj_hpath}/Loop1/vMinSP read ${ns}::getValue ${scobj_hpath} rdTemp {30}
hsetprop ${scobj_hpath}/Loop1/vMinSP rdTemp ${ns}::rdTemp ${scobj_hpath}
hsetprop ${scobj_hpath}/Loop1/vMinSP control true
hsetprop ${scobj_hpath}/Loop1/vMinSP data true
hsetprop ${scobj_hpath}/Loop1/vMinSP mutable true
hsetprop ${scobj_hpath}/Loop1/vMinSP nxsave true
hsetprop ${scobj_hpath}/Loop1/vMinSP oldval 0.0
hsetprop ${scobj_hpath}/Loop1/vMinSP sdsinfo "::nexus::scobj::sdsinfo"
hsetprop ${scobj_hpath}/Loop1/vMinSP type "part"
hsetprop ${scobj_hpath}/Loop1/vMinSP nxalias "${name}_Loop1_vMinSP"
hfactory ${scobj_hpath}/Loop1/vTE plain user float
hsetprop ${scobj_hpath}/Loop1/vTE read ${ns}::getValue ${scobj_hpath} rdTemp {07}
hsetprop ${scobj_hpath}/Loop1/vTE rdTemp ${ns}::rdTemp ${scobj_hpath}
hsetprop ${scobj_hpath}/Loop1/vTE control true
hsetprop ${scobj_hpath}/Loop1/vTE data true
hsetprop ${scobj_hpath}/Loop1/vTE mutable true
hsetprop ${scobj_hpath}/Loop1/vTE nxsave true
hsetprop ${scobj_hpath}/Loop1/vTE permlink data_set "T${permlink_device_number}S07"
hsetprop ${scobj_hpath}/Loop1/vTE @description "T${permlink_device_number}S07"
hsetprop ${scobj_hpath}/Loop1/vTE oldval 0.0
hsetprop ${scobj_hpath}/Loop1/vTE sdsinfo "::nexus::scobj::sdsinfo"
hsetprop ${scobj_hpath}/Loop1/vTE type "part"
hsetprop ${scobj_hpath}/Loop1/vTE nxalias "${name}_Loop1_vTE"
hfactory ${scobj_hpath}/Loop1/vTmpActive plain user int
hsetprop ${scobj_hpath}/Loop1/vTmpActive read ${ns}::getValue ${scobj_hpath} rdStatus {14}
hsetprop ${scobj_hpath}/Loop1/vTmpActive rdStatus ${ns}::rdStatus ${scobj_hpath}
hsetprop ${scobj_hpath}/Loop1/vTmpActive control true
hsetprop ${scobj_hpath}/Loop1/vTmpActive data true
hsetprop ${scobj_hpath}/Loop1/vTmpActive mutable true
hsetprop ${scobj_hpath}/Loop1/vTmpActive nxsave true
hsetprop ${scobj_hpath}/Loop1/vTmpActive oldval 0
hsetprop ${scobj_hpath}/Loop1/vTmpActive sdsinfo "::nexus::scobj::sdsinfo"
hsetprop ${scobj_hpath}/Loop1/vTmpActive type "part"
hsetprop ${scobj_hpath}/Loop1/vTmpActive nxalias "${name}_Loop1_vTmpActive"
hfactory ${scobj_hpath}/Loop1/vTmpMode plain user int
hsetprop ${scobj_hpath}/Loop1/vTmpMode read ${ns}::getValue ${scobj_hpath} rdStatus {13}
hsetprop ${scobj_hpath}/Loop1/vTmpMode rdStatus ${ns}::rdStatus ${scobj_hpath}
hsetprop ${scobj_hpath}/Loop1/vTmpMode control true
hsetprop ${scobj_hpath}/Loop1/vTmpMode data true
hsetprop ${scobj_hpath}/Loop1/vTmpMode mutable true
hsetprop ${scobj_hpath}/Loop1/vTmpMode nxsave true
hsetprop ${scobj_hpath}/Loop1/vTmpMode oldval 0
hsetprop ${scobj_hpath}/Loop1/vTmpMode sdsinfo "::nexus::scobj::sdsinfo"
hsetprop ${scobj_hpath}/Loop1/vTmpMode type "part"
hsetprop ${scobj_hpath}/Loop1/vTmpMode nxalias "${name}_Loop1_vTmpMode"
if {[string equal -nocase [SplitReply [environment_simulation]] "false"]} {
${sct_controller} poll ${scobj_hpath}/Loop1/sensor 1
${sct_controller} poll ${scobj_hpath}/Loop1/sensor_int 1
${sct_controller} poll ${scobj_hpath}/Loop1/setpoint 1
${sct_controller} poll ${scobj_hpath}/Loop1/vMaxSP 1
${sct_controller} poll ${scobj_hpath}/Loop1/vMinSP 1
${sct_controller} poll ${scobj_hpath}/Loop1/vTE 1
${sct_controller} poll ${scobj_hpath}/Loop1/vTmpActive 1
${sct_controller} poll ${scobj_hpath}/Loop1/vTmpMode 1
${sct_controller} write ${scobj_hpath}/Loop1/setpoint
ansto_makesctdrive ${name}_Loop1_setpoint ${scobj_hpath}/Loop1/setpoint ${scobj_hpath}/Loop1/sensor ${sct_controller}
ansto_makesctdrive ${name}_Loop1_setpoint ${scobj_hpath}/Loop1/setpoint ${scobj_hpath}/Loop1/sensor_int ${sct_controller}
} else {
::scobj::huber_pilot::sics_log 9 "[environment_simulation] => No poll/write for huber_pilot"
}