From 7453eb2458d73e4f79808205021493ba4fc99c4c Mon Sep 17 00:00:00 2001 From: Jing Chen Date: Mon, 23 Jul 2012 13:42:05 +1000 Subject: [PATCH] add new protocl controller for ag1010 r3674 | jgn | 2012-07-23 13:42:05 +1000 (Mon, 23 Jul 2012) | 1 line --- .../pelican/config/beamline/sct_power.tcl | 774 ++++++++++++++++++ 1 file changed, 774 insertions(+) create mode 100644 site_ansto/instrument/pelican/config/beamline/sct_power.tcl diff --git a/site_ansto/instrument/pelican/config/beamline/sct_power.tcl b/site_ansto/instrument/pelican/config/beamline/sct_power.tcl new file mode 100644 index 00000000..1f42c272 --- /dev/null +++ b/site_ansto/instrument/pelican/config/beamline/sct_power.tcl @@ -0,0 +1,774 @@ + +# Define procs in ::scobj::xxx namespace +# MakeSICSObj $obj SCT_ +# The MakeSICSObj cmd adds a /sics/$obj node. NOTE the /sics node is not browsable. + +## +# /*-------------------------------------------------------------------------- +# LF Amplifier/Generator Model AG 1010 Driver +# +# @file: This file contains the implementation of a driver for the AG 1010 +# LF Amplifier/Generator +# +# @author: Jing Chen, ANSTO, 2012-06-26 +# @brief: SICS driver for LF AG 1010 LF Amplifier/Generator +# +# ----------------------------------------------------------------------------*/ + +# Default AG1010 LF Amplifier/Generator Controller parameters +namespace eval ::scobj::ag1010 { + + variable CtrlSetLIMITS [format %02x 2] + variable CtrlSetPAGC [format %02x 3] + variable CtrlSetPMGC [format %02x 4] + variable CtrlSetFREQ [format %02x 5] + variable CtrlSetSKEY [format %02x 7] + variable CtrlSetBurstPar [format %02x 8] + variable CtrlSetSweepPar [format %02x 9] + + variable CtrlGetLIMITS [format %02x 17] + variable CtrlGetPAGC [format %02x 19] + variable CtrlGetPMGC [format %02x 20] + variable CtrlGetFREQ [format %02x 21] + variable CtrlGetSKEY [format %02x 23] + variable CtrlGetBurstPar [format %02x 24] + variable CtrlGetSweepPar [format %02x 25] + variable CtrlGetSVER [format %02x 29] + variable CtrlGetMEAS [format %02x 30] + variable CtrlGetSTA [format %02x 31] + + variable CtrlShowLIMITS [format %02x 2] + variable CtrlShowPAGC [format %02x 3] + variable CtrlShowPMGC [format %02x 4] + variable CtrlShowFREQ [format %02x 5] + variable CtrlShowSKEY [format %02x 7] + variable CtrlShowBurstPar [format %02x 8] + variable CtrlShowSweepPar [format %02x 9] + variable CtrlShowSVER [format %02x 13] + variable CtrlShowMEAS [format %02x 14] + variable CtrlShowSTA [format %02x 15] + + variable CtrlREJ [format %02x 42] +} + + +############# Reading polled nodes ####################################################### +## +# @brief Sends a query command to the device via a read node formalism +# @param tc_root The path to the root of the node +# @param nextState The next function to call after this one (typically 'rdValue' +# to read the response from the device) +# @param rdPara data to be sent to the device +# @return nextState The next function to call after this one (typically 'rdValue') + +proc ::scobj::ag1010::getValue {tc_root nextState rdPara} { + if {[ catch { + set HEAD 96 + set LEN [lindex $rdPara 0] + set CTRL [lindex $rdPara 1] + set DATA 0 + set CRC 0 + + if {$LEN < 2} { + return -code error "Error in getValue: wrong data length provided." + } elseif {$LEN > 2} { + set cmd [format %02s%02x%02x%02x%02x $HEAD $LEN $CTRL $DATA $CRC] + } else { + set cmd [format %02s%02x%02x%02x $HEAD $LEN $CTRL $CRC] + } + sct send "$cmd" + } message ]} { + return -code error "Error in getValue: $message." + } + return $nextState +} + +################## Writing to nodes ######################################################## +## +# @brief Writes a new value to a node and sends the corresponding command to the device. +# @param tc_root string variable holding the path to the object's base node in sics +# @param nextState the next function to call after this one +# @param wrPara indicates which control loop or which input channel the command belongs to +# @return nextState Is typically noResponse as the device does not acknowledge the write request + +proc ::scobj::ag1010::setValue {tc_root nextState rdPara wrPara} { + # tc_root and idx are not being used - however, don't remove so we can use the + # same calling mask as for setPoint() or other $wrFunc + + #set ns /sics/ag1010 + set ns [sct] + if {[ catch { + set HEAD 96 + set LEN [lindex $rdPara 0] + set CTRL [lindex $rdPara 1] + set CRC 0 + + set newPara [string trim [sct target] " "] + switch -exact $wrPara { + "FPL" { set RPL [hval $ns/limits/ReversePower] + set data [format %04x%04x%04x%04x $newPara $RPL 0 0] + } + "RPL" { set FPL [hval $ns/limits/ForwardPower] + set data [format %04x%04x%04x%04x $FPL $newPara 0 0] + } + "PAGC" { set data [format %04x $newPara] } + "PMGC" { set data [format %04x $newPara] } + "FREQ" { set Freq [expr $newPara / 1000] + set FreqHz [expr $newPara % 1000] + set data [format %04x%04x $Freq $FreqHz] + } + "SoftOn" { set data 0x00 + if {$newPara == 1} { + set data [expr $data | 0x80] + } elseif {$newPara != 0} { + return -code error "Error in setValue: only allowed input values for SoftKey are {0,1}." + } + if {[string match -nocase "on" [hval $ns/SKEY/Key1]} { + set data [expr $data | 0x08] + } + if {[string match -nocase "on" [hval $ns/SKEY/Key0]} { + set data [expr $data | 0x04] + } + if {[string match -nocase "on" [hval $ns/SKEY/Key2]} { + set data [expr $data | 0x02] + } + if {[string match -nocase "on" [hval $ns/SKEY/Key3]} { + set data [expr $data | 0x01] + } + } + "Key1" { set data 0x00 + if {$newPara == 1} { + set data [expr $data | 0x08] + } elseif {$newPara != 0} { + return -code error "Error in setValue: only allowed input values for Key1 are {0,1}." + } + if {[string match -nocase "on" [hval $ns/SKEY/SoftOn]} { + set data [expr $data | 0x80] + } + if {[string match -nocase "on" [hval $ns/SKEY/Key0]} { + set data [expr $data | 0x04] + } + if {[string match -nocase "on" [hval $ns/SKEY/Key2]} { + set data [expr $data | 0x02] + } + if {[string match -nocase "on" [hval $ns/SKEY/Key3]} { + set data [expr $data | 0x01] + } + } + "Key0" { set data 0x00 + if {$newPara == 1} { + set data [expr $data | 0x04] + } elseif {$newPara != 0} { + return -code error "Error in setValue: only allowed input values for Key0 are {0,1}." + } + if {[string match -nocase "on" [hval $ns/SKEY/SoftOn]} { + set data [expr $data | 0x80] + } + if {[string match -nocase "on" [hval $ns/SKEY/Key1]} { + set data [expr $data | 0x08] + } + if {[string match -nocase "on" [hval $ns/SKEY/Key2]} { + set data [expr $data | 0x02] + } + if {[string match -nocase "on" [hval $ns/SKEY/Key3]} { + set data [expr $data | 0x01] + } + } + "Key2" { set data 0x00 + if {$newPara == 1} { + set data [expr $data | 0x02] + } elseif {$newPara != 0} { + return -code error "Error in setValue: only allowed input values for Key2 are {0,1}." + } + if {[string match -nocase "on" [hval $ns/SKEY/SoftOn]} { + set data [expr $data | 0x80] + } + if {[string match -nocase "on" [hval $ns/SKEY/Key1]} { + set data [expr $data | 0x08] + } + if {[string match -nocase "on" [hval $ns/SKEY/Key0]} { + set data [expr $data | 0x04] + } + if {[string match -nocase "on" [hval $ns/SKEY/Key3]} { + set data [expr $data | 0x01] + } + } + "Key3" { set data 0x00 + if {$newPara == 1} { + set data [expr $data | 0x01] + } elseif {$newPara != 0} { + return -code error "Error in setValue: only allowed input values for Key3 are {0,1}." + } + if {[string match -nocase "on" [hval $ns/SKEY/SoftOn]} { + set data [expr $data | 0x80] + } + if {[string match -nocase "on" [hval $ns/SKEY/Key1]} { + set data [expr $data | 0x08] + } + if {[string match -nocase "on" [hval $ns/SKEY/Key0]} { + set data [expr $data | 0x04] + } + if {[string match -nocase "on" [hval $ns/SKEY/Key2]} { + set data [expr $data | 0x02] + } + } + "BurstMode" { if {$newPara<0 || $newPara>3} { + return -code error "Error in setValue: only allowed input values for BurstMode are {0,1,2,3}" + } else { + set BurstMode $newPara + } + set BRepTime [hval $ns/BurstPar/BRepTime] + set TimeOfPower [hval $ns/BurstPar/TimeOfPower] + set data [format %02x%04x%04x $BurstMode $BRepTime $TimeOfPower] + } + "BRepTime" { set BurstMode [hval $ns/BurstPar/BurstMode] + if {[string equal $BurstMode "OFF"]} { + set BurstMode 0 + } elseif {[string equal $BurstMode "Internal Mode ON"} { + set BurstMode 1 + } elseif {[string match "Without Changing" $BurstMode]} { + set BurstMode 2 + } elseif {[string match "External Burst" $BurstMode]} { + } else { + return -code error "Error in setValue: reading invaild BurstMode value." + } + set TimeOfPower [hval $ns/BurstPar/TimeOfPower] + set data [format %02x%04x%04x $BurstMode $newPara $TimeOfPower] + } + "BTofP" { set BurstMode [hval $ns/BurstPar/BurstMode] + if {[string equal $BurstMode "OFF"]} { + set BurstMode 0 + } elseif {[string equal $BurstMode "Internal Mode ON"} { + set BurstMode 1 + } elseif {[string match "Without Changing" $BurstMode]} { + set BurstMode 2 + } elseif {[string match "External Burst" $BurstMode]} { + } else { + return -code error "Error in setValue: reading invaild BurstMode value." + } + set BRepTime [hval $ns/BurstPar/BRepTime] + set data [format %02x%04x%04x $BurstMode $BRepTime $newPara] + } + "SweepMode" { if {$newPara<0 || $newPara>2} { + return -code error "Error in setValue: only allowed input values for SweepMode are {0,1,2}" + } else { + set SweepMode $newPara + } + set SStr [expr [hval $ns/SweepPar/StartFreq] / 1000] + set SStrHz [expr [hval $ns/SweepPar/StartFreq] % 1000] + set SStp [expr [hval $ns/SweepPar/StepFreq] / 1000] + set SStpHz [expr [hval $ns/SweepPar/StepFreq] % 1000] + set SCyc [hval $ns/SweepPar/SCyc] + set data [format %02x%02x%02x%02x%02x%02x $SweepMode $SStr $SStp $SCyc $SStrHz $SStpHz] + } + "SStrF" { set SweepMode [hval $ns/SweepPar/SweepMode] + if {[string equal $SweepMode "OFF"]} { + set SweepMode 0 + } elseif {[string equal $SweepMode "ON"} { + set SweepMode 1 + } elseif {[string match "Without Changing" $SweepMode]} { + set SweepMode 2 + } else { + return -code error "Error in setValue: reading invaild SweepMode value." + } + set SStr [expr $newPara / 1000] + set SStrHz [expr $newPara % 1000] + set SStp [expr [hval $ns/SweepPar/StepFreq] / 1000] + set SStpHz [expr [hval $ns/SweepPar/StepFreq] % 1000] + set SCyc [hval $ns/SweepPar/SCyc] + set data [format %02x%02x%02x%02x%02x%02x $SweepMode $SStr $SStp $SCyc $SStrHz $SStpHz] + } + "SSteF" { set SweepMode [hval $ns/SweepPar/SweepMode] + if {[string equal $SweepMode "OFF"]} { + set SweepMode 0 + } elseif {[string equal $SweepMode "ON"} { + set SweepMode 1 + } elseif {[string match "Without Changing" $SweepMode]} { + set SweepMode 2 + } else { + return -code error "Error in setValue: reading invaild SweepMode value." + } + set SStr [expr [hval $ns/SweepPar/StartFreq] / 1000] + set SStrHz [expr [hval $ns/SweepPar/StartFreq] % 1000] + set SStp [expr $newPara / 1000] + set SStpHz [expr $newPara % 1000] + set SCyc [hval $ns/SweepPar/SCyc] + set data [format %02x%02x%02x%02x%02x%02x $SweepMode $SStr $SStp $SCyc $SStrHz $SStpHz] + } + "SSCyc" { set SweepMode [hval $ns/SweepPar/SweepMode] + if {[string equal $SweepMode "OFF"]} { + set SweepMode 0 + } elseif {[string equal $SweepMode "ON"} { + set SweepMode 1 + } elseif {[string match "Without Changing" $SweepMode]} { + set SweepMode 2 + } else { + return -code error "Error in setValue: reading invaild SweepMode value." + } + set SStr [expr [hval $ns/SweepPar/StartFreq] / 1000] + set SStrHz [expr [hval $ns/SweepPar/StartFreq] % 1000] + set SStp [expr [hval $ns/SweepPar/StepFreq] / 1000] + set SStpHz [expr [hval $ns/SweepPar/StepFreq] % 1000] + set SCyc $newPara + set data [format %02x%02x%02x%02x%02x%02x $SweepMode $SStr $SStp $SCyc $SStrHz $SStpHz] + } + default { return -code error "in setValue: Wrong setting field." } + } + set cmd [format %02s%02x%02x%s%02x $HEAD $LEN $CTRL $data $CRC] + sct send "$cmd" + } message ]} { + return -code error "Error in setValue: $message. While sending command" + } + return $nextState +} + + +## +# @brief Reads the value of a read-node typically following a query command sent to the device +# rdValue is the default nextState for getValue() and setValue() +# @param idx indicates which control loop or which input channel the command belongs to +# @return idle Always returns system state idle - command sequence completed. + +proc ::scobj::ag1010::rdValue {} { + + variable CtrlShowLIMITS + variable CtrlShowPAGC + variable CtrlShowPMGC + variable CtrlShowFREQ + variable CtrlShowSKEY + variable CtrlShowBurstPar + variable CtrlShowSweepPar + variable CtrlShowSVER + variable CtrlShowMEAS + variable CtrlShowSTA + variable CtrlREJ + + #set ns /sics/ag1010 + set ns [sct] + if {[ catch { + set data [string trim [sct result] " "] + broadcast "Reading data in rdValue: $data" + set ctrlCode [string range $data 4 5] + + switch -glob $ctrlCode { + + $CtrlREJ { return -code error "Error in rdValue()" + } + $CtrlShowLIMITS { set FPLH [string range $data 6 7] + set FPLL [string range $data 8 9] + set RPLH [string range $data 10 11] + set RPLL [string range $data 12 13] + + set $ns/limits/ForwardPower [expr 0x$FPLH$FPLL] + set $ns/limits/ReversePower [expr 0x$RPLH$RPLL] + } + $CtrlShowPAGC { set AGCPoH [string range $data 6 7] + set AGCPoL [string range $data 8 9] + + set $ns/PAGC [expr 0x$AGCPoH$AGCPoL] + } + $CtrlShowPMGC { set MGCPoH [string range $data 6 7] + set MGCPoL [string range $data 8 9] + + set $ns/PMGC [expr 0x$MGCPoH$MGCPoL] + } + $CtrlShowFREQ { set FreqH [string range $data 6 7] + set FreqL [string range $data 8 9] + set FreqHzH [string range $data 10 11] + set FreqHzL [string range $data 12 13] + + set Freq [expr 0x$FreqH$FreqL] + set FreqHz [expr 0x$FreqHzH$FreqHzL] + set $ns/FREQ [expr $Freq * 1000 + $FreqHz] + } + $CtrlShowSKEY { set softKey 0x[string range $data 6 7] + if {[expr $softKey & 0x80] == 0} { + set $ns/SKEY/SoftOn "Off" + } else { + set $ns/SKEY/SoftOn "On" + } + if {[expr $softKey & 0x08] == 0} { + set $ns/SKEY/Key0 "Off" + } else { + set $ns/SKEY/Key0 "On" + } + if {[expr $softKey & 0x04] == 0} { + set $ns/SKEY/Key1 "Off" + } else { + set $ns/SKEY/Key1 "On" + } + if {[expr $softKey & 0x02] == 0} { + set $ns/SKEY/Key2 "Off" + } else { + set $ns/SKEY/Key2 "On" + } + if {[expr $softKey & 0x01] == 0} { + set $ns/SKEY/Key3 "Off" + } else { + set $ns/SKEY/Key3 "On" + } + } + $CtrlShowBurstPar { set SCode [expr 0x[string range $data 6 7]] + if {SCode == 0} { + set $ns/BurstPar/BurstMode "OFF" + } elseif {SCode == 1} { + set $ns/BurstPar/BurstMode "Internal Mode ON" + } elseif {SCode == 2} { + set $ns/BurstPar/BurstMode "Change Burst Parameters Without Changing Burst On/Off" + } elseif {SCode == 3} { + set $ns/BurstPar/BurstMode "External Burst Mode Enable" + } + + set BRepTH [string range $data 8 9] + set BRepTL [string range $data 10 11] + set $ns/BurstPar/BRepTime [expr 0x$BRepTH$BRepTL] + + set BOnTH [string range $data 12 13] + set BOnTL [string range $data 14 15] + set $ns/BurstPar/TimeOfPower [expr 0x$BOnTH$BOnTL] + } + $CtrlShowSweepPar { set SCode [expr 0x[string range $data 6 7]] + if {SCode == 0} { + set $ns/SweepPar/SweepMode "OFF" + } elseif {SCode == 1} { + set $ns/SweepPar/SweepMode "ON" + } elseif {SCode == 2} { + set $ns/SweepPar/SweepMode "Change Sweep Parameters Without Changing Sweep On/Off" + } + + set SStr [expr [string range $data 8 9]] + set SStrHz [expr [string range $data 14 15]] + set $ns/SweepPar/StartFreq [expr $SStr * 1000 + $SStrHz] + + set SStp [expr [string range $data 10 11]] + set SStpHz [expr [string range $data 16 17]] + set $ns/SweepPar/StepFreq [expr $SStp * 1000 + $SStpHz] + + set SCyc [expr [string range $data 12 13]] + set $ns/SweepPar/SCyc $SCyc + } + $CtrlShowSVER { set SNH [string range $data 6 7] + set SNL [string range $data 8 9] + set $ns/SVER/SN "$SNH$SNL" + + set SVerH [string range $data 10 11] + set SVerL [string range $data 12 13] + set $ns/SVER/SWVersion "$SVerH$SVerL" + + set DVerH [string range $data 14 15] + set DVerL [string range $data 16 17] + set $ns/SVER/DeviceVersion "$DVerH$DVerL" + } + $CtrlShowMEAS { set FPH [string range $data 6 7] + set FPL [string range $data 8 9] + 0t $ns/MEAS/ForwardPower [expr 0x$FPH$FPL] + + set RPH [string range $data 10 11] + set RPL [string range $data 12 13] + set $ns/MEAS/ReversePower [expr 0x$RPH$RPL] + + set TPH [string range $data 18 19] + set TPL [string range $data 20 21] + set $ns/MEAS/Temperature [expr 0x$TPH$TPL] + } + $CtrlShowSTA { set MainState [expr 0x[string range $data 6 7]] + switch $MainState { + "0" {set $ns/STA/MainState "Initialization"} + "1" {set $ns/STA/MainState "Controller is in safe loop"} + "2" {set $ns/STA/MainState "Controller is waiting for RFPowerOn Request in LocalMode"} + "3" {set $ns/STA/MainState "Controller is waiting for confirm of RFPowerOn in LocalMode"} + "4" {set $ns/STA/MainState "Controller is in main loop of the LocalMode"} + "5" {set $ns/STA/MainState "Controller is waiting for RFPowerOn Request in RemoteMode"} + "6" {set $ns/STA/MainState "Controller is waiting for confirm of RFPowerOn in RemoteMode"} + "7" {set $ns/STA/MainState "Controller is in main loop of the RemoteMode"} + } + + set state [string range $data 8 9] + if {[expr $state & 0x80] != 0} { + set $ns/STA/State/FstRemote "RemoteMode" + } else { + set $ns/STA/State/FstRemote "LocalMode" + } + if {[expr $state & 0x40] != 0} { + set $ns/STA/State/FStExtBurst "External Burst mode ON" + } else { + set $ns/STA/State/FStExtBurst "External Burst mode OFF" + } + if {[expr $state & 0x20] != 0} { + set $ns/STA/State/FStRFError "RFError Detected" + } else { + set $ns/STA/State/FStRFError "RFError Not Detected" + } + if {[expr $state & 0x10] != 0} { + set $ns/STA/State/FStSafetyLP "Error of the Safety Loop Detected" + } else { + set $ns/STA/State/FStSafetyLP "Error of the Safety Loop Not Detected" + } + if {[expr $state & 0x04] != 0} { + set $ns/STA/State/FStExceedRP "Limited of the ReversePower Detected" + } else { + set $ns/STA/State/FStExceedRP "Limited of the ReversePower Not Detected" + } + if {[expr $state & 0x02] != 0} { + set $ns/STA/State/FStExceedFP "Limited of the ForwardPower Detected" + } else { + set $ns/STA/State/FStExceedFP "Limited of the ForwardPower Not Detected" + } + if {[expr $state & 0x01] != 0} { + set $ns/STA/State/FStExceedTmp "Temperature Error Detected" + } else { + set $ns/STA/State/FStExceedTmp "Temperature Error Not Detected" + } + + set KeyState [string range $data 10 11] + if {[expr $KeyState & 0x80] != 0} { + set $ns/STA/keyState/SoftOn "Host takes over the keyboard of controller" + } else { + set $ns/STA/keyState/SoftOn "Controller takes over the keyboard of controller" + } + if {[expr $KeyState & 0x08] != 0} { + set $ns/STA/keyState/Key1 "On" + } else { + set $ns/STA/keyState/Key1 "Off" + } + if {[expr $KeyState & 0x04] != 0} { + set $ns/STA/keyState/Key0 "On" + } else { + set $ns/STA/keyState/Key0 "Off" + } + if {[expr $KeyState & 0x02] != 0} { + set $ns/STA/keyState/Key2 "On" + } else { + set $ns/STA/keyState/Key2 "Off" + } + if {[expr $KeyState & 0x01] != 0} { + set $ns/STA/keyState/Key3 "On" + } else { + set $ns/STA/keyState/Key3 "Off" + } + } + default { return -code error "Unexpected returned values from the device in rdValue()" } + } + } message ]} { + return -code error "Error in rdValue: $message." + } + return idle +} + + +# function names provided +# @param scobj_hpath string variable holding the path to the object's base node in sics (/sample/tc1) +# @param sct_controller name of the ag1010 scriptcontext object (typically sct_ag1010) +# @param cmdGroup subdirectory (below /sample/tc*/) in which the node is to be created +# @param varName name of the actual node typically representing one device command +# @param readable set to 1 if the node represents a query command, 0 if it is not +# @param writable set to 1 if the node represents a request for a change in settings sent to the device +# @param pollEnabled set to 1 if the node property pollable is to be enabled (node gets read every 5 secs) +# @param dataType data type of the node, must be one of none, int, float, text +# @param unit data units, e.g. m, cm, mm, degree, Hz, W, dW and etc +# @param permission defines what user group may read/write to this node (is one of spy, user, manager) +# @param rdPara actual device query command to be sent to the device +# @param rdFunc nextState Function to be called after the getValue function, typically rdValue() +# Praparam wrPara actual device write command to be sent to the device +# @param wrFunc Function to be called to send the wrPara to the device, typically setValue() +# @param allowedValues allowed values for the node data - does not permit other +# @return OK +proc createNode {scobj_hpath sct_controller cmdGroup varName readable writable pollEnabled displayable \ + dataType unit permission rdPara rdFunc wrPara allowedValues} { + # It is a command that is supported by the device + if { [catch { + set parentnode "ag1010" + set ns ::scobj::$parentnode + set basepath $scobj_hpath/$parentnode + if {2 < [string length $cmdGroup]} { + set nodeName "$basepath/$cmdGroup/$varName" + } else { + set nodeName "$basepath/$varName" + } + hfactory $nodeName plain $permission $dataType + switch $dataType { + "none" {hset $nodeName none} + "text" {hset $nodeName UNKNOWN} + "int" {hset $nodeName 0} + "float" {hset $nodeName 0.0} + default {hset $nodeName UNKNOWN} + } + if {$readable == 1} { + hsetprop $nodeName read ${ns}::getValue $scobj_hpath $rdFunc $rdPara + hsetprop $nodeName $rdFunc ${ns}::$rdFunc + if {$pollEnabled == 1} { + #if {[SplitReply [environment_simulation]]=="false"} { + $sct_controller poll $nodeName + #} + } + } + if {$writable == 1} { + hsetprop $nodeName write ${ns}::setValue $scobj_hpath $rdFunc $rdPara $wrPara + hsetprop $nodeName $rdFunc ${ns}::$rdFunc + if {$pollEnabled == 1} { + #if {[SplitReply [environment_simulation]]=="false"} { + $sct_controller write $nodeName + #} + } + } + if {1 < [string length $unit]} { + hsetprop $nodeName units $unit + } + if {1 < [string length $allowedValues]} { + hsetprop $nodeName values $allowedValues + } + if {$displayable == 1} { + if {2 < [string length $cmdGroup]} { + ::scobj::hinitprops $parentnode $cmdGroup/$varName + } else { + ::scobj::hinitprops $parentnode $varName + } + } + } message ]} { + return -code error "Error in createNode $message" + } + return OK +} + + +## +# @brief mkAG creates a scriptcontext object for T&C AG1010 Amplifier/generator +# #para argList configurable parameters from function call +# @return nothing (well, the sct object) + +proc ::scobj::ag1010::mkAG {argList} { + if {[catch { + + # Generate parameter array from the argument list + foreach {k v} $argList { + set KEY [string toupper $k] + set pa($KEY) $v + } + + MakeSICSObj $pa(NAME) SCT_OBJECT + sicslist setatt $pa(NAME) klass instrument + sicslist setatt $pa(NAME) long_name $pa(NAME) + + # Create a base node for all the state machines of this sics object + #set scobj_hpath /sics/$pa(NAME) + set scobj_hpath /sics + + #makesctcontroller sct_ag1010 rfamp $pa(IP):$pa(PORT) + makesctcontroller sct_$pa(NAME) lfgen $pa(IP):$pa(PORT) + + # Create state machines for the following device commands + # Note that drivable nodes require the index of the control loop in their call to halt() + # Nodes appear in gumtree in the order in which they are created here. + # + # Initialise the model-dependent list of supported device commands + # RdWrPlDrIdx + # cmdGroup subdirectory in which the node is to be created, "P" means under top-parent node + # varName name of the actual node typically representing one device command + # readable set to 1 if the node represents a query command, 0 if it is not + # writable set to 1 if the node represents a request for a change in settings sent to the device + # pollEnabled set to 1 if the node property pollable is to be enabled (node gets read every 5 secs) + # displayable set to 1 if the node to be displayed on Gumtree GUI, 0 if it is not + # dataType data type of the node, must be one of none, int, float, text + # unit data units, e.g. m, cm, mm, degree, Hz, W, dW and etc + # permission defines what user group may read/write to this node (is one of spy, user, manager) + # rdPara parameters LEN and CTRL to be sent to the device + # rdFunc nextState Function to be called after the getValue function, typically rdValue() + # wrPara actual device field in write command to be sent to the device + # allowedValues allowed values for the node data - does not permit other + set deviceCommandToplevel { + P limits 1 0 1 1 none {} user {2 18} {rdValue} {} {} + limits ForwardPower 0 0 0 1 int {dW} user {} {} {} {} + limits ReversePower 0 0 0 1 int {dW} user {} {} {} {} + P PAGC 1 0 1 1 int {dW} user {2 19} {rdValue} {} {} + P PMGC 1 0 1 1 int {dW} user {2 20} {rdValue} {} {} + P FREQ 1 0 1 1 int {Hz} user {2 21} {rdValue} {} {} + P SKEY 1 0 1 1 int {} user {3 23} {rdValue} {} {} + SKEY SoftOn 0 0 0 1 text {} user {} {} {} {} + SKEY Key1 0 0 0 1 int {} user {} {} {} {} + SKEY Key0 0 0 0 1 int {} user {} {} {} {} + SKEY Key2 0 0 0 1 int {} user {} {} {} {} + SKEY Key3 0 0 0 1 int {} user {} {} {} {} + P BurstPar 1 0 1 1 none {} user {2 24} {rdValue} {} {} + BurstPar BurstMode 0 0 0 1 int {} user {} {} {} {} + BurstPar BRepTime 0 0 0 1 int {ms} user {} {} {} {} + BurstPar TimeOfPower 0 0 0 1 int {us} user {} {} {} {} + P SweepPar 1 0 1 1 none {} user {2 25} {rdValue} {} {} + SweepPar SweepMode 0 0 0 1 text {} user {} {} {} {} + SweepPar StartFreq 0 0 0 1 int {Hz} user {} {} {} {} + SweepPar StepFreq 0 0 0 1 int {Hz} user {} {} {} {} + SweepPar SCyc 0 0 0 1 int {} user {} {} {} {} + P SVER 1 0 1 1 none {} user {2 29} {rdValue} {} {} + SVER SN 0 0 0 1 text {} user {} {} {} {} + SVER SWVersion 0 0 0 1 text {} user {} {} {} {} + SVER DeviceVersion 0 0 0 1 text {} user {} {} {} {} + P MEAS 1 0 1 1 none {} user {2 30} {rdValue} {} {} + MEAS ForwardPower 0 0 0 1 int {dW} user {} {} {} {} + MEAS ReversePower 0 0 0 1 int {dW} user {} {} {} {} + MEAS Temperature 0 0 0 1 int {0C} user {} {} {} {} + P STA 1 0 1 1 none {} user {2 31} {rdValue} {} {} + STA MainState 0 0 0 1 text {} user {} {} {} {} + STA State 0 0 0 1 int {} user {} {} {} {} + STA/State FstRemote 0 0 0 1 text {} user {} {} {} {} + STA/State FStExtBurst 0 0 0 1 text {} user {} {} {} {} + STA/State FStRFError 0 0 0 1 text {} user {} {} {} {} + STA/State FStSafetyLP 0 0 0 1 text {} user {} {} {} {} + STA/State FStExceedRP 0 0 0 1 text {} user {} {} {} {} + STA/State FStExceedFP 0 0 0 1 text {} user {} {} {} {} + STA/State FStExceedTmp 0 0 0 1 text {} user {} {} {} {} + STA keyState 0 0 0 1 int {} user {} {} {} {} + STA/keyState SoftOn 0 0 0 1 text {} user {} {} {} {} + STA/keyState Key1 0 0 0 1 text {} user {} {} {} {} + STA/keyState Key0 0 0 0 1 text {} user {} {} {} {} + STA/keyState Key2 0 0 0 1 text {} user {} {} {} {} + STA/keyState Key3 0 0 0 1 text {} user {} {} {} {} + + P responseMsg 0 0 0 1 text {} user {2 42} {} {} {} + + P SetLimitsFPL 0 1 1 1 int {dW} user {10 2} {rdValue} {FPL} {} + P SetLimitsRPL 0 1 1 1 int {dW} user {10 2} {rdValue} {RPL} {} + P SetPAGC 0 1 1 1 int {dW} user {4 3} {rdValue} {PAGC} {} + P SetPMGC 0 1 1 1 int {dW} user {4 4} {rdValue} {PMGC} {} + P SetFREQ 0 1 1 1 int {Hz} user {6 5} {rdValue} {FREQ} {} + P SetSKEY 0 0 0 1 int {} user {} {} {} {} + SetSKEY SoftOn 0 1 1 1 int {} user {3 7} {rdValue} {SoftOn} {1,0} + SetSKEY Key1 0 1 1 1 int {} user {3 7} {rdValue} {Key1} {1,0} + SetSKEY Key0 0 1 1 1 int {} user {3 7} {rdValue} {Key0} {1,0} + SetSKEY Key2 0 1 1 1 int {} user {3 7} {rdValue} {Key2} {1,0} + SetSKEY Key3 0 1 1 1 int {} user {3 7} {rdValue} {Key3} {1,0} + P SetBurstMode 0 1 1 1 int {} user {7 8} {rdValue} {BurstMode} {0,1,2,3} + P SetBRepTime 0 1 1 1 int {ms} user {7 8} {rdValue} {BRepTime} {} + P SetBTimeOfPower 0 1 1 1 int {us} user {7 8} {rdValue} {BTofP} {} + P SetSweepMode 0 1 1 1 int {} user {13 9} {rdValue} {SweepMode} {0,1,2} + P SetSStartFreq 0 1 1 1 int {Hz} user {13 9} {rdValue} {SStrF} {} + P SetSStepFreq 0 1 1 1 int {Hz} user {13 9} {rdValue} {SSteF} {} + P SetSSCyc 0 1 1 1 int {} user {13 9} {rdValue} {SSCyc} {} + } + + foreach {cmdGroup varName readable writable pollEnabled displayable dataType unit permission rdPara rdFunc wrPara allowedValues} \ + $deviceCommandToplevel { + + createNode $scobj_hpath sct_$pa(NAME) $cmdGroup $varName $readable $writable $pollEnabled $displayable $dataType $unit $permission $rdPara $rdFunc $wrPara $allowedValues + } + } message ]} { + return -code error "Error in ::scobj::ag1010::mkAG $message" + } +} +# end of namespace ::scobj::ag1010::mkAG + +# Main process call +# @param name short name for the AG1010 Amplifier/Generator +# @param IP IP address of the device (e.g. IP of moxabox that hooks up to the AG1010) +# @param port port number on the moxabox (typ. 4001, 4002, 4003, or 4004) +# @param turning if the parameter is turnable and can be set from the Gumtree +# @internal time internal in polling the nodes + +# IP 137.157.202.215 +::scobj::ag1010::mkAG { + name "ag1010" + IP localhost + PORT 50001 + tuning 1 + interval 5 +} + +