From 4a70231ccf8425d00c0cf55f4ead28a9bd2b8816 Mon Sep 17 00:00:00 2001 From: Divall Edwin James Date: Thu, 11 Dec 2025 16:19:19 +0100 Subject: [PATCH] TOPAS example --- TOPAS/IOC/SLAAR21-CPCL-LTOPASAPI_TOPAS.subs | 110 ++++++++++ .../IOC/SLAAR21-CPCL-LTOPASAPI_startup.script | 14 ++ TOPAS/IOC/TOPAS_API_MAIN.template | 160 +++++++++++++++ TOPAS/IOC/TOPAS_API_MOTOR.template | 149 ++++++++++++++ TOPAS/IOC/cfg/topas_api | 192 ++++++++++++++++++ 5 files changed, 625 insertions(+) create mode 100644 TOPAS/IOC/SLAAR21-CPCL-LTOPASAPI_TOPAS.subs create mode 100644 TOPAS/IOC/SLAAR21-CPCL-LTOPASAPI_startup.script create mode 100644 TOPAS/IOC/TOPAS_API_MAIN.template create mode 100644 TOPAS/IOC/TOPAS_API_MOTOR.template create mode 100644 TOPAS/IOC/cfg/topas_api diff --git a/TOPAS/IOC/SLAAR21-CPCL-LTOPASAPI_TOPAS.subs b/TOPAS/IOC/SLAAR21-CPCL-LTOPASAPI_TOPAS.subs new file mode 100644 index 0000000..b756ca1 --- /dev/null +++ b/TOPAS/IOC/SLAAR21-CPCL-LTOPASAPI_TOPAS.subs @@ -0,0 +1,110 @@ + +#caqtdm -macro IOC=SLAAR21-LTOP-TOPHE SLG-L-TOPAS-MAIN.ui& + +#caqtdm -macro SYS1=SLAAR21-LTOP-TOPHE,SYS2=SLAAR21-LTOP-TOPNOPA,SYS3=SLAAR21-LTOP-TOPTWS,SYS4=SLAAR21-LTOP-TOPTWP SLAAR21-L-TOPAS-MAIN-ALL.ui& + +#$(TOP_DEV) =16448 +#$(HOST) =129.129.243.70:8004 +#$(TOPAS) =Device to talk to from startup script + + + +#-------------------------- T O P A S - H E -----------------------------------------129.129.243.70:8004/16448 + +file TOPAS_API_MAIN.template +{pattern + { SYSTEM DESC TOP_DEV HOST TOPAS NUM_MOTORS } + { "SLAAR21-LTOP-TOPHE" "TOPAS-HE" "16448" "129.129.243.70:8004" "TOPAS8004" "12" } +} + +file TOPAS_API_MOTOR.template +{pattern + { SYSTEM DESC TOP_DEV HOST TOPAS MOT } + { "SLAAR21-LTOP-TOPHE" "system" "16448" "129.129.243.70:8004" "TOPAS8004" "1" } + { "SLAAR21-LTOP-TOPHE" "system" "16448" "129.129.243.70:8004" "TOPAS8004" "2" } + { "SLAAR21-LTOP-TOPHE" "system" "16448" "129.129.243.70:8004" "TOPAS8004" "3" } + { "SLAAR21-LTOP-TOPHE" "system" "16448" "129.129.243.70:8004" "TOPAS8004" "4" } + { "SLAAR21-LTOP-TOPHE" "system" "16448" "129.129.243.70:8004" "TOPAS8004" "5" } + { "SLAAR21-LTOP-TOPHE" "system" "16448" "129.129.243.70:8004" "TOPAS8004" "6" } + { "SLAAR21-LTOP-TOPHE" "system" "16448" "129.129.243.70:8004" "TOPAS8004" "7" } + { "SLAAR21-LTOP-TOPHE" "system" "16448" "129.129.243.70:8004" "TOPAS8004" "8" } + { "SLAAR21-LTOP-TOPHE" "system" "16448" "129.129.243.70:8004" "TOPAS8004" "9" } + { "SLAAR21-LTOP-TOPHE" "system" "16448" "129.129.243.70:8004" "TOPAS8004" "10" } + { "SLAAR21-LTOP-TOPHE" "system" "16448" "129.129.243.70:8004" "TOPAS8004" "11" } + { "SLAAR21-LTOP-TOPHE" "system" "16448" "129.129.243.70:8004" "TOPAS8004" "12" } +} + +#----------------------------------------- N O P A ----------------------------------129.129.243.70:8016/N05034 + + +file TOPAS_API_MAIN.template +{pattern + { SYSTEM DESC TOP_DEV HOST TOPAS NUM_MOTORS } + { "SLAAR21-LTOP-TOPNOPA" "TOPAS-NOPA" "N05034" "129.129.243.70:8016" "TOPAS8016" "4" } +} + +file TOPAS_API_MOTOR.template +{pattern + { SYSTEM DESC TOP_DEV HOST TOPAS MOT } + { "SLAAR21-LTOP-TOPNOPA" "system" "N05034" "129.129.243.70:8016" "TOPAS8016" "1" } + { "SLAAR21-LTOP-TOPNOPA" "system" "N05034" "129.129.243.70:8016" "TOPAS8016" "2" } + { "SLAAR21-LTOP-TOPNOPA" "system" "N05034" "129.129.243.70:8016" "TOPAS8016" "3" } + { "SLAAR21-LTOP-TOPNOPA" "system" "N05034" "129.129.243.70:8016" "TOPAS8016" "4" } +} + + + + + +#----------------------------------------- T W I N - S E E D ----------------------------------129.129.243.70:8012/A8729 + + +file TOPAS_API_MAIN.template +{pattern + { SYSTEM DESC TOP_DEV HOST TOPAS NUM_MOTORS } + { "SLAAR21-LTOP-TOPTWS" "TWIN-SEED" "A8729" "129.129.243.70:8012" "TOPAS8012" "8" } +} + +file TOPAS_API_MOTOR.template +{pattern + { SYSTEM DESC TOP_DEV HOST TOPAS MOT } + { "SLAAR21-LTOP-TOPTWS" "system" "A8729" "129.129.243.70:8012" "TOPAS8012" "1" } + { "SLAAR21-LTOP-TOPTWS" "system" "A8729" "129.129.243.70:8012" "TOPAS8012" "2" } + { "SLAAR21-LTOP-TOPTWS" "system" "A8729" "129.129.243.70:8012" "TOPAS8012" "3" } + { "SLAAR21-LTOP-TOPTWS" "system" "A8729" "129.129.243.70:8012" "TOPAS8012" "4" } + { "SLAAR21-LTOP-TOPTWS" "system" "A8729" "129.129.243.70:8012" "TOPAS8012" "5" } + { "SLAAR21-LTOP-TOPTWS" "system" "A8729" "129.129.243.70:8012" "TOPAS8012" "6" } + { "SLAAR21-LTOP-TOPTWS" "system" "A8729" "129.129.243.70:8012" "TOPAS8012" "7" } + { "SLAAR21-LTOP-TOPTWS" "system" "A8729" "129.129.243.70:8012" "TOPAS8012" "8" } +} + + + +#----------------------------------------- T W I N - P U M P ----------------------------------129.129.243.70:8000/18729 + + +file TOPAS_API_MAIN.template +{pattern + { SYSTEM DESC TOP_DEV HOST TOPAS NUM_MOTORS } + { "SLAAR21-LTOP-TOPTWP" "TWIN-PUMP" "18729" "129.129.243.70:8000" "TOPAS8000" "6" } +} + +file TOPAS_API_MOTOR.template +{pattern + { SYSTEM DESC TOP_DEV HOST TOPAS MOT } + { "SLAAR21-LTOP-TOPTWP" "system" "18729" "129.129.243.70:8000" "TOPAS8000" "1" } + { "SLAAR21-LTOP-TOPTWP" "system" "18729" "129.129.243.70:8000" "TOPAS8000" "2" } + { "SLAAR21-LTOP-TOPTWP" "system" "18729" "129.129.243.70:8000" "TOPAS8000" "3" } + { "SLAAR21-LTOP-TOPTWP" "system" "18729" "129.129.243.70:8000" "TOPAS8000" "4" } + { "SLAAR21-LTOP-TOPTWP" "system" "18729" "129.129.243.70:8000" "TOPAS8000" "5" } + { "SLAAR21-LTOP-TOPTWP" "system" "18729" "129.129.243.70:8000" "TOPAS8000" "6" } +} + + + + + + + + + diff --git a/TOPAS/IOC/SLAAR21-CPCL-LTOPASAPI_startup.script b/TOPAS/IOC/SLAAR21-CPCL-LTOPASAPI_startup.script new file mode 100644 index 0000000..0c0ccf5 --- /dev/null +++ b/TOPAS/IOC/SLAAR21-CPCL-LTOPASAPI_startup.script @@ -0,0 +1,14 @@ +require "stream" +epicsEnvSet STREAM_PROTOCOL_PATH :protocols:./cfg + + + +#All devices on same machine, but use different ports + +drvAsynIPPortConfigure ("TOPAS8000", "129.129.243.70:8000 HTTP") + +drvAsynIPPortConfigure ("TOPAS8004", "129.129.243.70:8004 HTTP") + +drvAsynIPPortConfigure ("TOPAS8012", "129.129.243.70:8012 HTTP") + +drvAsynIPPortConfigure ("TOPAS8016", "129.129.243.70:8016 HTTP") diff --git a/TOPAS/IOC/TOPAS_API_MAIN.template b/TOPAS/IOC/TOPAS_API_MAIN.template new file mode 100644 index 0000000..c62f44a --- /dev/null +++ b/TOPAS/IOC/TOPAS_API_MAIN.template @@ -0,0 +1,160 @@ +# Main Template for TOPAS API + +# Communications for generic functions.. +# i.e. Wavelength, Shutter control NOT for motors + +#Typical curl commands +#curl http://129.129.243.70:8012/A8729/v0/PublicAPI/Motors/AllProperties +#need some macros:- + +#$(TOP_DEV) =A8729 +#$(HOST) =129.129.243.70:8012 +#$(TOPAS) =Device to talk to from startup script + +record(stringin, "$(SYSTEM):HOST"){ + field(DESC, "$(DESC)") + field(VAL, "$(HOST)") +} + +record(stringin, "$(SYSTEM):TOPAS_DEVICE"){ + field(DESC, "Topas Device") + field(VAL, "$(TOP_DEV)") +} + +record(ai, "$(SYSTEM):NUM_MOTORS"){ + field(DESC, "number of motors") + field(VAL, "$(NUM_MOTORS=20)") +} +########################################### +# Counter +########################################### + +record(ao,"$(SYSTEM):LIVE_CNTR_ENA"){ + field(DESC, "0 to stop counter") + field(VAL, "1") +} + +record(calcout,"$(SYSTEM):LIVE_CNTR"){ #for live readings ctsly + field(DESC, "Cycle round all channels") + field(SCAN, ".5 second") + field(INPA, "$(SYSTEM):LIVE_CNTR") + field(INPB, "$(SYSTEM):LIVE_CNTR_ENA") + field(INPC, "$(SYSTEM):NUM_MOTORS") + field(CALC, "B=0?-5:A<0a>false<00> + +#paramerters passed from record $(SYSTEM),$(HOST),$(TOP_DEV),$(MOT) + +#Shutter Control +GetShutterState { out "GET /\$3/v0/PublicAPI/ShutterInterlock/IsShutterOpen\r\n\r\n"; #Shutter state + InTerminator = "\r\n"; + in "%*s";in "%{false|true}"; + } + + + +OpenShutter { OutTerminator = CR LF; + out "PUT /\$3/v0/PublicAPI/ShutterInterlock/OpenShutter HTTP/1.1"; + out "Host: \$2"; + # out "Accept: */*"; + # out "Content-Type: application/x-www-form-urlencoded"; + out "Content-Length: 4"; + out ""; + out "{''}\r\n"; + wait 100; + } + +CloseShutter { OutTerminator = CR LF; + out "PUT /\$3/v0/PublicAPI/ShutterInterlock/CloseShutter HTTP/1.1"; + out "Host: \$2"; + out "Content-Length: 4"; + out ""; + out "{''}\r\n"; + wait 100; + } + + + +#Wavelength control - curl http://129.129.243.70:8000/18729/v0/PublicAPI/Optical/WavelengthControl/Output/Wavelength +GetWavelength { out "GET /\$3/v0/PublicAPI/Optical/WavelengthControl/Output/Wavelength\r\n\r\n"; #Wavelength + InTerminator = "\r\n"; + in "%*s";in "%f"; + } + +SetWavelength { OutTerminator = CR LF; + out "PUT /\$3/v0/PublicAPI/Optical/WavelengthControl/SetWavelength HTTP/1.1"; + out "Host: \$2"; + out "Content-Type: application/json"; + out "Content-Length: 240";#233 + out ""; + out '{ "DontTouchShutterOnInteractionChange": false,"IgnoreSeparation": false, "SetForBackground": false, "Wavelength": %f,"Interaction": "*","Priorities":[{"Priority": 30,"Type": "art"},{"Priority": 63, "Type": "dreamcatcher" } ] } \r\n'; +# 12345678901234567890123456789012345678901234567 501234567890123456789012345678901234567890123456 10012345678901234567890123456789012345678901234567 5012345678901234567890123456789012345678901234567 5012345678901234567890123456789012345 + wait 100; + } + +Interaction { out "GET /\$3/v0/PublicAPI/Optical/WavelengthControl/Output\r\n\r\n"; #Title + InTerminator = "\r\n"; + in "%*s"; + in "%*/" 0x22 "ActualInteraction" 0x22 ":" 0x22 "/%[^" 0x22 "]"; #Read chars while not an " for title + } + +#Motors + +MotorTitle { out "GET /\$3/v0/PublicAPI/Motors/?id=\$4\r\n\r\n"; #Title + InTerminator = "\r\n"; + in "%*s"; + in "%*/" 0x22 "Title" 0x22 ":" 0x22 "/%[^" 0x22 "]"; #Read chars while not an " for title + } + +MotorTitleUnit { out "GET /\$3/v0/PublicAPI/Motors/?id=\$4\r\n\r\n"; #read both Title and unit + InTerminator = "\r\n"; + in "%*s"; + in "%*/" 0x22 "Title" 0x22 ":" 0x22 "/%[^" 0x22 "]" 0x22 "," 0x22 "UnitName" 0x22 ":" 0x22 "%(\$1:MOT\$4_UNIT)[^" 0x22 "]" ; #Read chars while not an " for title + } + + +#MotorUnit { out "GET /\$3/v0/PublicAPI/Motors/?id=\$4\r\n\r\n"; #UnitName +# InTerminator = "\r\n"; +# in "%*s"; +# in "%*/" 0x22 "Title" 0x22 ":" 0x22 "/%[^" 0x22 "]," 0x22 "UnitName" 0x22 ":" 0x22 "/%[^" 0x22 "]" ; +# #in "%*/" 0x22 "UnitName" 0x22 ":" 0x22 "/%[^" 0x22 "]"; #there are 2 "UnitNames" - problem is finding he second one... +# } + + +ActualPos { out "GET /\$3/v0/PublicAPI/Motors/?id=\$4\r\n\r\n"; #position in steps + InTerminator = "\r\n"; + in "%*s"; + in "%*/ActualPosition" 0x22 ":/%f"; #floating pt + } + +ActualPosUnits { out "GET /\$3/v0/PublicAPI/Motors/?id=\$4\r\n\r\n"; #position in egu + InTerminator = "\r\n"; + in "%*s"; + in "%*/ActualPositionInUnits" 0x22 ":/%f"; #floating pt + } + + + + + +# curl -X PUT http://129.129.243.70:8004/16448/v0/PublicAPI/Motors/TargetPosition?id=1 -H "Content-Type: application/json" -d "9796" +SetAbsSteps { OutTerminator = CR LF; + out "PUT /\$3/v0/PublicAPI/Motors/TargetPosition?id=\$4 HTTP/1.1"; + out "Host: \$2"; + out "Content-Type: application/json"; + out "Content-Length: 8"; + out ""; + out "%d \r\n"; + wait 100; + } + +SetRelSteps { OutTerminator = CR LF; + out "PUT /\$3/v0/PublicAPI/Motors/TargetPositionRelative?id=\$4 HTTP/1.1"; + out "Host: \$2"; + out "Content-Type: application/json"; + out "Content-Length: 6"; + out ""; + out "%d \r\n"; + wait 100; + } + + +#Uri: http://129.129.243.70:8016/N05034/v0/PublicAPI/Motors/StopAll +#Home a motor +#Uri: http://129.129.243.70:8016/N05034/v0/PublicAPI/Motors/Home?id={motorIndex} + + +HomeMotor { OutTerminator = CR LF; + out "POST /\$3/v0/PublicAPI/Motors/Home?id=\$4 HTTP/1.1"; + out "Host: \$2"; + #out "Content-Type: application/json"; + out "Content-Length: 4"; + out ""; + out "{''}\r\n"; + wait 100; + } + + + +StopAll { OutTerminator = CR LF; + out "POST /\$3/v0/PublicAPI/Motors/StopAll HTTP/1.1"; + out "Host: \$2"; + # out "Accept: */*"; + # out "Content-Type: application/x-www-form-urlencoded"; + out "Content-Length: 4"; + out ""; + out "{''}\r\n"; + wait 100; + } + + + + + + + + + + + + + + + +