From b82fb42136d6f9085b5e16bee3d7c9a1327e664d Mon Sep 17 00:00:00 2001
From: mwyman <mwyman@anl.gov>
Date: Wed, 8 May 2024 06:31:34 -0500
Subject: [PATCH] Working through EPIC/pyDevice layer

---
 .loglogin                                     |   1 +
 100idPyApp/Db/pyDevCRL_stack.db               |   8 +-
 100idPyApp/Db/pyDevCRLsingle.db               |  51 +-
 100idPyApp/python/pyTransfocator_single.py    |  54 +-
 iocBoot/ioc100idPyCRL/crl_setup.toml          |   4 +-
 .../ioc100idPyCRL/examples/pydeviceCRL.cmd    |  12 +-
 iocBoot/ioc100idPySBL/.iocsh_history          | 974 ------------------
 7 files changed, 75 insertions(+), 1029 deletions(-)

diff --git a/.loglogin b/.loglogin
index 5a8fedd..630e8e5 100644
--- a/.loglogin
+++ b/.loglogin
@@ -22,3 +22,4 @@
 04/23/2024 - 06:16:23 - ravioli
 05/01/2024 - 15:09:31 - ravioli
 05/02/2024 - 05:57:36 - ravioli
+05/07/2024 - 06:21:41 - ravioli
diff --git a/100idPyApp/Db/pyDevCRL_stack.db b/100idPyApp/Db/pyDevCRL_stack.db
index 758cdc6..25dd71f 100644
--- a/100idPyApp/Db/pyDevCRL_stack.db
+++ b/100idPyApp/Db/pyDevCRL_stack.db
@@ -1,5 +1,5 @@
 record(dfanout, "$(P)CRL$(N):stack$(M)_dfanout"){
-	field(DOL, "$(P)CRL$(N):filter_decode.$(DECODE) CP")
+	field(DOL, "$(P)CRL$(N):lens_decode.$(DECODE) CP")
 	field(OMSL, "closed_loop")
 	field(OUTA, "$(P)CRL$(N):stack$(M) PP")
 }
@@ -41,8 +41,8 @@ record(ao, "$(P)CRL$(N):stack$(M)_ThickErr"){
 record(dfanout, "$(P)CRL$(N):stack$(M)_BW_dfanout"){
 	field(OMSL, "closed_loop")
 	field(DOL, "$(P)CRL$(N):stack$(M) CP")
-	field(OUTA, "$(P)CRL$(N):filter_encode.$(ENCODE)")
-#	field(FLNK, "$(P)CRL$(N):filter_encode PP")
+	field(OUTA, "$(P)CRL$(N):lens_encode.$(ENCODE)")
+#	field(FLNK, "$(P)CRL$(N):lens_encode PP")
 }
 
 record(bi, "$(P)CRL$(N):stack$(M)_RBV"){
@@ -55,7 +55,7 @@ record(bi, "$(P)CRL$(N):stack$(M)_RBV"){
 record(dfanout, "$(P)CRL$(N):stack$(M)_RBV_dfanout"){
 	field(OMSL, "closed_loop")
 	field(DOL, "$(P)CRL$(N):stack$(M)_RBV CP")
-	field(OUTA, "$(P)CRL$(N):filter_RBV_encode.$(ENCODE)")
+	field(OUTA, "$(P)CRL$(N):lens_RBV_encode.$(ENCODE)")
 }
 
 record(bo, "$(P)CRL$(N):stack$(M)_Lock"){
diff --git a/100idPyApp/Db/pyDevCRLsingle.db b/100idPyApp/Db/pyDevCRLsingle.db
index 8b36ee4..6cb8807 100644
--- a/100idPyApp/Db/pyDevCRLsingle.db
+++ b/100idPyApp/Db/pyDevCRLsingle.db
@@ -1,4 +1,4 @@
-record(ao, "$(P)$(CRL)$(N):energy"){
+record(ao, "$(P)CRL$(N):energy"){
 	field(EGU, "keV")
     field(DOL,  "$(KEV) CP")
     field(OMSL, "closed_loop")
@@ -6,23 +6,23 @@ record(ao, "$(P)$(CRL)$(N):energy"){
 	field(OUT, "@$(OBJ).updateE('VAL')")
 }
 
-record(ao, "$(P)$(CRL)$(N):focalSize"){
+record(ao, "$(P)CRL$(N):focalSize"){
 	field(EGU, "m")
 	field(DTYP, "pydev")
 	field(OUT, "@$(OBJ).updateFsize('VAL')")
 }
 
-record(bo, "$(P)$(CRL)$(N):fSize_twk_up"){
+record(bo, "$(P)CRL$(N):fSize_twk_up"){
 	field(DTYP, "pydev")
 	field(OUT, "@$(OBJ).tweakUp()")
 }
 
-record(bo, "$(P)$(CRL)$(N):fSize_twk_dn"){
+record(bo, "$(P)CRL$(N):fSize_twk_dn"){
 	field(DTYP, "pydev")
 	field(OUT, "@$(OBJ).tweakDn()")
 }
 
-record(ao, "$(P)$(CRL)$(N):slitSize_H"){
+record(ao, "$(P)CRL$(N):slitSize_H"){
 	field(EGU, "m")
     field(DOL,  "$(SLITH) CP")
     field(OMSL, "closed_loop")
@@ -30,7 +30,7 @@ record(ao, "$(P)$(CRL)$(N):slitSize_H"){
 	field(OUT, "@$(OBJ).updateSlitSize('VAL', 'hor')")
 }
 
-record(ao, "$(P)$(CRL)$(N):slitSize_V"){
+record(ao, "$(P)CRL$(N):slitSize_V"){
 	field(EGU, "m")
     field(DOL,  "$(SLITV) CP")
     field(OMSL, "closed_loop")
@@ -38,14 +38,14 @@ record(ao, "$(P)$(CRL)$(N):slitSize_V"){
 	field(OUT, "@$(OBJ).updateSlitSize('VAL', 'vert')")
 }
 
-record(longin, "$(P)TF$(N):lenses") {
+record(longin, "$(P)CRL$(N):lenses") {
   field(DTYP, "pydev")
-  field(INP,  "@pydev.iointr('new_config_calcd')")
+  field(INP,  "@pydev.iointr('new_lenses')")
   field(SCAN, "I/O Intr")
 }
 
-record(transform, "$(P)$(CRL)$(N):lens_decode"){
-	field(INPA, "$(P)$(CRL)$(N):lenses CP")
+record(transform, "$(P)CRL$(N):lens_decode"){
+	field(INPA, "$(P)CRL$(N):lenses CP")
 	field(CLCB, "A % 2")
 	field(CLCC, "(A >> 1) % 2")
 	field(CLCD, "(A >> 2) % 2")
@@ -60,12 +60,37 @@ record(transform, "$(P)$(CRL)$(N):lens_decode"){
 	field(CLCM, "(A >> 11) % 2")
 }
 
-record(calcout, "$(P)$(CRL)$(N):lens_encode"){
-	field(OUT, "$(P)$(CRL)$(N):lensConfig_BW PP")
+record(calcout, "$(P)CRL$(N):lens_encode"){
+	field(OUT, "$(P)CRL$(N):lensConfig_BW PP")
 	field(CALC, "A+B*2+C*4+D*8+E*16+F*32+G*64+H*128+I*256+J*512+K*1024+L*2048")
 } 
 
-record(longout, "$(P)$(CRL)$(N):lensConfig_BW") {
+record(longout, "$(P)CRL$(N):lensConfig_BW") {
   field(DTYP, "pydev")
   field(OUT, "@$(OBJ).updateConfig('VAL')")
 }
+
+record(longin, "$(P)CRL$(N):inMask_RBV") {
+  field(DTYP, "pydev")
+  field(INP,  "@pydev.iointr('new_inMask')")
+  field(SCAN, "I/O Intr")
+}
+
+record(longin, "$(P)CRL$(N):outMask_RBV") {
+  field(DTYP, "pydev")
+  field(INP,  "@pydev.iointr('new_outMask')")
+  field(SCAN, "I/O Intr")
+}
+
+record(ai, "$(P)CRL$(N):fSize_actual"){
+  field(DTYP, "pydev")
+  field(INP,  "@pydev.iointr('new_fSize')")
+  field(SCAN, "I/O Intr")
+  field(PREC, "5")
+}
+
+record(longin, "$(P)CRL$(N):sortedIndex_RBV") {
+  field(DTYP, "pydev")
+  field(INP,  "@pydev.iointr('new_index')")
+  field(SCAN, "I/O Intr")
+}
diff --git a/100idPyApp/python/pyTransfocator_single.py b/100idPyApp/python/pyTransfocator_single.py
index 44611d4..54fa895 100644
--- a/100idPyApp/python/pyTransfocator_single.py
+++ b/100idPyApp/python/pyTransfocator_single.py
@@ -26,13 +26,11 @@ Beamline properties
 CRL properties
 		d_min   : Minimum thickness at the apex in m
 		stack_d : Stack thickness in m
-Slit properties
 '''
 DEFAULT_CONFIG = {'beam':{'energy': 15,	'L_und': 4.7, 'sigmaH_e': 14.8e-6,
                           'sigmaV_e': 3.7e-6, 'sigmaHp_e': 2.8e-6, 'sigmaVp_e': 1.5e-6},
 				  'beam_line': {'d_StoL': 51.9, 'd_Stof': 66.2},
-				  'crl':{'stack_d': 50.0e-3, 'd_min': 3.0e-5},
-				  'slits':{}}
+				  'crl':{'stack_d': 50.0e-3, 'd_min': 3.0e-5}}
 """
 pyDevice TO DO: 
 
@@ -317,11 +315,6 @@ class singleTF():
 		# Convert the lookup table to a dictionary for faster lookup		
 		self.Lens_diameter_dict = {int(col1): col2 for col1, col2 in Lens_diameter_table}
 		
-		
-		# Initialize pre-CRL slit size
-		self.slit1_H = 500.0e-6          # H slit size before CRL 1
-		self.slit1_V = 300.0e-6          # V slit size before CRL 1
-
 		self.energy = 0  # gets value from an ao (incoming beam energy)
 		self.focalSize = 0 # get value from an ao (desired focal length)
 		self.lenses = 0 # sets integer (2^12) whose binary representation indicates which lenses are in or out
@@ -377,14 +370,6 @@ class singleTF():
 		'''
 		self.d_min = crl_properties['d_min'] 
 		self.stack_d = crl_properties['stack_d']
-	
-	def setupSlits(self, slit_properties):
-		'''
-		Setting up properties of slits
-		'''
-		#Default values	
-
-		pass
 		
 	def setLensCount(self, lensCount):
 		self.numLens = 
@@ -513,6 +498,18 @@ class singleTF():
         if self.verbose: print(f'Sorting culled lookup table of length {len(self.culledTable)}')        
         self.sorted_index = np.argsort(self.culledTable)
 
+    def updateConfig(self, config_BW):
+        '''
+        When user manually changes lenses, this gets focal size and displays it
+        along with updated RBVs but it doesn't set the config PV
+        '''
+        self.configIndex = int(config_BW)
+        self.configIndexSorted = self.sorted_index.tolist().index(self.configIndex)
+
+        self.setFocalSizeActual()
+        self.updateLensRBV()
+        self.updateFocalSizeRBVs()		
+
     def setInMask(self, inMask):
         '''
         update mask for lenses that are locked in
@@ -574,19 +571,28 @@ class singleTF():
         self.updateLensConfigPV()
         self.updateLensRBV()
         self.updateFocalSizeRBVs()		
-				
-	def updateSlitSize(self, size, slit):
+
+	def setSlitSize(self, size, slit):
 		'''
-		Slit size updates are propagated to CRL object from EPICS.  The beam
-		size lookup table is then recalculated.
+		Update proper slit size
 		'''
+		
 		if slit = 'hor':
-			self.slit1_H = float(size)          # H slit size before CRL 1
+			self.slit1_H = float(size)     # H slit size before CRL 1
 		elif slit == 'vert':
 			self.slit1_V = float(size)     # V slit size before CRL 1
 		else 
 			# Need error handling
-			break
+			break	
+			
+					
+	def updateSlitSize(self, size, slit):
+		'''
+		Slit size updates are propagated to CRL object from EPICS.  The beam
+		size lookup table is then recalculated.
+		'''
+		self.setSlitSize(self, size, slit)
+		
 		self.construct_lookup_table()
 
 	def setEnergy(self, energy):
@@ -618,10 +624,6 @@ class singleTF():
 		self.focalSize = float(focalSize)
 		self.find_config()
 		
-#	def calc_lenses(self):
-#		self.lenses = (self.energy * self.focalPoint) % 4096
-#		pydev.iointr('new_lens_config', self.lenses)
-
     def updateLensConfigPV(self):
         '''
         
diff --git a/iocBoot/ioc100idPyCRL/crl_setup.toml b/iocBoot/ioc100idPyCRL/crl_setup.toml
index 24454c2..faca98a 100644
--- a/iocBoot/ioc100idPyCRL/crl_setup.toml
+++ b/iocBoot/ioc100idPyCRL/crl_setup.toml
@@ -33,6 +33,4 @@ stacks = 10
 stack_d = 0.050
 d_min = 0.00003 
 
-[slits]
-
-
+s
diff --git a/iocBoot/ioc100idPyCRL/examples/pydeviceCRL.cmd b/iocBoot/ioc100idPyCRL/examples/pydeviceCRL.cmd
index b75e6f8..6dfb2cf 100644
--- a/iocBoot/ioc100idPyCRL/examples/pydeviceCRL.cmd
+++ b/iocBoot/ioc100idPyCRL/examples/pydeviceCRL.cmd
@@ -2,12 +2,6 @@
 # PyDevice Support for Transfocator
 ################################################################################
 
-# Setting some variables that are needed in multiple locations
-epicsEnvSet('_STACK_THICK',0.050) # Move to TOML
-epicsEnvSet('_D_MIN',0.00003) # Move to TOML
-epicsEnvSet('_STACKS',10) # Move to TOML
-epicsEnvSet('_ENERGY',12) # Get current value later...
-
 # Setting some variables beamline-dependent PVs
 epicsEnvSet('_SLITH',"")	# Horizontal size of slit before CRL
 epicsEnvSet('_SLITV',"")	# Vertical size of slit before CRL
@@ -20,7 +14,7 @@ dbLoadRecords("${TOP}/db/energyTestTools.db","P=$(PREFIX), MONOE=$(MONOE), IDENE
 # CRL DBs and defining substitution file to get stack properties
 dbLoadTemplate("substitutions/pyDeviceTfor.substitutions","P=$(PREFIX)")
 pydev("stack_subFile = 'substitutions/pyDeviceTfor.substitutions'")
-
+s
 # Import Transfocator class
 pydev("from pyTransfocator_single import singleTF")
 
@@ -28,15 +22,15 @@ pydev("from pyTransfocator_single import singleTF")
 pydev("CRL1 = singleTF(crl_setup = 'crl_setup.toml')")
 
 # DB for Transfocator system
-# TODO get STACK_THICK and MIN_THICK from TOML file?
 dbLoadRecords(""${TOP}/db/pyDevCRLsingle.db","P=$(PREFIX), N=1, OBJ=CRL1, KEV=$(BLE), SLITH = $(_SLITH), SLITV = $(_SLITV)")
 
-# After iocInit, need to setup attenuation lookup table
+# After iocInit, need to setup focal size lookup table
 # 	stack_subFile - string holding name/rel. location of substitutions file loaded
 #                     loaded in  dbLoadTemplate
 #   $(_STACKS)  - number of stacks of lenses
 # 	energy		- beam energy in keV used for the initial lookup table setup -- can be updated
 #          after startup
 doAfterIocInit() # PROC energy read and update CRL1 object
+doAfterIocInit() # PROC slit size read and update CRL1 object
 # TODO get STACKS from TOML file?
 doAfterIocInit("pydev('CRL1.setupLookupTable(stack_subFile, $(_STACKS), energy = $(_ENERGY))')") #TODO get energy from beamline...
diff --git a/iocBoot/ioc100idPySBL/.iocsh_history b/iocBoot/ioc100idPySBL/.iocsh_history
index f803d43..9b9f03c 100644
--- a/iocBoot/ioc100idPySBL/.iocsh_history
+++ b/iocBoot/ioc100idPySBL/.iocsh_history
@@ -1,977 +1,3 @@
-epicsEnvSet("OPTICS","/APSshare/epics/synApps_6_3/support/optics-R2-14")
-epicsEnvSet("QUADEM","/APSshare/epics/synApps_6_3/support/quadEM-R9-5")
-epicsEnvSet("SCALER","/APSshare/epics/synApps_6_3/support/scaler-4-1")
-epicsEnvSet("SNCSEQ","/APSshare/epics/synApps_6_3/support/sequencer-mirror-R2-2-9")
-epicsEnvSet("SOFTGLUE","/APSshare/epics/synApps_6_3/support/softGlue-R2-8-4")
-epicsEnvSet("SOFTGLUEZYNQ","/APSshare/epics/synApps_6_3/support/softGlueZynq-R2-0-5")
-epicsEnvSet("SSCAN","/APSshare/epics/synApps_6_3/support/sscan-R2-11-6")
-epicsEnvSet("STD","/APSshare/epics/synApps_6_3/support/std-R3-6-4")
-epicsEnvSet("STREAM","/APSshare/epics/synApps_6_3/support/StreamDevice-2-8-24")
-epicsEnvSet("VAC","/APSshare/epics/synApps_6_3/support/vac-R1-9-2")
-epicsEnvSet("VME","/APSshare/epics/synApps_6_3/support/vme-R2-9-5")
-epicsEnvSet("XSPRESS3","/APSshare/epics/synApps_6_3/support/xspress3-3-2-8")
-epicsEnvSet("XXX","/APSshare/epics/synApps_6_3/support/xxx-R6-3")
-epicsEnvSet("YOKOGAWA_DAS","/APSshare/epics/synApps_6_3/support/Yokogawa_DAS-R2-0-2")
-epicsEnvSet("ALLENBRADLEY","/APSshare/epics/synApps_6_3/support/allenBradley-2-3")
-epicsEnvSet("ADCORE","/APSshare/epics/synApps_6_3/support/areaDetector-R3-13/ADCore")
-epicsEnvSet("ADSUPPORT","/APSshare/epics/synApps_6_3/support/areaDetector-R3-13/ADSupport")
-epicsEnvSet("ULDAQ","/APSshare/epics/synApps_6_3/support/measComp-R4-2/libuldaq-1.2.1")
-epicsEnvSet("PYDEVICE","/net/s100dserv/xorApps/epics/synApps_6_3/support/PyDevice-git")
-epicsEnvSet("NDDRIVERSTDARRAYS","/APSshare/epics/synApps_6_3/support/areaDetector-R3-13/NDDriverStdArrays")
-epicsEnvSet("ADSIMDETECTOR","/APSshare/epics/synApps_6_3/support/areaDetector-R3-13/ADSimDetector")
-# Increase size of buffer for error logging from default 1256
-errlogInit(20000)
-################################################################################
-# PYTHONPATH points to folders where Python modules are.
-# Needs to be done before dbd load, so moved to st.cmd
-epicsEnvSet("PYTHONPATH","$(TOP)/100idPyApp/python")
-################################################################################
-# Tell EPICS all about the record types, device-support modules, drivers,
-# etc. in the software we just loaded (100idPy.munch)
-dbLoadDatabase("../../dbd/ioc100idPyLinux.dbd")
-ioc100idPyLinux_registerRecordDeviceDriver(pdbbase)
-< settings.iocsh
-dbLoadRecords("$(AUTOSAVE)/db/configMenu.db", "P=$(PREFIX), CONFIG=ADAutoSave")
-# Optional: load NDPluginPva plugin
-NDPvaConfigure("PVA1", $(QSIZE), 0, "$(PORT)", 0, $(PREFIX)Pva1:Image, 0, 0, 0)
-dbLoadRecords("NDPva.template",  "P=$(PREFIX),R=Pva1:, PORT=PVA1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-# Must start PVA server if this is enabled
-startPVAServer
-# Optional: load ffmpegServer plugin
-#ffmpegServerConfigure(8081)
-#ffmpegStreamConfigure("FfmStream1", 2, 0, "$(PORT)", 0, -1, 0)
-#dbLoadRecords("$(FFMPEGSERVER)/db/ffmpegStream.template", "P=$(PREFIX),R=ffmstream1:,PORT=FfmStream1,NDARRAY_PORT=$(PORT)")
-#ffmpegFileConfigure("FfmFile1", 16, 0, "$(PORT)", 0, -1, 0)
-#dbLoadRecords("$(FFMPEGSERVER)/db/ffmpegFile.template", "P=$(PREFIX),R=ffmfile1:,PORT=FfmFile1,NDARRAY_PORT=$(PORT)")
-# Optional: load NDPluginEdge plugin
-#NDEdgeConfigure("EDGE1", $(QSIZE), 0, "$(PORT)", 0, 0, 0, 0)
-#dbLoadRecords("$(ADPLUGINEDGE)/db/NDEdge.template",  "P=$(PREFIX),R=Edge1:, PORT=EDGE1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-#set_requestfile_path("$(ADPLUGINEDGE)/db")
-# Optional: load NDPluginCV plugin
-#NDCVConfigure("CV1", $(QSIZE), 0, "$(PORT)", 0, 0, 0, 0, 0, $(MAX_THREADS=5))
-#dbLoadRecords("$(ADCOMPVISION)/db/NDCV.template",  "P=$(PREFIX),R=CV1:, PORT=CV1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-#set_requestfile_path("$(ADCOMPVISION)/adcvApp/Db")
-# Optional: load NDPluginBar plugin
-#NDBarConfigure("BAR1", $(QSIZE), 0, "$(PORT)", 0, 0, 0, 0, 0, $(MAX_THREADS=5))
-#dbLoadRecords("$(ADPLUGINBAR)/db/NDBar.template",  "P=$(PREFIX),R=Bar1:, PORT=BAR1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-#set_requestfile_path("$(ADPLUGINBAR)/barApp/Db")
-# Optional: load scan records
-#dbLoadRecords("$(SSCAN)/sscanApp/Db/scan.db", "P=$(PREFIX),MAXPTS1=2000,MAXPTS2=200,MAXPTS3=20,MAXPTS4=10,MAXPTSH=10")
-#set_requestfile_path("$(SSCAN)/sscanApp/Db")
-# Optional: load sseq record for acquisition sequence
-#dbLoadRecords("$(CALC)/calcApp/Db/sseqRecord.db", "P=$(PREFIX), S=AcquireSequence")
-#set_requestfile_path("$(CALC)/calcApp/Db")
-# Optional: load devIocStats records (requires DEVIOCSTATS module)
-#dbLoadRecords("$(DEVIOCSTATS)/db/iocAdminSoft.db", "IOC=$(PREFIX)")
-# Optional: load alive record (requires ALIVE module)
-#dbLoadRecords("$(ALIVE)/aliveApp/Db/alive.db", "P=$(PREFIX),RHOST=164.54.100.11")
-# Set the callback queue size to 5000, up from default of 2000 in base.
-# This can be needed to avoid errors "callbackRequest: cbLow ring buffer full".
-callbackSetQueueSize(5000)
-doAfterIocInit("dbpf('100idPySBL:NDSA:NDimensions', '2')")
-#Shouldn't need a simdet as NDSA comes with image plugin; however, adding 
-#one to test some pycalc ideas
-#iocshLoad("iocsh/ADSimDetector.iocsh", "PREFIX=$(PREFIX), INSTANCE=SIM1")
-###############################################################################
-iocInit
-###############################################################################
-# write all the PV names to a local file
-dbl > dbl-all.txt
-# Diagnostic: CA links in all records
-dbcar(0,1)
-# print the time our boot was finished
-date
-exit
-# Linux startup script
-< envPaths
-dbLoadRecords("$(AUTOSAVE)/db/configMenu.db", "P=$(PREFIX), CONFIG=ADAutoSave")
-# Optional: load NDPluginPva plugin
-NDPvaConfigure("PVA1", $(QSIZE), 0, "$(PORT)", 0, $(PREFIX)Pva1:Image, 0, 0, 0)
-dbLoadRecords("NDPva.template",  "P=$(PREFIX),R=Pva1:, PORT=PVA1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-# Must start PVA server if this is enabled
-startPVAServer
-# Optional: load ffmpegServer plugin
-#ffmpegServerConfigure(8081)
-#ffmpegStreamConfigure("FfmStream1", 2, 0, "$(PORT)", 0, -1, 0)
-#dbLoadRecords("$(FFMPEGSERVER)/db/ffmpegStream.template", "P=$(PREFIX),R=ffmstream1:,PORT=FfmStream1,NDARRAY_PORT=$(PORT)")
-#ffmpegFileConfigure("FfmFile1", 16, 0, "$(PORT)", 0, -1, 0)
-#dbLoadRecords("$(FFMPEGSERVER)/db/ffmpegFile.template", "P=$(PREFIX),R=ffmfile1:,PORT=FfmFile1,NDARRAY_PORT=$(PORT)")
-# Optional: load NDPluginEdge plugin
-#NDEdgeConfigure("EDGE1", $(QSIZE), 0, "$(PORT)", 0, 0, 0, 0)
-#dbLoadRecords("$(ADPLUGINEDGE)/db/NDEdge.template",  "P=$(PREFIX),R=Edge1:, PORT=EDGE1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-#set_requestfile_path("$(ADPLUGINEDGE)/db")
-# Optional: load NDPluginCV plugin
-#NDCVConfigure("CV1", $(QSIZE), 0, "$(PORT)", 0, 0, 0, 0, 0, $(MAX_THREADS=5))
-#dbLoadRecords("$(ADCOMPVISION)/db/NDCV.template",  "P=$(PREFIX),R=CV1:, PORT=CV1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-#set_requestfile_path("$(ADCOMPVISION)/adcvApp/Db")
-# Optional: load NDPluginBar plugin
-#NDBarConfigure("BAR1", $(QSIZE), 0, "$(PORT)", 0, 0, 0, 0, 0, $(MAX_THREADS=5))
-#dbLoadRecords("$(ADPLUGINBAR)/db/NDBar.template",  "P=$(PREFIX),R=Bar1:, PORT=BAR1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-#set_requestfile_path("$(ADPLUGINBAR)/barApp/Db")
-# Optional: load scan records
-#dbLoadRecords("$(SSCAN)/sscanApp/Db/scan.db", "P=$(PREFIX),MAXPTS1=2000,MAXPTS2=200,MAXPTS3=20,MAXPTS4=10,MAXPTSH=10")
-#set_requestfile_path("$(SSCAN)/sscanApp/Db")
-# Optional: load sseq record for acquisition sequence
-#dbLoadRecords("$(CALC)/calcApp/Db/sseqRecord.db", "P=$(PREFIX), S=AcquireSequence")
-#set_requestfile_path("$(CALC)/calcApp/Db")
-# Optional: load devIocStats records (requires DEVIOCSTATS module)
-#dbLoadRecords("$(DEVIOCSTATS)/db/iocAdminSoft.db", "IOC=$(PREFIX)")
-# Optional: load alive record (requires ALIVE module)
-#dbLoadRecords("$(ALIVE)/aliveApp/Db/alive.db", "P=$(PREFIX),RHOST=164.54.100.11")
-# Set the callback queue size to 5000, up from default of 2000 in base.
-# This can be needed to avoid errors "callbackRequest: cbLow ring buffer full".
-callbackSetQueueSize(5000)
-doAfterIocInit("dbpf('100idPySBL:NDSA:NDimensions', '2')")
-#Shouldn't need a simdet as NDSA comes with image plugin; however, adding 
-#one to test some pycalc ideas
-#iocshLoad("iocsh/ADSimDetector.iocsh", "PREFIX=$(PREFIX), INSTANCE=SIM1")
-###############################################################################
-iocInit
-###############################################################################
-# write all the PV names to a local file
-dbl > dbl-all.txt
-# Diagnostic: CA links in all records
-dbcar(0,1)
-# print the time our boot was finished
-date
-exit
-epicsEnvSet("IOC","ioc100idPySBL")
-epicsEnvSet("TOP","/net/s100dserv/xorApps/epics/synApps_6_3/ioc/100idPy")
-epicsEnvSet("SUPPORT","/APSshare/epics/synApps_6_3/support")
-epicsEnvSet("LOCAL_SUPPORT","/net/s100dserv/xorApps/epics/synApps_6_3/support")
-epicsEnvSet("EPICS_BASE","/APSshare/epics/base-7.0.8")
-epicsEnvSet("ALIVE","/APSshare/epics/synApps_6_3/support/alive-R1-4-1")
-epicsEnvSet("AREA_DETECTOR","/APSshare/epics/synApps_6_3/support/areaDetector-R3-13")
-epicsEnvSet("ASYN","/APSshare/epics/synApps_6_3/support/asyn-R4-44-2")
-epicsEnvSet("AUTOSAVE","/APSshare/epics/synApps_6_3/support/autosave-R5-11")
-epicsEnvSet("BUSY","/APSshare/epics/synApps_6_3/support/busy-R1-7-4")
-epicsEnvSet("CALC","/APSshare/epics/synApps_6_3/support/calc-R3-7-5")
-epicsEnvSet("CAMAC","/APSshare/epics/synApps_6_3/support/camac-R2-7-5")
-epicsEnvSet("CAPUTRECORDER","/APSshare/epics/synApps_6_3/support/caputRecorder-R1-7-6")
-epicsEnvSet("DAC128V","/APSshare/epics/synApps_6_3/support/dac128V-R2-10-1")
-epicsEnvSet("DANTE","/APSshare/epics/synApps_6_3/support/Dante-R1-1")
-epicsEnvSet("DELAYGEN","/APSshare/epics/synApps_6_3/support/delaygen-R1-2-4")
-epicsEnvSet("DEVIOCSTATS","/APSshare/epics/synApps_6_3/support/iocStats-3-1-16")
-epicsEnvSet("DXP","/APSshare/epics/synApps_6_3/support/dxp-R6-1")
-epicsEnvSet("DXPSITORO","/APSshare/epics/synApps_6_3/support/dxpSITORO-R1-3")
-epicsEnvSet("ETHERIP","/APSshare/epics/synApps_6_3/support/ether_ip-ether_ip-3-3")
-epicsEnvSet("GALIL","/APSshare/epics/synApps_6_3/support/Galil-3-0-V3-5")
-epicsEnvSet("IP","/APSshare/epics/synApps_6_3/support/ip-R2-22")
-epicsEnvSet("IP330","/APSshare/epics/synApps_6_3/support/ip330-R2-10")
-epicsEnvSet("IPAC","/APSshare/epics/synApps_6_3/support/ipac-2-16")
-epicsEnvSet("IPUNIDIG","/APSshare/epics/synApps_6_3/support/ipUnidig-R2-12")
-epicsEnvSet("LABJACK","/APSshare/epics/synApps_6_3/support/LabJack-R3-0")
-epicsEnvSet("LOVE","/APSshare/epics/synApps_6_3/support/love-R3-2-9")
-epicsEnvSet("LUA","/APSshare/epics/synApps_6_3/support/lua-R3-1")
-epicsEnvSet("MCA","/APSshare/epics/synApps_6_3/support/mca-R7-10")
-epicsEnvSet("MEASCOMP","/APSshare/epics/synApps_6_3/support/measComp-R4-2")
-epicsEnvSet("MODBUS","/APSshare/epics/synApps_6_3/support/modbus-R3-3")
-epicsEnvSet("MOTOR","/APSshare/epics/synApps_6_3/support/motor-R7-3-1")
-epicsEnvSet("OPTICS","/APSshare/epics/synApps_6_3/support/optics-R2-14")
-epicsEnvSet("QUADEM","/APSshare/epics/synApps_6_3/support/quadEM-R9-5")
-epicsEnvSet("SCALER","/APSshare/epics/synApps_6_3/support/scaler-4-1")
-epicsEnvSet("SNCSEQ","/APSshare/epics/synApps_6_3/support/sequencer-mirror-R2-2-9")
-epicsEnvSet("SOFTGLUE","/APSshare/epics/synApps_6_3/support/softGlue-R2-8-4")
-epicsEnvSet("SOFTGLUEZYNQ","/APSshare/epics/synApps_6_3/support/softGlueZynq-R2-0-5")
-epicsEnvSet("SSCAN","/APSshare/epics/synApps_6_3/support/sscan-R2-11-6")
-epicsEnvSet("STD","/APSshare/epics/synApps_6_3/support/std-R3-6-4")
-epicsEnvSet("STREAM","/APSshare/epics/synApps_6_3/support/StreamDevice-2-8-24")
-epicsEnvSet("VAC","/APSshare/epics/synApps_6_3/support/vac-R1-9-2")
-epicsEnvSet("VME","/APSshare/epics/synApps_6_3/support/vme-R2-9-5")
-epicsEnvSet("XSPRESS3","/APSshare/epics/synApps_6_3/support/xspress3-3-2-8")
-epicsEnvSet("XXX","/APSshare/epics/synApps_6_3/support/xxx-R6-3")
-epicsEnvSet("YOKOGAWA_DAS","/APSshare/epics/synApps_6_3/support/Yokogawa_DAS-R2-0-2")
-epicsEnvSet("ALLENBRADLEY","/APSshare/epics/synApps_6_3/support/allenBradley-2-3")
-epicsEnvSet("ADCORE","/APSshare/epics/synApps_6_3/support/areaDetector-R3-13/ADCore")
-epicsEnvSet("ADSUPPORT","/APSshare/epics/synApps_6_3/support/areaDetector-R3-13/ADSupport")
-epicsEnvSet("ULDAQ","/APSshare/epics/synApps_6_3/support/measComp-R4-2/libuldaq-1.2.1")
-epicsEnvSet("PYDEVICE","/net/s100dserv/xorApps/epics/synApps_6_3/support/PyDevice-git")
-epicsEnvSet("NDDRIVERSTDARRAYS","/APSshare/epics/synApps_6_3/support/areaDetector-R3-13/NDDriverStdArrays")
-epicsEnvSet("ADSIMDETECTOR","/APSshare/epics/synApps_6_3/support/areaDetector-R3-13/ADSimDetector")
-# Shell prompt
-epicsEnvSet("IOCSH_PS1", "$(IOC)> ")
-# prefix used for all PVs in this IOC
-epicsEnvSet("PREFIX", "100idPySBL:")
-#For devIocStats
-epicsEnvSet("ENGINEER", "M. Wyman")
-epicsEnvSet("LOCATION", "100id")
-epicsEnvSet("GROUP", "BCDA")
-# search path for database files
-epicsEnvSet("EPICS_DB_INCLUDE_PATH", ".")
-# search path for streamDevice protocol files
-epicsEnvSet("STREAM_PROTOCOL_PATH", ".")
-# search path for lua scripts
-# epicsEnvSet("LUA_SCRIPT_PATH", "./scripts")
-# Specify largest array CA will transport
-# Note for N doubles, need N*8 bytes+some overhead
-epicsEnvSet("EPICS_CA_MAX_ARRAY_BYTES", 64010)
-### save_restore setup, change SAVE_PATH if you are having autosave manage its own NFS mount
-iocshLoad("$(AUTOSAVE)/iocsh/autosave_settings.iocsh", "PREFIX=$(PREFIX), SAVE_PATH=$(TOP)/iocBoot/$(IOC)")
-dbLoadRecords("$(AUTOSAVE)/db/configMenu.db", "P=$(PREFIX), CONFIG=ADAutoSave")
-# Optional: load NDPluginPva plugin
-NDPvaConfigure("PVA1", $(QSIZE), 0, "$(PORT)", 0, $(PREFIX)Pva1:Image, 0, 0, 0)
-dbLoadRecords("NDPva.template",  "P=$(PREFIX),R=Pva1:, PORT=PVA1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-# Must start PVA server if this is enabled
-startPVAServer
-# Optional: load ffmpegServer plugin
-#ffmpegServerConfigure(8081)
-#ffmpegStreamConfigure("FfmStream1", 2, 0, "$(PORT)", 0, -1, 0)
-#dbLoadRecords("$(FFMPEGSERVER)/db/ffmpegStream.template", "P=$(PREFIX),R=ffmstream1:,PORT=FfmStream1,NDARRAY_PORT=$(PORT)")
-#ffmpegFileConfigure("FfmFile1", 16, 0, "$(PORT)", 0, -1, 0)
-#dbLoadRecords("$(FFMPEGSERVER)/db/ffmpegFile.template", "P=$(PREFIX),R=ffmfile1:,PORT=FfmFile1,NDARRAY_PORT=$(PORT)")
-# Optional: load NDPluginEdge plugin
-#NDEdgeConfigure("EDGE1", $(QSIZE), 0, "$(PORT)", 0, 0, 0, 0)
-#dbLoadRecords("$(ADPLUGINEDGE)/db/NDEdge.template",  "P=$(PREFIX),R=Edge1:, PORT=EDGE1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-#set_requestfile_path("$(ADPLUGINEDGE)/db")
-# Optional: load NDPluginCV plugin
-#NDCVConfigure("CV1", $(QSIZE), 0, "$(PORT)", 0, 0, 0, 0, 0, $(MAX_THREADS=5))
-#dbLoadRecords("$(ADCOMPVISION)/db/NDCV.template",  "P=$(PREFIX),R=CV1:, PORT=CV1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-#set_requestfile_path("$(ADCOMPVISION)/adcvApp/Db")
-# Optional: load NDPluginBar plugin
-#NDBarConfigure("BAR1", $(QSIZE), 0, "$(PORT)", 0, 0, 0, 0, 0, $(MAX_THREADS=5))
-#dbLoadRecords("$(ADPLUGINBAR)/db/NDBar.template",  "P=$(PREFIX),R=Bar1:, PORT=BAR1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-#set_requestfile_path("$(ADPLUGINBAR)/barApp/Db")
-# Optional: load scan records
-#dbLoadRecords("$(SSCAN)/sscanApp/Db/scan.db", "P=$(PREFIX),MAXPTS1=2000,MAXPTS2=200,MAXPTS3=20,MAXPTS4=10,MAXPTSH=10")
-#set_requestfile_path("$(SSCAN)/sscanApp/Db")
-# Optional: load sseq record for acquisition sequence
-#dbLoadRecords("$(CALC)/calcApp/Db/sseqRecord.db", "P=$(PREFIX), S=AcquireSequence")
-#set_requestfile_path("$(CALC)/calcApp/Db")
-# Optional: load devIocStats records (requires DEVIOCSTATS module)
-#dbLoadRecords("$(DEVIOCSTATS)/db/iocAdminSoft.db", "IOC=$(PREFIX)")
-# Optional: load alive record (requires ALIVE module)
-#dbLoadRecords("$(ALIVE)/aliveApp/Db/alive.db", "P=$(PREFIX),RHOST=164.54.100.11")
-# Set the callback queue size to 5000, up from default of 2000 in base.
-# This can be needed to avoid errors "callbackRequest: cbLow ring buffer full".
-callbackSetQueueSize(5000)
-doAfterIocInit("dbpf('100idPySBL:NDSA:NDimensions', '2')")
-#Shouldn't need a simdet as NDSA comes with image plugin; however, adding 
-#one to test some pycalc ideas
-#iocshLoad("iocsh/ADSimDetector.iocsh", "PREFIX=$(PREFIX), INSTANCE=SIM1")
-###############################################################################
-iocInit
-###############################################################################
-# write all the PV names to a local file
-dbl > dbl-all.txt
-# Diagnostic: CA links in all records
-dbcar(0,1)
-# print the time our boot was finished
-date
-exit
-# Linux startup script
-< envPaths
-dbLoadRecords("$(AUTOSAVE)/db/configMenu.db", "P=$(PREFIX), CONFIG=ADAutoSave")
-# Optional: load NDPluginPva plugin
-NDPvaConfigure("PVA1", $(QSIZE), 0, "$(PORT)", 0, $(PREFIX)Pva1:Image, 0, 0, 0)
-dbLoadRecords("NDPva.template",  "P=$(PREFIX),R=Pva1:, PORT=PVA1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-# Must start PVA server if this is enabled
-startPVAServer
-# Optional: load ffmpegServer plugin
-#ffmpegServerConfigure(8081)
-#ffmpegStreamConfigure("FfmStream1", 2, 0, "$(PORT)", 0, -1, 0)
-#dbLoadRecords("$(FFMPEGSERVER)/db/ffmpegStream.template", "P=$(PREFIX),R=ffmstream1:,PORT=FfmStream1,NDARRAY_PORT=$(PORT)")
-#ffmpegFileConfigure("FfmFile1", 16, 0, "$(PORT)", 0, -1, 0)
-#dbLoadRecords("$(FFMPEGSERVER)/db/ffmpegFile.template", "P=$(PREFIX),R=ffmfile1:,PORT=FfmFile1,NDARRAY_PORT=$(PORT)")
-# Optional: load NDPluginEdge plugin
-#NDEdgeConfigure("EDGE1", $(QSIZE), 0, "$(PORT)", 0, 0, 0, 0)
-#dbLoadRecords("$(ADPLUGINEDGE)/db/NDEdge.template",  "P=$(PREFIX),R=Edge1:, PORT=EDGE1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-#set_requestfile_path("$(ADPLUGINEDGE)/db")
-# Optional: load NDPluginCV plugin
-#NDCVConfigure("CV1", $(QSIZE), 0, "$(PORT)", 0, 0, 0, 0, 0, $(MAX_THREADS=5))
-#dbLoadRecords("$(ADCOMPVISION)/db/NDCV.template",  "P=$(PREFIX),R=CV1:, PORT=CV1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-#set_requestfile_path("$(ADCOMPVISION)/adcvApp/Db")
-# Optional: load NDPluginBar plugin
-#NDBarConfigure("BAR1", $(QSIZE), 0, "$(PORT)", 0, 0, 0, 0, 0, $(MAX_THREADS=5))
-#dbLoadRecords("$(ADPLUGINBAR)/db/NDBar.template",  "P=$(PREFIX),R=Bar1:, PORT=BAR1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-#set_requestfile_path("$(ADPLUGINBAR)/barApp/Db")
-# Optional: load scan records
-#dbLoadRecords("$(SSCAN)/sscanApp/Db/scan.db", "P=$(PREFIX),MAXPTS1=2000,MAXPTS2=200,MAXPTS3=20,MAXPTS4=10,MAXPTSH=10")
-#set_requestfile_path("$(SSCAN)/sscanApp/Db")
-# Optional: load sseq record for acquisition sequence
-#dbLoadRecords("$(CALC)/calcApp/Db/sseqRecord.db", "P=$(PREFIX), S=AcquireSequence")
-#set_requestfile_path("$(CALC)/calcApp/Db")
-# Optional: load devIocStats records (requires DEVIOCSTATS module)
-#dbLoadRecords("$(DEVIOCSTATS)/db/iocAdminSoft.db", "IOC=$(PREFIX)")
-# Optional: load alive record (requires ALIVE module)
-#dbLoadRecords("$(ALIVE)/aliveApp/Db/alive.db", "P=$(PREFIX),RHOST=164.54.100.11")
-# Set the callback queue size to 5000, up from default of 2000 in base.
-# This can be needed to avoid errors "callbackRequest: cbLow ring buffer full".
-callbackSetQueueSize(5000)
-doAfterIocInit("dbpf('100idPySBL:NDSA:NDimensions', '2')")
-#Shouldn't need a simdet as NDSA comes with image plugin; however, adding 
-#one to test some pycalc ideas
-#iocshLoad("iocsh/ADSimDetector.iocsh", "PREFIX=$(PREFIX), INSTANCE=SIM1")
-###############################################################################
-iocInit
-###############################################################################
-# write all the PV names to a local file
-dbl > dbl-all.txt
-# Diagnostic: CA links in all records
-dbcar(0,1)
-# print the time our boot was finished
-date
-exit
-epicsEnvSet("IOC","ioc100idPySBL")
-epicsEnvSet("TOP","/net/s100dserv/xorApps/epics/synApps_6_3/ioc/100idPy")
-epicsEnvSet("SUPPORT","/APSshare/epics/synApps_6_3/support")
-epicsEnvSet("LOCAL_SUPPORT","/net/s100dserv/xorApps/epics/synApps_6_3/support")
-epicsEnvSet("EPICS_BASE","/APSshare/epics/base-7.0.8")
-epicsEnvSet("ALIVE","/APSshare/epics/synApps_6_3/support/alive-R1-4-1")
-epicsEnvSet("AREA_DETECTOR","/APSshare/epics/synApps_6_3/support/areaDetector-R3-13")
-epicsEnvSet("ASYN","/APSshare/epics/synApps_6_3/support/asyn-R4-44-2")
-epicsEnvSet("AUTOSAVE","/APSshare/epics/synApps_6_3/support/autosave-R5-11")
-epicsEnvSet("BUSY","/APSshare/epics/synApps_6_3/support/busy-R1-7-4")
-epicsEnvSet("CALC","/APSshare/epics/synApps_6_3/support/calc-R3-7-5")
-epicsEnvSet("CAMAC","/APSshare/epics/synApps_6_3/support/camac-R2-7-5")
-epicsEnvSet("CAPUTRECORDER","/APSshare/epics/synApps_6_3/support/caputRecorder-R1-7-6")
-epicsEnvSet("DAC128V","/APSshare/epics/synApps_6_3/support/dac128V-R2-10-1")
-epicsEnvSet("DANTE","/APSshare/epics/synApps_6_3/support/Dante-R1-1")
-epicsEnvSet("DELAYGEN","/APSshare/epics/synApps_6_3/support/delaygen-R1-2-4")
-epicsEnvSet("DEVIOCSTATS","/APSshare/epics/synApps_6_3/support/iocStats-3-1-16")
-epicsEnvSet("DXP","/APSshare/epics/synApps_6_3/support/dxp-R6-1")
-epicsEnvSet("DXPSITORO","/APSshare/epics/synApps_6_3/support/dxpSITORO-R1-3")
-epicsEnvSet("ETHERIP","/APSshare/epics/synApps_6_3/support/ether_ip-ether_ip-3-3")
-epicsEnvSet("GALIL","/APSshare/epics/synApps_6_3/support/Galil-3-0-V3-5")
-epicsEnvSet("IP","/APSshare/epics/synApps_6_3/support/ip-R2-22")
-epicsEnvSet("IP330","/APSshare/epics/synApps_6_3/support/ip330-R2-10")
-epicsEnvSet("IPAC","/APSshare/epics/synApps_6_3/support/ipac-2-16")
-epicsEnvSet("IPUNIDIG","/APSshare/epics/synApps_6_3/support/ipUnidig-R2-12")
-epicsEnvSet("LABJACK","/APSshare/epics/synApps_6_3/support/LabJack-R3-0")
-epicsEnvSet("LOVE","/APSshare/epics/synApps_6_3/support/love-R3-2-9")
-epicsEnvSet("LUA","/APSshare/epics/synApps_6_3/support/lua-R3-1")
-epicsEnvSet("MCA","/APSshare/epics/synApps_6_3/support/mca-R7-10")
-epicsEnvSet("MEASCOMP","/APSshare/epics/synApps_6_3/support/measComp-R4-2")
-epicsEnvSet("MODBUS","/APSshare/epics/synApps_6_3/support/modbus-R3-3")
-epicsEnvSet("MOTOR","/APSshare/epics/synApps_6_3/support/motor-R7-3-1")
-epicsEnvSet("OPTICS","/APSshare/epics/synApps_6_3/support/optics-R2-14")
-epicsEnvSet("QUADEM","/APSshare/epics/synApps_6_3/support/quadEM-R9-5")
-epicsEnvSet("SCALER","/APSshare/epics/synApps_6_3/support/scaler-4-1")
-epicsEnvSet("SNCSEQ","/APSshare/epics/synApps_6_3/support/sequencer-mirror-R2-2-9")
-epicsEnvSet("SOFTGLUE","/APSshare/epics/synApps_6_3/support/softGlue-R2-8-4")
-epicsEnvSet("SOFTGLUEZYNQ","/APSshare/epics/synApps_6_3/support/softGlueZynq-R2-0-5")
-epicsEnvSet("SSCAN","/APSshare/epics/synApps_6_3/support/sscan-R2-11-6")
-epicsEnvSet("STD","/APSshare/epics/synApps_6_3/support/std-R3-6-4")
-epicsEnvSet("STREAM","/APSshare/epics/synApps_6_3/support/StreamDevice-2-8-24")
-epicsEnvSet("VAC","/APSshare/epics/synApps_6_3/support/vac-R1-9-2")
-epicsEnvSet("VME","/APSshare/epics/synApps_6_3/support/vme-R2-9-5")
-epicsEnvSet("XSPRESS3","/APSshare/epics/synApps_6_3/support/xspress3-3-2-8")
-epicsEnvSet("XXX","/APSshare/epics/synApps_6_3/support/xxx-R6-3")
-epicsEnvSet("YOKOGAWA_DAS","/APSshare/epics/synApps_6_3/support/Yokogawa_DAS-R2-0-2")
-epicsEnvSet("ALLENBRADLEY","/APSshare/epics/synApps_6_3/support/allenBradley-2-3")
-epicsEnvSet("ADCORE","/APSshare/epics/synApps_6_3/support/areaDetector-R3-13/ADCore")
-epicsEnvSet("ADSUPPORT","/APSshare/epics/synApps_6_3/support/areaDetector-R3-13/ADSupport")
-epicsEnvSet("ULDAQ","/APSshare/epics/synApps_6_3/support/measComp-R4-2/libuldaq-1.2.1")
-epicsEnvSet("PYDEVICE","/net/s100dserv/xorApps/epics/synApps_6_3/support/PyDevice-git")
-epicsEnvSet("NDDRIVERSTDARRAYS","/APSshare/epics/synApps_6_3/support/areaDetector-R3-13/NDDriverStdArrays")
-epicsEnvSet("ADSIMDETECTOR","/APSshare/epics/synApps_6_3/support/areaDetector-R3-13/ADSimDetector")
-# Increase size of buffer for error logging from default 1256
-errlogInit(20000)
-################################################################################
-# PYTHONPATH points to folders where Python modules are.
-# Needs to be done before dbd load, so moved to st.cmd
-epicsEnvSet("PYTHONPATH","$(TOP)/100idPyApp/python")
-################################################################################
-# Tell EPICS all about the record types, device-support modules, drivers,
-# etc. in the software we just loaded (100idPy.munch)
-dbLoadDatabase("../../dbd/ioc100idPyLinux.dbd")
-ioc100idPyLinux_registerRecordDeviceDriver(pdbbase)
-< settings.iocsh
-dbLoadRecords("$(AUTOSAVE)/db/configMenu.db", "P=$(PREFIX), CONFIG=ADAutoSave")
-# Optional: load NDPluginPva plugin
-NDPvaConfigure("PVA1", $(QSIZE), 0, "$(PORT)", 0, $(PREFIX)Pva1:Image, 0, 0, 0)
-dbLoadRecords("NDPva.template",  "P=$(PREFIX),R=Pva1:, PORT=PVA1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-# Must start PVA server if this is enabled
-startPVAServer
-# Optional: load ffmpegServer plugin
-#ffmpegServerConfigure(8081)
-#ffmpegStreamConfigure("FfmStream1", 2, 0, "$(PORT)", 0, -1, 0)
-#dbLoadRecords("$(FFMPEGSERVER)/db/ffmpegStream.template", "P=$(PREFIX),R=ffmstream1:,PORT=FfmStream1,NDARRAY_PORT=$(PORT)")
-#ffmpegFileConfigure("FfmFile1", 16, 0, "$(PORT)", 0, -1, 0)
-#dbLoadRecords("$(FFMPEGSERVER)/db/ffmpegFile.template", "P=$(PREFIX),R=ffmfile1:,PORT=FfmFile1,NDARRAY_PORT=$(PORT)")
-# Optional: load NDPluginEdge plugin
-#NDEdgeConfigure("EDGE1", $(QSIZE), 0, "$(PORT)", 0, 0, 0, 0)
-#dbLoadRecords("$(ADPLUGINEDGE)/db/NDEdge.template",  "P=$(PREFIX),R=Edge1:, PORT=EDGE1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-#set_requestfile_path("$(ADPLUGINEDGE)/db")
-# Optional: load NDPluginCV plugin
-#NDCVConfigure("CV1", $(QSIZE), 0, "$(PORT)", 0, 0, 0, 0, 0, $(MAX_THREADS=5))
-#dbLoadRecords("$(ADCOMPVISION)/db/NDCV.template",  "P=$(PREFIX),R=CV1:, PORT=CV1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-#set_requestfile_path("$(ADCOMPVISION)/adcvApp/Db")
-# Optional: load NDPluginBar plugin
-#NDBarConfigure("BAR1", $(QSIZE), 0, "$(PORT)", 0, 0, 0, 0, 0, $(MAX_THREADS=5))
-#dbLoadRecords("$(ADPLUGINBAR)/db/NDBar.template",  "P=$(PREFIX),R=Bar1:, PORT=BAR1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-#set_requestfile_path("$(ADPLUGINBAR)/barApp/Db")
-# Optional: load scan records
-#dbLoadRecords("$(SSCAN)/sscanApp/Db/scan.db", "P=$(PREFIX),MAXPTS1=2000,MAXPTS2=200,MAXPTS3=20,MAXPTS4=10,MAXPTSH=10")
-#set_requestfile_path("$(SSCAN)/sscanApp/Db")
-# Optional: load sseq record for acquisition sequence
-#dbLoadRecords("$(CALC)/calcApp/Db/sseqRecord.db", "P=$(PREFIX), S=AcquireSequence")
-#set_requestfile_path("$(CALC)/calcApp/Db")
-# Optional: load devIocStats records (requires DEVIOCSTATS module)
-#dbLoadRecords("$(DEVIOCSTATS)/db/iocAdminSoft.db", "IOC=$(PREFIX)")
-# Optional: load alive record (requires ALIVE module)
-#dbLoadRecords("$(ALIVE)/aliveApp/Db/alive.db", "P=$(PREFIX),RHOST=164.54.100.11")
-# Set the callback queue size to 5000, up from default of 2000 in base.
-# This can be needed to avoid errors "callbackRequest: cbLow ring buffer full".
-callbackSetQueueSize(5000)
-doAfterIocInit("dbpf('100idPySBL:NDSA:NDimensions', '2')")
-#Shouldn't need a simdet as NDSA comes with image plugin; however, adding 
-#one to test some pycalc ideas
-#iocshLoad("iocsh/ADSimDetector.iocsh", "PREFIX=$(PREFIX), INSTANCE=SIM1")
-###############################################################################
-iocInit
-###############################################################################
-# write all the PV names to a local file
-dbl > dbl-all.txt
-# Diagnostic: CA links in all records
-dbcar(0,1)
-# print the time our boot was finished
-date
-exit
-# Linux startup script
-< envPaths
-dbLoadRecords("$(AUTOSAVE)/db/configMenu.db", "P=$(PREFIX), CONFIG=ADAutoSave")
-# Optional: load NDPluginPva plugin
-NDPvaConfigure("PVA1", $(QSIZE), 0, "$(PORT)", 0, $(PREFIX)Pva1:Image, 0, 0, 0)
-dbLoadRecords("NDPva.template",  "P=$(PREFIX),R=Pva1:, PORT=PVA1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-# Must start PVA server if this is enabled
-startPVAServer
-# Optional: load ffmpegServer plugin
-#ffmpegServerConfigure(8081)
-#ffmpegStreamConfigure("FfmStream1", 2, 0, "$(PORT)", 0, -1, 0)
-#dbLoadRecords("$(FFMPEGSERVER)/db/ffmpegStream.template", "P=$(PREFIX),R=ffmstream1:,PORT=FfmStream1,NDARRAY_PORT=$(PORT)")
-#ffmpegFileConfigure("FfmFile1", 16, 0, "$(PORT)", 0, -1, 0)
-#dbLoadRecords("$(FFMPEGSERVER)/db/ffmpegFile.template", "P=$(PREFIX),R=ffmfile1:,PORT=FfmFile1,NDARRAY_PORT=$(PORT)")
-# Optional: load NDPluginEdge plugin
-#NDEdgeConfigure("EDGE1", $(QSIZE), 0, "$(PORT)", 0, 0, 0, 0)
-#dbLoadRecords("$(ADPLUGINEDGE)/db/NDEdge.template",  "P=$(PREFIX),R=Edge1:, PORT=EDGE1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-#set_requestfile_path("$(ADPLUGINEDGE)/db")
-# Optional: load NDPluginCV plugin
-#NDCVConfigure("CV1", $(QSIZE), 0, "$(PORT)", 0, 0, 0, 0, 0, $(MAX_THREADS=5))
-#dbLoadRecords("$(ADCOMPVISION)/db/NDCV.template",  "P=$(PREFIX),R=CV1:, PORT=CV1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-#set_requestfile_path("$(ADCOMPVISION)/adcvApp/Db")
-# Optional: load NDPluginBar plugin
-#NDBarConfigure("BAR1", $(QSIZE), 0, "$(PORT)", 0, 0, 0, 0, 0, $(MAX_THREADS=5))
-#dbLoadRecords("$(ADPLUGINBAR)/db/NDBar.template",  "P=$(PREFIX),R=Bar1:, PORT=BAR1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-#set_requestfile_path("$(ADPLUGINBAR)/barApp/Db")
-# Optional: load scan records
-#dbLoadRecords("$(SSCAN)/sscanApp/Db/scan.db", "P=$(PREFIX),MAXPTS1=2000,MAXPTS2=200,MAXPTS3=20,MAXPTS4=10,MAXPTSH=10")
-#set_requestfile_path("$(SSCAN)/sscanApp/Db")
-# Optional: load sseq record for acquisition sequence
-#dbLoadRecords("$(CALC)/calcApp/Db/sseqRecord.db", "P=$(PREFIX), S=AcquireSequence")
-#set_requestfile_path("$(CALC)/calcApp/Db")
-# Optional: load devIocStats records (requires DEVIOCSTATS module)
-#dbLoadRecords("$(DEVIOCSTATS)/db/iocAdminSoft.db", "IOC=$(PREFIX)")
-# Optional: load alive record (requires ALIVE module)
-#dbLoadRecords("$(ALIVE)/aliveApp/Db/alive.db", "P=$(PREFIX),RHOST=164.54.100.11")
-# Set the callback queue size to 5000, up from default of 2000 in base.
-# This can be needed to avoid errors "callbackRequest: cbLow ring buffer full".
-callbackSetQueueSize(5000)
-doAfterIocInit("dbpf('100idPySBL:NDSA:NDimensions', '2')")
-#Shouldn't need a simdet as NDSA comes with image plugin; however, adding 
-#one to test some pycalc ideas
-#iocshLoad("iocsh/ADSimDetector.iocsh", "PREFIX=$(PREFIX), INSTANCE=SIM1")
-###############################################################################
-iocInit
-###############################################################################
-# write all the PV names to a local file
-dbl > dbl-all.txt
-# Diagnostic: CA links in all records
-dbcar(0,1)
-# print the time our boot was finished
-date
-exit
-epicsEnvSet("IOC","ioc100idPySBL")
-epicsEnvSet("TOP","/net/s100dserv/xorApps/epics/synApps_6_3/ioc/100idPy")
-epicsEnvSet("SUPPORT","/APSshare/epics/synApps_6_3/support")
-epicsEnvSet("LOCAL_SUPPORT","/net/s100dserv/xorApps/epics/synApps_6_3/support")
-epicsEnvSet("EPICS_BASE","/APSshare/epics/base-7.0.8")
-epicsEnvSet("ALIVE","/APSshare/epics/synApps_6_3/support/alive-R1-4-1")
-epicsEnvSet("AREA_DETECTOR","/APSshare/epics/synApps_6_3/support/areaDetector-R3-13")
-epicsEnvSet("ASYN","/APSshare/epics/synApps_6_3/support/asyn-R4-44-2")
-epicsEnvSet("AUTOSAVE","/APSshare/epics/synApps_6_3/support/autosave-R5-11")
-epicsEnvSet("BUSY","/APSshare/epics/synApps_6_3/support/busy-R1-7-4")
-epicsEnvSet("CALC","/APSshare/epics/synApps_6_3/support/calc-R3-7-5")
-epicsEnvSet("CAMAC","/APSshare/epics/synApps_6_3/support/camac-R2-7-5")
-epicsEnvSet("CAPUTRECORDER","/APSshare/epics/synApps_6_3/support/caputRecorder-R1-7-6")
-epicsEnvSet("DAC128V","/APSshare/epics/synApps_6_3/support/dac128V-R2-10-1")
-epicsEnvSet("DANTE","/APSshare/epics/synApps_6_3/support/Dante-R1-1")
-epicsEnvSet("DELAYGEN","/APSshare/epics/synApps_6_3/support/delaygen-R1-2-4")
-epicsEnvSet("DEVIOCSTATS","/APSshare/epics/synApps_6_3/support/iocStats-3-1-16")
-epicsEnvSet("DXP","/APSshare/epics/synApps_6_3/support/dxp-R6-1")
-epicsEnvSet("DXPSITORO","/APSshare/epics/synApps_6_3/support/dxpSITORO-R1-3")
-epicsEnvSet("ETHERIP","/APSshare/epics/synApps_6_3/support/ether_ip-ether_ip-3-3")
-epicsEnvSet("GALIL","/APSshare/epics/synApps_6_3/support/Galil-3-0-V3-5")
-epicsEnvSet("IP","/APSshare/epics/synApps_6_3/support/ip-R2-22")
-epicsEnvSet("IP330","/APSshare/epics/synApps_6_3/support/ip330-R2-10")
-epicsEnvSet("IPAC","/APSshare/epics/synApps_6_3/support/ipac-2-16")
-epicsEnvSet("IPUNIDIG","/APSshare/epics/synApps_6_3/support/ipUnidig-R2-12")
-epicsEnvSet("LABJACK","/APSshare/epics/synApps_6_3/support/LabJack-R3-0")
-epicsEnvSet("LOVE","/APSshare/epics/synApps_6_3/support/love-R3-2-9")
-epicsEnvSet("LUA","/APSshare/epics/synApps_6_3/support/lua-R3-1")
-epicsEnvSet("MCA","/APSshare/epics/synApps_6_3/support/mca-R7-10")
-epicsEnvSet("MEASCOMP","/APSshare/epics/synApps_6_3/support/measComp-R4-2")
-epicsEnvSet("MODBUS","/APSshare/epics/synApps_6_3/support/modbus-R3-3")
-epicsEnvSet("MOTOR","/APSshare/epics/synApps_6_3/support/motor-R7-3-1")
-epicsEnvSet("OPTICS","/APSshare/epics/synApps_6_3/support/optics-R2-14")
-epicsEnvSet("QUADEM","/APSshare/epics/synApps_6_3/support/quadEM-R9-5")
-epicsEnvSet("SCALER","/APSshare/epics/synApps_6_3/support/scaler-4-1")
-epicsEnvSet("SNCSEQ","/APSshare/epics/synApps_6_3/support/sequencer-mirror-R2-2-9")
-epicsEnvSet("SOFTGLUE","/APSshare/epics/synApps_6_3/support/softGlue-R2-8-4")
-epicsEnvSet("SOFTGLUEZYNQ","/APSshare/epics/synApps_6_3/support/softGlueZynq-R2-0-5")
-epicsEnvSet("SSCAN","/APSshare/epics/synApps_6_3/support/sscan-R2-11-6")
-epicsEnvSet("STD","/APSshare/epics/synApps_6_3/support/std-R3-6-4")
-epicsEnvSet("STREAM","/APSshare/epics/synApps_6_3/support/StreamDevice-2-8-24")
-epicsEnvSet("VAC","/APSshare/epics/synApps_6_3/support/vac-R1-9-2")
-epicsEnvSet("VME","/APSshare/epics/synApps_6_3/support/vme-R2-9-5")
-epicsEnvSet("XSPRESS3","/APSshare/epics/synApps_6_3/support/xspress3-3-2-8")
-epicsEnvSet("XXX","/APSshare/epics/synApps_6_3/support/xxx-R6-3")
-epicsEnvSet("YOKOGAWA_DAS","/APSshare/epics/synApps_6_3/support/Yokogawa_DAS-R2-0-2")
-epicsEnvSet("ALLENBRADLEY","/APSshare/epics/synApps_6_3/support/allenBradley-2-3")
-epicsEnvSet("ADCORE","/APSshare/epics/synApps_6_3/support/areaDetector-R3-13/ADCore")
-epicsEnvSet("ADSUPPORT","/APSshare/epics/synApps_6_3/support/areaDetector-R3-13/ADSupport")
-epicsEnvSet("ULDAQ","/APSshare/epics/synApps_6_3/support/measComp-R4-2/libuldaq-1.2.1")
-epicsEnvSet("PYDEVICE","/net/s100dserv/xorApps/epics/synApps_6_3/support/PyDevice-git")
-epicsEnvSet("NDDRIVERSTDARRAYS","/APSshare/epics/synApps_6_3/support/areaDetector-R3-13/NDDriverStdArrays")
-epicsEnvSet("ADSIMDETECTOR","/APSshare/epics/synApps_6_3/support/areaDetector-R3-13/ADSimDetector")
-# Shell prompt
-epicsEnvSet("IOCSH_PS1", "$(IOC)> ")
-# prefix used for all PVs in this IOC
-epicsEnvSet("PREFIX", "100idPySBL:")
-#For devIocStats
-epicsEnvSet("ENGINEER", "M. Wyman")
-epicsEnvSet("LOCATION", "100id")
-epicsEnvSet("GROUP", "BCDA")
-# search path for database files
-epicsEnvSet("EPICS_DB_INCLUDE_PATH", ".")
-# search path for streamDevice protocol files
-epicsEnvSet("STREAM_PROTOCOL_PATH", ".")
-# search path for lua scripts
-# epicsEnvSet("LUA_SCRIPT_PATH", "./scripts")
-# Specify largest array CA will transport
-# Note for N doubles, need N*8 bytes+some overhead
-epicsEnvSet("EPICS_CA_MAX_ARRAY_BYTES", 64010)
-# ### autosave_settings.iocsh ###
-#- ###################################################
-#- PREFIX         - IOC Prefix
-#- AUTOSAVE       - Location of autosave module
-#- SAVE_PATH      - Location to create autosave directory where files will be saved
-#- INCOMPLETE     - Optional: Ok to save/restore save sets with missing values?
-#-                  Default: 1
-#-
-#- DATED_BACKUP   - Optional: Save dated backup files?
-#-                  Default: 1
-#-
-#- CA_RECONNECT   - Optional: Retry connecting to PVs whose initial connection attempt failed?
-#-                  Default: 1
-#-
-#- NUM_SEQ        - Optional: Number of sequenced backup files to write
-#-                  Default: 3
-#-
-#- SEQ_PERIOD     - Optional: Time interval in seconds between sequenced backups
-#-                - Default: 300
-#- ###################################################
-set_savefile_path("$(SAVE_PATH)", "autosave")
-#- Add save path and autosave to list of directories to find files
-set_requestfile_path("$(SAVE_PATH)", "")
-set_requestfile_path("$(AUTOSAVE)", "asApp/Db")
-save_restoreSet_status_prefix("$(PREFIX)")
-save_restoreSet_CAReconnect($(CA_RECONNECT=1))
-save_restoreSet_IncompleteSetsOk($(INCOMPLETE=1))
-save_restoreSet_DatedBackupFiles($(DATED_BACKUP=1))
-save_restoreSet_NumSeqFiles($(NUM_SEQ=3))
-save_restoreSet_SeqPeriodInSeconds($(SEQ_PERIOD=300))
-#- Time interval in seconds between forced save-file writes.  (-1 means forever).
-#- This is intended to get save files written even if the normal trigger mechanism is broken.
-save_restoreSet_CallbackTimeout(-1)
-dbLoadRecords("$(AUTOSAVE)/asApp/Db/save_restoreStatus.db", "P=$(PREFIX), DEAD_SECONDS=5")
-# ### save_restore.iocsh ###
-#- ###################################################
-#- PREFIX         - IOC Prefix
-#- POSITIONS_FILE - Name of positions file, script will search for $(POSITIONS_FILE).req, 
-#-                  saved positions will be in $(POSITIONS_FILE).sav
-#-                  macro PREFIX will be defined for the file
-#- SETTINGS_FILE  - Name of settings file, script will search for $(SETTINGS_FILE).req, 
-#-                  saved settings will be in $(SETTINGS_FILE).sav
-#-                  macro PREFIX will be defined for the file
-#- AUTOSAVE       - Location of Autosave module
-#- POSITION_PERIOD- Optional: Time interval in seconds between saving positions
-#-                - Default: 5
-#- 
-#- SETTING_PERIOD - Optional: Time interval in seconds between saving settings
-#-                - Default: 30
-#- ###################################################
-#- Specify what save files should be restored.  Note these files must be
-#- in the directory specified in set_savefile_path(), or, if that function
-#- has not been called, from the directory current when iocInit is invoked
-set_pass0_restoreFile("$(POSITIONS_FILE).sav")
-set_pass0_restoreFile("$(SETTINGS_FILE).sav")
-set_pass1_restoreFile("$(SETTINGS_FILE).sav")
-#- Note doAfterIocInit() supplied by std module.
-doAfterIocInit("create_monitor_set('$(POSITIONS_FILE).req',$(POSITION_PERIOD=5),'P=$(PREFIX)')")
-doAfterIocInit("create_monitor_set('$(SETTINGS_FILE).req',$(SETTING_PERIOD=30),'P=$(PREFIX)')")
-#- Debug-output level
-save_restoreSet_Debug(0)
-# ### autosaveBuild.iocsh ###
-#- ###################################################
-#- PREFIX         - IOC Prefix
-#- BUILD_PATH     - Optional: Location to create BUILT_SETTINGS and BUILT_POSITIONS
-#-                  Default: Current Directory
-#- AUTOSAVE       - Location of Autosave module
-#- POSITION_PERIOD- Optional: Time interval in seconds between saving positions
-#-                - Default: 5
-#- 
-#- SETTING_PERIOD - Optional: Time interval in seconds between saving settings
-#-                - Default: 30
-#- ###################################################
-#- Specify what save files should be restored.  Note these files must be
-#- in the directory specified in set_savefile_path(), or, if that function
-#- has not been called, from the directory current when iocInit is invoked
-set_pass0_restoreFile("built_positions.sav")
-set_pass0_restoreFile("built_settings.sav")
-set_pass1_restoreFile("built_settings.sav")
-#- Note doAfterIocInit() supplied by std module.
-doAfterIocInit("create_monitor_set('built_positions.req',$(POSITION_PERIOD=5), P=$(PREFIX))")
-doAfterIocInit("create_monitor_set('built_settings.req',$(SETTING_PERIOD=30), P=$(PREFIX))")
-#- Debug-output level
-save_restoreSet_Debug(0)
-#- Tell autosave to automatically build built_settings.req and
-#- built_positions.req from databases and macros supplied to dbLoadRecords()
-#- (and dbLoadTemplate(), which calls dbLoadRecords()).
-#- This requires EPICS 3.15.1 or later, or 3.14 patched as described in
-#- autosave R5-5 documentation.
-epicsEnvSet("BUILT_SETTINGS", "built_settings.req")
-epicsEnvSet("BUILT_POSITIONS", "built_positions.req")
-autosaveBuild("$(BUILD_PATH=.)/$(BUILT_SETTINGS)", "_settings.req", 1)
-autosaveBuild("$(BUILD_PATH=.)/$(BUILT_POSITIONS)", "_positions.req", 1)
-set_requestfile_path("$(BUILD_PATH=.)")
-# ### caputRecorder.iocsh ###
-#- ###################################################
-#- PREFIX         - IOC Prefix
-#- CAPUTRECORDER  - Location of caputRecorder module
-#-
-#- SIZE           - Optional: Manages the size of certain elements
-#-                            in the caputRecorder database
-#-                  Default: 300
-#- ###################################################
-#- trap listener
-dbLoadRecords("$(CAPUTRECORDER)/caputRecorderApp/Db/caputPoster.db","P=$(PREFIX),N=300")
-doAfterIocInit("registerCaputRecorderTrapListener('$(PREFIX)caputRecorderCommand')")
-#- GUI database
-dbLoadRecords("$(CAPUTRECORDER)/caputRecorderApp/Db/caputRecorder.db","P=$(PREFIX),N=300")
-# ### sscan.iocsh ###
-#- ###################################################
-#- PREFIX         - IOC Prefix
-#- SSCAN          - Location of sscan module
-#- MAX_PTS        - Optional: Maximum number of scan points 
-#-                            for all dimensions
-#-                  Default: 1000
-#-
-#- MAX_PTS1       - Optional: Maximum number of scan points
-#-                            for first dimension
-#-                  Default: $(MAX_PTS)
-#-
-#- MAX_PTS2       - Optional: Maximum number of scan points
-#-                            for second dimension
-#-                  Default: $(MAX_PTS)
-#-
-#- MAX_PTS3       - Optional: Maximum number of scan points
-#-                            for third dimension
-#-                  Default: $(MAX_PTS)
-#-
-#- MAX_PTS4       - Optional: Maximum number of scan points
-#-                            for fourth dimension
-#-                  Default: $(MAX_PTS)
-#-
-#- MAX_PTSH       - Optional: Maximum number of scan points
-#-                            for H dimension
-#-                  Default: $(MAX_PTS)
-#-
-#- REQ_FILE       - Optional: Name of saveData req file
-#-                  Default: saveData.req
-#- ###################################################
-#- ### Scan-support software
-#- crate-resident scan.  This executes 1D, 2D, 3D, and 4D scans, and caches
-#- 1D data, but it doesn't store anything to disk.  (See 'saveData' below for that.)
-dbLoadRecords("$(SSCAN)/sscanApp/Db/standardScans.db","P=$(PREFIX),MAXPTS1=$(MAX_PTS1=$(MAX_PTS=1000)),MAXPTS2=$(MAX_PTS2=$(MAX_PTS=1000)),MAXPTS3=$(MAX_PTS3=$(MAX_PTS=1000)),MAXPTS4=$(MAX_PTS4=$(MAX_PTS=1000)),MAXPTSH=$(MAX_PTSH=$(MAX_PTS=1000))")
-#- Start the saveData task.  If you start this task, scan records mentioned
-#- in saveData.req will *always* write data files.  There is no programmable
-#- disable for this software.
-dbLoadRecords("$(SSCAN)/sscanApp/Db/saveData.db","P=$(PREFIX)")
-doAfterIocInit("saveData_Init('$(REQ_FILE=saveData.req)', 'P=$(PREFIX)')")
-dbLoadRecords("$(SSCAN)/sscanApp/Db/scanProgress.db","P=$(PREFIX)scanProgress:")
-doAfterIocInit("seq &scanProgress, 'S=$(PREFIX), P=$(PREFIX)scanProgress:'")
-# ### configMenu.iocsh ###
-#- ###################################################
-#- PREFIX         - IOC Prefix
-#- CONFIG         - Menu name, will search for $(CONFIG)Menu.req
-#- AUTOSAVE       - Location of autosave module
-#- ###################################################
-#- configMenu example.
-dbLoadRecords("$(AUTOSAVE)/asApp/Db/configMenu.db","P=$(PREFIX),CONFIG=$(CONFIG)")
-#- Note that the request file MUST be named $(CONFIG)Menu.req
-#- If the macro CONFIGMENU is defined with any value, backup (".savB") and
-#- sequence files (".savN") will not be written.  We don't want these for configMenu.
-#- Run this after iocInit:
-doAfterIocInit("create_manual_set('$(CONFIG)Menu.req','P=$(PREFIX),CONFIG=$(CONFIG),CONFIGMENU=1')")
-# ### userCalc.iocsh ###
-#- ###################################################
-#- PREFIX         - IOC Prefix
-#- CALC           - Location of Calc module
-#- ARRAY_SIZE     - Optional: Size of userArrayCalc array
-#-                  Default:  8000
-#- ###################################################
-#- ## Stuff for user programming ###
-dbLoadRecords("$(CALC)/db/userCalcGlobalEnable.db", "P=$(PREFIX)")
-dbLoadRecords("$(CALC)/db/userCalcs10.db",          "P=$(PREFIX)")
-dbLoadRecords("$(CALC)/db/userCalcOuts10.db",       "P=$(PREFIX)")
-dbLoadRecords("$(CALC)/db/userStringCalcs10.db",    "P=$(PREFIX)")
-dbLoadRecords("$(CALC)/db/userArrayCalcs10.db",     "P=$(PREFIX), N=$(ARRAY_SIZE=8000)")
-dbLoadRecords("$(CALC)/db/userTransforms10.db",     "P=$(PREFIX)")
-dbLoadRecords("$(CALC)/db/userAve10.db",            "P=$(PREFIX)")
-# ### userCalc.iocsh ###
-#- ###################################################
-#- PREFIX         - IOC Prefix
-#- CALC           - Location of Calc module
-#- N              - Additional calcs index (Ex: N=1 creates calcs 10-19)
-#- ARRAY_SIZE     - Optional: Size of userArrayCalc array
-#-                  Default:  8000
-#- ###################################################
-#- ## Stuff for user programming ###
-dbLoadRecords("$(CALC)/db/userCalcs10more.db","P=$(PREFIX),N10=$(N)0,N1=$(N)1,N2=$(N)2,N3=$(N)3,N4=$(N)4,N5=$(N)5,N6=$(N)6,N7=$(N)7,N8=$(N)8,N9=$(N)9")
-dbLoadRecords("$(CALC)/db/userCalcOuts10more.db","P=$(PREFIX),N10=$(N)0,N1=$(N)1,N2=$(N)2,N3=$(N)3,N4=$(N)4,N5=$(N)5,N6=$(N)6,N7=$(N)7,N8=$(N)8,N9=$(N)9")
-dbLoadRecords("$(CALC)/db/userStringCalcs10more.db","P=$(PREFIX),N10=$(N)0,N1=$(N)1,N2=$(N)2,N3=$(N)3,N4=$(N)4,N5=$(N)5,N6=$(N)6,N7=$(N)7,N8=$(N)8,N9=$(N)9")
-dbLoadRecords("$(CALC)/db/userArrayCalcs10more.db","P=$(PREFIX),N10=$(N)0,N1=$(N)1,N2=$(N)2,N3=$(N)3,N4=$(N)4,N5=$(N)5,N6=$(N)6,N7=$(N)7,N8=$(N)8,N9=$(N)9,N=$(ARRAY_SIZE=8000)")
-dbLoadRecords("$(CALC)/db/userTransforms10more.db","P=$(PREFIX),N10=$(N)0,N1=$(N)1,N2=$(N)2,N3=$(N)3,N4=$(N)4,N5=$(N)5,N6=$(N)6,N7=$(N)7,N8=$(N)8,N9=$(N)9")
-dbLoadRecords("$(CALC)/db/userAve10more.db","P=$(PREFIX),N10=$(N)0,N1=$(N)1,N2=$(N)2,N3=$(N)3,N4=$(N)4,N5=$(N)5,N6=$(N)6,N7=$(N)7,N8=$(N)8,N9=$(N)9")
-# ### sseq.iocsh ###
-#- ###################################################
-#- PREFIX         - IOC Prefix
-#- INSTANCE       - Instance Prefix
-#- CALC           - Location of Calc module
-#- ###################################################
-#- string sequence (sseq) records
-dbLoadRecords("$(CALC)/db/userStringSeqs10.db","P=$(PREFIX)")
-#- editSseq - edit any sseq or seq record
-dbLoadRecords("$(CALC)/db/editSseq.db", "P=$(PREFIX),Q=$(INSTANCE)")
-doAfterIocInit("seq &editSseq, 'P=$(PREFIX),Q=$(INSTANCE)'")
-#- interpolation
-dbLoadRecords("$(CALC)/calcApp/Db/interp.db", "P=$(PREFIX),N=2000")
-dbLoadRecords("$(CALC)/calcApp/Db/interpNew.db", "P=$(PREFIX),Q=1,N=2000")
-#- busy record
-dbLoadRecords("$(BUSY)/busyApp/Db/busyRecord.db", "P=$(PREFIX),R=mybusy1")
-dbLoadRecords("$(BUSY)/busyApp/Db/busyRecord.db", "P=$(PREFIX),R=mybusy2")
-#- Soft function generator
-#dbLoadRecords("$(CALC)/calcApp/Db/FuncGen.db","P=$(PREFIX),Q=fgen,OUT=$(PREFIX)m7.VAL")
-### Load database record for alive heartbeating support.
-#- IOCNM is name of IOC, RHOST specifies the remote server accepting hearbeats
-dbLoadRecords("$(ALIVE)/aliveApp/Db/alive.db", "P=$(PREFIX),IOCNM=$(IOC),RHOST=164.54.100.11")
-dbLoadRecords("$(ALIVE)/aliveApp/Db/aliveMSGCalc.db", "P=$(PREFIX)")
-#- A set of scan parameters for each positioner.  This is a convenience
-#- for the user.  It can contain an entry for each scannable thing in the
-#- crate.
-#dbLoadTemplate("substitutions/scanParms.substitutions", "P=$(PREFIX)")
-################################################################################
-# PyDevice Support for a simulated beamline
-################################################################################
-# load template of simulated motors
-# load db for detector
-# AD stuff (NDSA? image? is simDet needed?)
-iocshRun('epicsEnvSet("__FTVL", "$($(TYPE=Int8)_VAL)")', "Int8_VAL=UCHAR, UInt8_VAL=UCHAR, Int16_VAL=SHORT, UInt16_VAL=SHORT, Int32_VAL=LONG, UInt32_VAL=LONG, Float32_VAL=DOUBLE, Float64_VAL=DOUBLE")
-iocshRun('epicsEnvSet("__TYPE", "$($(TYPE=Int8)_VAL)")', "Int8_VAL=Int8, UInt8_VAL=Int8, Int16_VAL=Int16, UInt16_VAL=Int16, Int32_VAL=Int32, UInt32_VAL=Int32, Float32_VAL=Float32, Float64_VAL=Float64")
-luaCmd("epicsEnvSet('__SIZE', tostring((XSIZE*YSIZE)|0))", "XSIZE=$(XSIZE=1024), YSIZE=$(YSIZE=1024)")
-# load python code for simulated beamline (detector(s) -- intensity, image(?))
-pydev("from beamline_29 import IEX")
-pydev("from pyDevSBL import surrogateBL")
-pydev("sbl = surrogateBL(IEX)")
-# load db file for simulated detectors
-dbLoadRecords("${TOP}/db/pyDevSBL.db","P=$(PREFIX), INSTANCE=SBL, OBJ=sbl, SIZE=$(__SIZE),TYPE=$(__TYPE),FTVL=$(__FTVL), NDSA=NDSA, YSIZE=$(YSIZE), XSIZE=$(XSIZE)")
-# load db file for optical elements
-dbLoadTemplate("substitutions/pyDevSBL_element.substitutions","P=$(PREFIX), INSTANCE=SBL, OBJ=sbl")
-# Any commands to carry out after ioc init?
-#doAfterIocInit("pydev('sbl.setupMotorLimits()')") # Shouldn't need this line for now as manually put limits in subs file
-# ### motorSim.iocsh ###
-#- ###################################################
-#- PREFIX           - IOC Prefix
-#- INSTANCE         - Instance name, used to create the low-level driver drvet name
-#-                    Combined with the controller number to create the asyn port name
-#-
-#- SUB              - Optional: Subsitutions file (asyn_motor.db), Macros P, DTYP, PORT, 
-#-                              DHLM, DLLM, and INIT will be predefined.
-#-                    Default: $(MOTOR)/iocsh/EXAMPLE_motorSim.substitutions
-#-
-#- CONTROLLER       - Optional: Which controller is being configured
-#-                    Default: 0
-#-
-#- NUM_AXES         - Optional: Number of axes on this controller
-#-                    Default: 1
-#-
-#- LOW_LIM          - Optional: Low Limit (in steps)
-#-                    Default: -32000
-#-
-#- HIGH_LIM         - Optional: High Limit (in steps)
-#-                    Default: 32000
-#- 
-#- DLLM             - Optional: Motor Record Low Limit (in EGU)
-#-                    Default: -320.0
-#-
-#- DHLM             - Optional: Motor Record High Limit (in EGU)
-#-                    Default: 320.0
-#-
-#- HOME_POS         - Optional: Home position
-#-                    Default: 0
-#- ###################################################
-# Create simulated motors: ( start card , start axis , low limit, high limit, home posn, # cards, # axes to setup)
-motorSimCreate($(CONTROLLER=0), 0, $(LOW_LIM=-32000), $(HIGH_LIM=32000), $(HOME_POS=0), 1, $(NUM_AXES=12))
-# Setup the Asyn layer (portname, low-level driver drvet name, card, number of axes on card)
-drvAsynMotorConfigure("$(INSTANCE)$(CONTROLLER=0)", "$(INSTANCE)", $(CONTROLLER=0), $(NUM_AXES=12))
-dbLoadTemplate("$(SUB=$(MOTOR)/iocsh/EXAMPLE_motorSim.substitutions)", "P=$(PREFIX), DTYP='asynMotor', PORT=$(INSTANCE)$(CONTROLLER=0),DHLM=$(DHLM=320.0),DLLM=$(DLLM=-320.0)")
-# This is an example file for creating plugins
-# It uses the following environment variable macros
-# Many of the parameters defined in this file are also in commonPlugins_settings.req so if autosave is being
-# use the autosave value will replace the value passed to this file.
-# $(PREFIX)      Prefix for all records
-# $(PORT)        The port name for the detector.  In autosave.
-# $(QSIZE)       The queue size for all plugins.  In autosave.
-# $(XSIZE)       The maximum image width; used to set the maximum size for row profiles in the NDPluginStats plugin and 1-D FFT
-#                   profiles in NDPluginFFT.
-# $(YSIZE)       The maximum image height; used to set the maximum size for column profiles in the NDPluginStats plugin
-# $(NCHANS)      The maximum number of time series points in the NDPluginStats, NDPluginROIStats, and NDPluginAttribute plugins
-# $(CBUFFS)      The maximum number of frames buffered in the NDPluginCircularBuff plugin
-# $(MAX_THREADS) The maximum number of threads for plugins which can run in multiple threads. Defaults to 5.
-# Create a netCDF file saving plugin
-NDFileNetCDFConfigure("FileNetCDF1", $(QSIZE), 0, "$(PORT)", 0)
-dbLoadRecords("NDFileNetCDF.template","P=$(PREFIX),R=netCDF1:,PORT=FileNetCDF1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-# Create a TIFF file saving plugin
-NDFileTIFFConfigure("FileTIFF1", $(QSIZE), 0, "$(PORT)", 0)
-dbLoadRecords("NDFileTIFF.template",  "P=$(PREFIX),R=TIFF1:,PORT=FileTIFF1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-# Create a JPEG file saving plugin
-NDFileJPEGConfigure("FileJPEG1", $(QSIZE), 0, "$(PORT)", 0)
-dbLoadRecords("NDFileJPEG.template",  "P=$(PREFIX),R=JPEG1:,PORT=FileJPEG1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-# Create a NeXus file saving plugin
-NDFileNexusConfigure("FileNexus1", $(QSIZE), 0, "$(PORT)", 0)
-dbLoadRecords("NDFileNexus.template", "P=$(PREFIX),R=Nexus1:,PORT=FileNexus1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-# Create an HDF5 file saving plugin
-NDFileHDF5Configure("FileHDF1", $(QSIZE), 0, "$(PORT)", 0)
-dbLoadRecords("NDFileHDF5.template",  "P=$(PREFIX),R=HDF1:,PORT=FileHDF1,ADDR=0,TIMEOUT=1,XMLSIZE=2048,NDARRAY_PORT=$(PORT)")
-# Create a Magick file saving plugin
-#NDFileMagickConfigure("FileMagick1", $(QSIZE), 0, "$(PORT)", 0)
-#dbLoadRecords("NDFileMagick.template","P=$(PREFIX),R=Magick1:,PORT=FileMagick1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-# Create 4 ROI plugins
-NDROIConfigure("ROI1", $(QSIZE), 0, "$(PORT)", 0, 0, 0, 0, 0, $(MAX_THREADS=5))
-dbLoadRecords("NDROI.template",       "P=$(PREFIX),R=ROI1:,  PORT=ROI1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-NDROIConfigure("ROI2", $(QSIZE), 0, "$(PORT)", 0, 0, 0, 0, 0, $(MAX_THREADS=5))
-dbLoadRecords("NDROI.template",       "P=$(PREFIX),R=ROI2:,  PORT=ROI2,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-NDROIConfigure("ROI3", $(QSIZE), 0, "$(PORT)", 0, 0, 0, 0, 0, $(MAX_THREADS=5))
-dbLoadRecords("NDROI.template",       "P=$(PREFIX),R=ROI3:,  PORT=ROI3,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-NDROIConfigure("ROI4", $(QSIZE), 0, "$(PORT)", 0, 0, 0, 0, 0, $(MAX_THREADS=5))
-dbLoadRecords("NDROI.template",       "P=$(PREFIX),R=ROI4:,  PORT=ROI4,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-# Create 8 ROIStat plugins
-NDROIStatConfigure("ROISTAT1", $(QSIZE), 0, "$(PORT)", 0, 8, 0, 0, 0, 0, $(MAX_THREADS=5))
-dbLoadRecords("NDROIStat.template",   "P=$(PREFIX),R=ROIStat1:  ,PORT=ROISTAT1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),NCHANS=$(NCHANS)")
-dbLoadRecords("NDROIStatN.template",  "P=$(PREFIX),R=ROIStat1:1:,PORT=ROISTAT1,ADDR=0,TIMEOUT=1,NCHANS=$(NCHANS)")
-dbLoadRecords("NDROIStatN.template",  "P=$(PREFIX),R=ROIStat1:2:,PORT=ROISTAT1,ADDR=1,TIMEOUT=1,NCHANS=$(NCHANS)")
-dbLoadRecords("NDROIStatN.template",  "P=$(PREFIX),R=ROIStat1:3:,PORT=ROISTAT1,ADDR=2,TIMEOUT=1,NCHANS=$(NCHANS)")
-dbLoadRecords("NDROIStatN.template",  "P=$(PREFIX),R=ROIStat1:4:,PORT=ROISTAT1,ADDR=3,TIMEOUT=1,NCHANS=$(NCHANS)")
-dbLoadRecords("NDROIStatN.template",  "P=$(PREFIX),R=ROIStat1:5:,PORT=ROISTAT1,ADDR=4,TIMEOUT=1,NCHANS=$(NCHANS)")
-dbLoadRecords("NDROIStatN.template",  "P=$(PREFIX),R=ROIStat1:6:,PORT=ROISTAT1,ADDR=5,TIMEOUT=1,NCHANS=$(NCHANS)")
-dbLoadRecords("NDROIStatN.template",  "P=$(PREFIX),R=ROIStat1:7:,PORT=ROISTAT1,ADDR=6,TIMEOUT=1,NCHANS=$(NCHANS)")
-dbLoadRecords("NDROIStatN.template",  "P=$(PREFIX),R=ROIStat1:8:,PORT=ROISTAT1,ADDR=7,TIMEOUT=1,NCHANS=$(NCHANS)")
-# Create a processing plugin
-NDProcessConfigure("PROC1", $(QSIZE), 0, "$(PORT)", 0, 0, 0)
-dbLoadRecords("NDProcess.template",   "P=$(PREFIX),R=Proc1:,  PORT=PROC1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-# Create a TIFF file plugin to read dark and flatfield images into the processing plugin
-NDFileTIFFConfigure("PROC1TIFF", $(QSIZE), 0, "$(PORT)", 0)
-dbLoadRecords("NDFileTIFF.template",  "P=$(PREFIX),R=Proc1:TIFF:,PORT=PROC1TIFF,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-# Create a scatter plugin
-NDScatterConfigure("SCATTER1", $(QSIZE), 0, "$(PORT)", 0, 0, 0)
-dbLoadRecords("NDScatter.template",   "P=$(PREFIX),R=Scatter1:,  PORT=SCATTER1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-# Create a gather plugin with 8 ports
-NDGatherConfigure("GATHER1", $(QSIZE), 0, 8, 0, 0)
-dbLoadRecords("NDGather.template",   "P=$(PREFIX),R=Gather1:, PORT=GATHER1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-dbLoadRecords("NDGatherN.template",   "P=$(PREFIX),R=Gather1:, N=1, PORT=GATHER1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-dbLoadRecords("NDGatherN.template",   "P=$(PREFIX),R=Gather1:, N=2, PORT=GATHER1,ADDR=1,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-dbLoadRecords("NDGatherN.template",   "P=$(PREFIX),R=Gather1:, N=3, PORT=GATHER1,ADDR=2,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-dbLoadRecords("NDGatherN.template",   "P=$(PREFIX),R=Gather1:, N=4, PORT=GATHER1,ADDR=3,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-dbLoadRecords("NDGatherN.template",   "P=$(PREFIX),R=Gather1:, N=5, PORT=GATHER1,ADDR=4,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-dbLoadRecords("NDGatherN.template",   "P=$(PREFIX),R=Gather1:, N=6, PORT=GATHER1,ADDR=5,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-dbLoadRecords("NDGatherN.template",   "P=$(PREFIX),R=Gather1:, N=7, PORT=GATHER1,ADDR=6,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-dbLoadRecords("NDGatherN.template",   "P=$(PREFIX),R=Gather1:, N=8, PORT=GATHER1,ADDR=7,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-# Create 5 statistics plugins
-NDStatsConfigure("STATS1", $(QSIZE), 0, "$(PORT)", 0, 0, 0, 0, 0, $(MAX_THREADS=5))
-dbLoadRecords("NDStats.template",     "P=$(PREFIX),R=Stats1:,  PORT=STATS1,ADDR=0,TIMEOUT=1,HIST_SIZE=256,XSIZE=$(XSIZE),YSIZE=$(YSIZE),NCHANS=$(NCHANS),NDARRAY_PORT=$(PORT)")
-NDTimeSeriesConfigure("STATS1_TS", $(QSIZE), 0, "STATS1", 1, 23)
-dbLoadRecords("$(ADCORE)/db/NDTimeSeries.template",  "P=$(PREFIX),R=Stats1:TS:, PORT=STATS1_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATS1,NDARRAY_ADDR=1,NCHANS=$(NCHANS),ENABLED=1")
-NDStatsConfigure("STATS2", $(QSIZE), 0, "ROI1",    0, 0, 0, 0, 0, $(MAX_THREADS=5))
-dbLoadRecords("NDStats.template",     "P=$(PREFIX),R=Stats2:,  PORT=STATS2,ADDR=0,TIMEOUT=1,HIST_SIZE=256,XSIZE=$(XSIZE),YSIZE=$(YSIZE),NCHANS=$(NCHANS),NDARRAY_PORT=$(PORT)")
-NDTimeSeriesConfigure("STATS2_TS", $(QSIZE), 0, "STATS2", 1, 23)
-dbLoadRecords("$(ADCORE)/db/NDTimeSeries.template",  "P=$(PREFIX),R=Stats2:TS:, PORT=STATS2_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATS2,NDARRAY_ADDR=1,NCHANS=$(NCHANS),ENABLED=1")
-NDStatsConfigure("STATS3", $(QSIZE), 0, "ROI2",    0, 0, 0, 0, 0, $(MAX_THREADS=5))
-dbLoadRecords("NDStats.template",     "P=$(PREFIX),R=Stats3:,  PORT=STATS3,ADDR=0,TIMEOUT=1,HIST_SIZE=256,XSIZE=$(XSIZE),YSIZE=$(YSIZE),NCHANS=$(NCHANS),NDARRAY_PORT=$(PORT)")
-NDTimeSeriesConfigure("STATS3_TS", $(QSIZE), 0, "STATS3", 1, 23)
-dbLoadRecords("$(ADCORE)/db/NDTimeSeries.template",  "P=$(PREFIX),R=Stats3:TS:, PORT=STATS3_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATS3,NDARRAY_ADDR=1,NCHANS=$(NCHANS),ENABLED=1")
-NDStatsConfigure("STATS4", $(QSIZE), 0, "ROI3",    0, 0, 0, 0, 0, $(MAX_THREADS=5))
-dbLoadRecords("NDStats.template",     "P=$(PREFIX),R=Stats4:,  PORT=STATS4,ADDR=0,TIMEOUT=1,HIST_SIZE=256,XSIZE=$(XSIZE),YSIZE=$(YSIZE),NCHANS=$(NCHANS),NDARRAY_PORT=$(PORT)")
-NDTimeSeriesConfigure("STATS4_TS", $(QSIZE), 0, "STATS4", 1, 23)
-dbLoadRecords("$(ADCORE)/db/NDTimeSeries.template",  "P=$(PREFIX),R=Stats4:TS:, PORT=STATS4_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATS4,NDARRAY_ADDR=1,NCHANS=$(NCHANS),ENABLED=1")
-NDStatsConfigure("STATS5", $(QSIZE), 0, "ROI4",    0, 0, 0, 0, 0, $(MAX_THREADS=5))
-dbLoadRecords("NDStats.template",     "P=$(PREFIX),R=Stats5:,  PORT=STATS5,ADDR=0,TIMEOUT=1,HIST_SIZE=256,XSIZE=$(XSIZE),YSIZE=$(YSIZE),NCHANS=$(NCHANS),NDARRAY_PORT=$(PORT)")
-NDTimeSeriesConfigure("STATS5_TS", $(QSIZE), 0, "STATS5", 1, 23)
-dbLoadRecords("$(ADCORE)/db/NDTimeSeries.template",  "P=$(PREFIX),R=Stats5:TS:, PORT=STATS5_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=STATS5,NDARRAY_ADDR=1,NCHANS=$(NCHANS),ENABLED=1")
-# Create a transform plugin
-NDTransformConfigure("TRANS1", $(QSIZE), 0, "$(PORT)", 0, 0, 0, 0, 0, $(MAX_THREADS=5))
-dbLoadRecords("NDTransform.template", "P=$(PREFIX),R=Trans1:,  PORT=TRANS1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-# Create an overlay plugin with 8 overlays
-NDOverlayConfigure("OVER1", $(QSIZE), 0, "$(PORT)", 0, 8, 0, 0, 0, 0, $(MAX_THREADS=5))
-dbLoadRecords("NDOverlay.template", "P=$(PREFIX),R=Over1:, PORT=OVER1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-dbLoadRecords("NDOverlayN.template","P=$(PREFIX),R=Over1:1:,NAME=ROI1,   SHAPE=1,O=Over1:,XPOS=$(PREFIX)ROI1:MinX_RBV,YPOS=$(PREFIX)ROI1:MinY_RBV,XSIZE=$(PREFIX)ROI1:SizeX_RBV,YSIZE=$(PREFIX)ROI1:SizeY_RBV,PORT=OVER1,ADDR=0,TIMEOUT=1")
-dbLoadRecords("NDOverlayN.template","P=$(PREFIX),R=Over1:2:,NAME=ROI2,   SHAPE=1,O=Over1:,XPOS=$(PREFIX)ROI2:MinX_RBV,YPOS=$(PREFIX)ROI2:MinY_RBV,XSIZE=$(PREFIX)ROI2:SizeX_RBV,YSIZE=$(PREFIX)ROI2:SizeY_RBV,PORT=OVER1,ADDR=1,TIMEOUT=1")
-dbLoadRecords("NDOverlayN.template","P=$(PREFIX),R=Over1:3:,NAME=ROI3,   SHAPE=1,O=Over1:,XPOS=$(PREFIX)ROI3:MinX_RBV,YPOS=$(PREFIX)ROI3:MinY_RBV,XSIZE=$(PREFIX)ROI3:SizeX_RBV,YSIZE=$(PREFIX)ROI3:SizeY_RBV,PORT=OVER1,ADDR=2,TIMEOUT=1")
-dbLoadRecords("NDOverlayN.template","P=$(PREFIX),R=Over1:4:,NAME=ROI4,   SHAPE=1,O=Over1:,XPOS=$(PREFIX)ROI4:MinX_RBV,YPOS=$(PREFIX)ROI4:MinY_RBV,XSIZE=$(PREFIX)ROI4:SizeX_RBV,YSIZE=$(PREFIX)ROI4:SizeY_RBV,PORT=OVER1,ADDR=3,TIMEOUT=1")
-dbLoadRecords("NDOverlayN.template","P=$(PREFIX),R=Over1:5:,NAME=Cursor1,SHAPE=1,O=Over1:,XPOS=junk,                  YPOS=junk,                  XSIZE=junk,                   YSIZE=junk,                   PORT=OVER1,ADDR=4,TIMEOUT=1")
-dbLoadRecords("NDOverlayN.template","P=$(PREFIX),R=Over1:6:,NAME=Cursor2,SHAPE=1,O=Over1:,XPOS=junk,                  YPOS=junk,                  XSIZE=junk,                   YSIZE=junk,                   PORT=OVER1,ADDR=5,TIMEOUT=1")
-dbLoadRecords("NDOverlayN.template","P=$(PREFIX),R=Over1:7:,NAME=Box1,   SHAPE=1,O=Over1:,XPOS=junk,                  YPOS=junk,                  XSIZE=junk,                   YSIZE=junk,                   PORT=OVER1,ADDR=6,TIMEOUT=1")
-dbLoadRecords("NDOverlayN.template","P=$(PREFIX),R=Over1:8:,NAME=Box2,   SHAPE=1,O=Over1:,XPOS=junk,                  YPOS=junk,                  XSIZE=junk,                   YSIZE=junk,                   PORT=OVER1,ADDR=7,TIMEOUT=1")
-# Create 2 color conversion plugins
-NDColorConvertConfigure("CC1", $(QSIZE), 0, "$(PORT)", 0, 0, 0, 0, 0, $(MAX_THREADS=5))
-dbLoadRecords("NDColorConvert.template", "P=$(PREFIX),R=CC1:,  PORT=CC1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-NDColorConvertConfigure("CC2", $(QSIZE), 0, "$(PORT)", 0, 0, 0, 0, 0, $(MAX_THREADS=5))
-dbLoadRecords("NDColorConvert.template", "P=$(PREFIX),R=CC2:,  PORT=CC2,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-# Create a circular buffer plugin
-NDCircularBuffConfigure("CB1", $(QSIZE), 0, "$(PORT)", 0, $(CBUFFS), 0)
-dbLoadRecords("NDCircularBuff.template", "P=$(PREFIX),R=CB1:,  PORT=CB1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)")
-# Create an NDAttribute plugin with 8 attributes
-NDAttrConfigure("ATTR1", $(QSIZE), 0, "$(PORT)", 0, 8, 0, 0, 0)
-dbLoadRecords("NDAttribute.template",  "P=$(PREFIX),R=Attr1:,    PORT=ATTR1,ADDR=0,TIMEOUT=1,NCHANS=$(NCHANS),NDARRAY_PORT=$(PORT)")
-dbLoadRecords("NDAttributeN.template", "P=$(PREFIX),R=Attr1:1:,  PORT=ATTR1,ADDR=0,TIMEOUT=1,NCHANS=$(NCHANS)")
-dbLoadRecords("NDAttributeN.template", "P=$(PREFIX),R=Attr1:2:,  PORT=ATTR1,ADDR=1,TIMEOUT=1,NCHANS=$(NCHANS)")
-dbLoadRecords("NDAttributeN.template", "P=$(PREFIX),R=Attr1:3:,  PORT=ATTR1,ADDR=2,TIMEOUT=1,NCHANS=$(NCHANS)")
-dbLoadRecords("NDAttributeN.template", "P=$(PREFIX),R=Attr1:4:,  PORT=ATTR1,ADDR=3,TIMEOUT=1,NCHANS=$(NCHANS)")
-dbLoadRecords("NDAttributeN.template", "P=$(PREFIX),R=Attr1:5:,  PORT=ATTR1,ADDR=4,TIMEOUT=1,NCHANS=$(NCHANS)")
-dbLoadRecords("NDAttributeN.template", "P=$(PREFIX),R=Attr1:6:,  PORT=ATTR1,ADDR=5,TIMEOUT=1,NCHANS=$(NCHANS)")
-dbLoadRecords("NDAttributeN.template", "P=$(PREFIX),R=Attr1:7:,  PORT=ATTR1,ADDR=6,TIMEOUT=1,NCHANS=$(NCHANS)")
-dbLoadRecords("NDAttributeN.template", "P=$(PREFIX),R=Attr1:8:,  PORT=ATTR1,ADDR=7,TIMEOUT=1,NCHANS=$(NCHANS)")
-NDTimeSeriesConfigure("ATTR1_TS", $(QSIZE), 0, "ATTR1", 1, 8)
-dbLoadRecords("$(ADCORE)/db/NDTimeSeries.template",  "P=$(PREFIX),R=Attr1:TS:, PORT=ATTR1_TS,ADDR=0,TIMEOUT=1,NDARRAY_PORT=ATTR1,NDARRAY_ADDR=1,NCHANS=$(NCHANS),ENABLED=1")
-# Create an FFT plugin
-NDFFTConfigure("FFT1", $(QSIZE), 0, "$(PORT)", 0, 0, 0, 0, 0, 5)
-dbLoadRecords("NDFFT.template", "P=$(PREFIX), R=FFT1:, PORT=FFT1, ADDR=0, TIMEOUT=1, NDARRAY_PORT=$(PORT), NAME=FFT1, NCHANS=$(XSIZE)")
-# Create 2 Codec plugins
-NDCodecConfigure("CODEC1", $(QSIZE), 0, "$(PORT)", 0, 0, 0, 0, 0, 5)
-dbLoadRecords("NDCodec.template", "P=$(PREFIX), R=Codec1:, PORT=CODEC1, ADDR=0, TIMEOUT=1, NDARRAY_PORT=$(PORT)")
-NDCodecConfigure("CODEC2", $(QSIZE), 0, "$(PORT)", 0, 0, 0, 0, 0, 5)
-dbLoadRecords("NDCodec.template", "P=$(PREFIX), R=Codec2:, PORT=CODEC2, ADDR=0, TIMEOUT=1, NDARRAY_PORT=$(PORT)")
-# Create a bad pixel plugin
-NDBadPixelConfigure("BADPIX1", $(QSIZE), 0, "$(PORT)", 0, 0, 0, 0, 0, 5)
-dbLoadRecords("NDBadPixel.template", "P=$(PREFIX), R=BadPix1:, PORT=BADPIX1, ADDR=0, TIMEOUT=1, NDARRAY_PORT=$(PORT)")
-set_requestfile_path("./")
-set_requestfile_path("$(ADCORE)/db")
-set_requestfile_path("$(ADCORE)/iocBoot")
-set_requestfile_path("$(AUTOSAVE)/db")
-set_savefile_path("./autosave")
-set_pass0_restoreFile("auto_settings.sav")
-set_pass1_restoreFile("auto_settings.sav")
-save_restoreSet_status_prefix("$(PREFIX)")
-dbLoadRecords("$(AUTOSAVE)/db/save_restoreStatus.db", "P=$(PREFIX)")
 dbLoadRecords("$(AUTOSAVE)/db/configMenu.db", "P=$(PREFIX), CONFIG=ADAutoSave")
 # Optional: load NDPluginPva plugin
 NDPvaConfigure("PVA1", $(QSIZE), 0, "$(PORT)", 0, $(PREFIX)Pva1:Image, 0, 0, 0)
-- 
GitLab