From d2829695e6fb82c2273cddd4f521f223c592906a Mon Sep 17 00:00:00 2001
From: timmmooney <mooney@aps.anl.gov>
Date: Thu, 17 Mar 2005 22:27:56 +0000
Subject: [PATCH] new

---
 iocBoot/iocLinux/Makefile                  |   5 +
 iocBoot/iocLinux/README                    |   5 +
 iocBoot/iocLinux/auto_positions.req        |  16 +++
 iocBoot/iocLinux/auto_settings.req         |  41 ++++++
 iocBoot/iocLinux/envPaths                  |  27 ++++
 iocBoot/iocLinux/run                       |   1 +
 iocBoot/iocLinux/saveData.req              |  40 ++++++
 iocBoot/iocLinux/save_restore.cmd          |  56 ++++++++
 iocBoot/iocLinux/scanParms.substitutions   |  46 +++++++
 iocBoot/iocLinux/st.cmd                    | 131 +++++++++++++++++++
 iocBoot/iocSolaris/Makefile                |   5 +
 iocBoot/iocSolaris/README                  |   5 +
 iocBoot/iocSolaris/auto_positions.req      |  16 +++
 iocBoot/iocSolaris/auto_settings.req       |  48 +++++++
 iocBoot/iocSolaris/envPaths                |  28 ++++
 iocBoot/iocSolaris/motor.substitutions     |  21 +++
 iocBoot/iocSolaris/run                     |   1 +
 iocBoot/iocSolaris/saveData.req            |  40 ++++++
 iocBoot/iocSolaris/save_restore.cmd        |  56 ++++++++
 iocBoot/iocSolaris/scanParms.substitutions |  48 +++++++
 iocBoot/iocSolaris/softMotor.substitutions |  15 +++
 iocBoot/iocSolaris/st.cmd                  | 142 +++++++++++++++++++++
 22 files changed, 793 insertions(+)
 create mode 100644 iocBoot/iocLinux/Makefile
 create mode 100644 iocBoot/iocLinux/README
 create mode 100644 iocBoot/iocLinux/auto_positions.req
 create mode 100644 iocBoot/iocLinux/auto_settings.req
 create mode 100644 iocBoot/iocLinux/envPaths
 create mode 100755 iocBoot/iocLinux/run
 create mode 100644 iocBoot/iocLinux/saveData.req
 create mode 100644 iocBoot/iocLinux/save_restore.cmd
 create mode 100644 iocBoot/iocLinux/scanParms.substitutions
 create mode 100644 iocBoot/iocLinux/st.cmd
 create mode 100644 iocBoot/iocSolaris/Makefile
 create mode 100644 iocBoot/iocSolaris/README
 create mode 100644 iocBoot/iocSolaris/auto_positions.req
 create mode 100644 iocBoot/iocSolaris/auto_settings.req
 create mode 100644 iocBoot/iocSolaris/envPaths
 create mode 100644 iocBoot/iocSolaris/motor.substitutions
 create mode 100755 iocBoot/iocSolaris/run
 create mode 100644 iocBoot/iocSolaris/saveData.req
 create mode 100644 iocBoot/iocSolaris/save_restore.cmd
 create mode 100644 iocBoot/iocSolaris/scanParms.substitutions
 create mode 100644 iocBoot/iocSolaris/softMotor.substitutions
 create mode 100644 iocBoot/iocSolaris/st.cmd

diff --git a/iocBoot/iocLinux/Makefile b/iocBoot/iocLinux/Makefile
new file mode 100644
index 0000000..cec9156
--- /dev/null
+++ b/iocBoot/iocLinux/Makefile
@@ -0,0 +1,5 @@
+TOP = ../..
+include $(TOP)/configure/CONFIG
+ARCH = linux-x86
+TARGETS = envPaths
+include $(TOP)/configure/RULES.ioc
diff --git a/iocBoot/iocLinux/README b/iocBoot/iocLinux/README
new file mode 100644
index 0000000..1060b5e
--- /dev/null
+++ b/iocBoot/iocLinux/README
@@ -0,0 +1,5 @@
+Assuming the EPICS_HOST_ARCH environment variable is set correctly,
+start the ioc from this directory by executing the following command.
+
+../../bin/${EPICS_HOST_ARCH}/xxx st.cmd
+
diff --git a/iocBoot/iocLinux/auto_positions.req b/iocBoot/iocLinux/auto_positions.req
new file mode 100644
index 0000000..5e89c53
--- /dev/null
+++ b/iocBoot/iocLinux/auto_positions.req
@@ -0,0 +1,16 @@
+$(P)m1.OFF
+$(P)m1.DVAL
+$(P)m2.OFF
+$(P)m2.DVAL
+$(P)m3.OFF
+$(P)m3.DVAL
+$(P)m4.OFF
+$(P)m4.DVAL
+$(P)m5.OFF
+$(P)m5.DVAL
+$(P)m6.OFF
+$(P)m6.DVAL
+$(P)m7.OFF
+$(P)m7.DVAL
+$(P)m8.OFF
+$(P)m8.DVAL
diff --git a/iocBoot/iocLinux/auto_settings.req b/iocBoot/iocLinux/auto_settings.req
new file mode 100644
index 0000000..bba57ad
--- /dev/null
+++ b/iocBoot/iocLinux/auto_settings.req
@@ -0,0 +1,41 @@
+file motor_settings.req P=$(P),M=m1
+
+file scanParms_settings.req P=$(P),M=m1
+
+file table_settings.req P=$(P),T=table1,Q=table1
+
+file scan_settings.req P=$(P),S=scan1
+file scan_settings.req P=$(P),S=scan2
+file scan_settings.req P=$(P),S=scan3
+file scan_settings.req P=$(P),S=scan4
+file scan_settings.req P=$(P),S=scanH
+
+# Kohzu monochromator
+#$(P)BraggHAO.VAL
+#$(P)BraggKAO.VAL
+#$(P)BraggLAO.VAL
+#$(P)BraggAAO.VAL
+#$(P)BraggTypeMO.VAL
+#$(P)KohzuMode2MO.VAL
+#$(P)Kohzu_yOffsetAO.VAL
+
+file userCalcs10_settings.req P=$(P)
+file userCalcN_settings.req P=$(P),N=I_Detector
+
+file saveData_settings.req P=$(P)
+
+file userTransforms10_settings.req P=$(P)
+
+file userStringCalcs10_settings.req P=$(P)
+
+# string-sequence records
+file sseq_settings.req P=$(P),S=Sseq1
+file sseq_settings.req P=$(P),S=Sseq2
+file sseq_settings.req P=$(P),S=Sseq3
+
+
+# 4-step measurement
+file auto_4step_settings.req P=$(P),Q=4step
+
+file userAve10_settings.req P=$(P)
+
diff --git a/iocBoot/iocLinux/envPaths b/iocBoot/iocLinux/envPaths
new file mode 100644
index 0000000..164e129
--- /dev/null
+++ b/iocBoot/iocLinux/envPaths
@@ -0,0 +1,27 @@
+epicsEnvSet(ARCH,"linux-x86")
+epicsEnvSet(IOC,"iocLinux")
+epicsEnvSet(TOP,"/home/oxygen4/MOONEY/epics/synApps_5_1/support/xxx")
+epicsEnvSet(SUPPORT,"/home/oxygen/MOONEY/epics/synApps_5_1/support")
+epicsEnvSet(ALLEN_BRADLEY,"/home/oxygen/MOONEY/epics/synApps_5_1/support/allenBradley/2-1")
+epicsEnvSet(ASYN,"/home/oxygen/MOONEY/epics/synApps_5_1/support/asyn/4-2")
+epicsEnvSet(AUTOSAVE,"/home/oxygen/MOONEY/epics/synApps_5_1/support/autosave/cvs")
+epicsEnvSet(CALC,"/home/oxygen/MOONEY/epics/synApps_5_1/support/calc/2-4")
+epicsEnvSet(CAMAC,"/home/oxygen/MOONEY/epics/synApps_5_1/support/camac/cvs")
+epicsEnvSet(CCD,"/home/oxygen/MOONEY/epics/synApps_5_1/support/ccd/cvs")
+epicsEnvSet(DAC128V,"/home/oxygen/MOONEY/epics/synApps_5_1/support/dac128V/cvs")
+epicsEnvSet(DXP,"/home/oxygen/MOONEY/epics/synApps_5_1/support/dxp/cvs")
+epicsEnvSet(GENSUB,"/home/oxygen/MOONEY/epics/synApps_5_1/support/genSub/1-6")
+epicsEnvSet(IP,"/home/oxygen/MOONEY/epics/synApps_5_1/support/ip/2-4")
+epicsEnvSet(IP330,"/home/oxygen/MOONEY/epics/synApps_5_1/support/ip330/cvs")
+epicsEnvSet(IPUNIDIG,"/home/oxygen/MOONEY/epics/synApps_5_1/support/ipUnidig/cvs")
+epicsEnvSet(IPAC,"/home/oxygen/MOONEY/epics/synApps_5_1/support/ipac/2-8")
+epicsEnvSet(MCA,"/home/oxygen/MOONEY/epics/synApps_5_1/support/mca/cvs")
+epicsEnvSet(MOTOR,"/home/oxygen/MOONEY/epics/synApps_5_1/support/motor/cvs")
+epicsEnvSet(OPTICS,"/home/oxygen/MOONEY/epics/synApps_5_1/support/optics/2-4")
+epicsEnvSet(QUADEM,"/home/oxygen/MOONEY/epics/synApps_5_1/support/quadEM/cvs")
+epicsEnvSet(SNCSEQ,"/home/oxygen/MOONEY/epics/synApps_5_1/support/seq/2-0-9")
+epicsEnvSet(SSCAN,"/home/oxygen/MOONEY/epics/synApps_5_1/support/sscan/cvs")
+epicsEnvSet(STD,"/home/oxygen/MOONEY/epics/synApps_5_1/support/std/2-4")
+epicsEnvSet(VME,"/home/oxygen/MOONEY/epics/synApps_5_1/support/vme/cvs")
+epicsEnvSet(VXSTATS,"/home/oxygen/MOONEY/epics/synApps_5_1/support/vxStats/cvs")
+epicsEnvSet(EPICS_BASE,"/home/oxygen/MOONEY/epics/base-3.14.7")
diff --git a/iocBoot/iocLinux/run b/iocBoot/iocLinux/run
new file mode 100755
index 0000000..001877b
--- /dev/null
+++ b/iocBoot/iocLinux/run
@@ -0,0 +1 @@
+../../bin/${EPICS_HOST_ARCH}/xxx st.cmd
diff --git a/iocBoot/iocLinux/saveData.req b/iocBoot/iocLinux/saveData.req
new file mode 100644
index 0000000..6eaff4e
--- /dev/null
+++ b/iocBoot/iocLinux/saveData.req
@@ -0,0 +1,40 @@
+[prefix]
+$(P)
+
+[status]
+$(P)saveData_status
+
+[message]
+$(P)saveData_message
+
+[filename]
+$(P)saveData_fileName
+
+[counter]	# scan counter
+$(P)saveData_scanNumber
+
+[fileSystem] # scan file system
+$(P)saveData_fileSystem
+
+[subdir]	# scan file subdirectory
+$(P)saveData_subDir
+
+[fullPathName]
+$(P)saveData_fullPathName
+
+[realTime1D] # if nonzero, write 1D data as it comes in
+$(P)saveData_realTime1D
+
+[scanRecord]	# specify scan records to be monitored
+$(P)scanH
+$(P)scan1
+$(P)scan2
+$(P)scan3
+$(P)scan4
+
+[extraPV]
+$(P)userCalc1.CALC	"string"
+$(P)saveData_realTime1D "enum"
+$(P)saveData_scanNumber	"long"
+$(P)saveData_fileSystem	"filesystem"
+$(P)scan1.P1SM		"scan mode"
diff --git a/iocBoot/iocLinux/save_restore.cmd b/iocBoot/iocLinux/save_restore.cmd
new file mode 100644
index 0000000..6aadbca
--- /dev/null
+++ b/iocBoot/iocLinux/save_restore.cmd
@@ -0,0 +1,56 @@
+### save_restore setup
+#
+# The rest this file does not require modification for standard use, but...
+# If you want save_restore to manage its own NFS mount, specify the name and
+# IP address of the file server to which save files should be written.
+# This currently is supported only on vxWorks.
+#save_restoreSet_NFSHost("oxygen", "164.54.52.4")
+
+# status-PV prefix
+save_restoreSet_status_prefix("xxx:")
+# Debug-output level
+save_restoreSet_Debug(0)
+
+# Ok to save/restore save sets with missing values (no CA connection to PV)?
+save_restoreSet_IncompleteSetsOk(1)
+# Save dated backup files?
+save_restoreSet_DatedBackupFiles(1)
+
+# Number of sequenced backup files to write
+save_restoreSet_NumSeqFiles(3)
+# Time interval between sequenced backups
+save_restoreSet_SeqPeriodInSeconds(300)
+
+# specify where save files should be
+set_savefile_path("$(STARTUP)", "autosave")
+
+# 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("auto_positions.sav")
+set_pass0_restoreFile("auto_settings.sav")
+set_pass1_restoreFile("auto_settings.sav")
+
+# specify directories in which to to search for included request files
+# Note cdCommands defines 'startup', but envPaths does not
+set_requestfile_path("$(STARTUP)", "")
+set_requestfile_path("$(STARTUP)", "autosave")
+set_requestfile_path("$(AUTOSAVE)", "asApp/Db")
+set_requestfile_path("$(CALC)", "calcApp/Db")
+#set_requestfile_path("$(CAMAC)", "camacApp/Db")
+set_requestfile_path("$(CCD)", "ccdApp/Db")
+set_requestfile_path("$(DAC128V)", "dac128VApp/Db")
+set_requestfile_path("$(DXP)", "dxpApp/Db")
+set_requestfile_path("$(IP)", "ipApp/Db")
+set_requestfile_path("$(IP330)", "ip330App/Db")
+set_requestfile_path("$(IPUNIDIG)", "ipUnidigApp/Db")
+#set_requestfile_path("$(LOVE)", "loveApp/Db")
+set_requestfile_path("$(MCA)", "mcaApp/Db")
+set_requestfile_path("$(MOTOR)", "motorApp/Db")
+set_requestfile_path("$(OPTICS)", "opticsApp/Db")
+set_requestfile_path("$(QUADEM)", "quadEMApp/Db")
+set_requestfile_path("$(SSCAN)", "sscanApp/Db")
+set_requestfile_path("$(STD)", "stdApp/Db")
+set_requestfile_path("$(VME)", "vmeApp/Db")
+
+dbLoadRecords("$(AUTOSAVE)/asApp/Db/save_restoreStatus.db", "P=xxx:")
diff --git a/iocBoot/iocLinux/scanParms.substitutions b/iocBoot/iocLinux/scanParms.substitutions
new file mode 100644
index 0000000..cfe432b
--- /dev/null
+++ b/iocBoot/iocLinux/scanParms.substitutions
@@ -0,0 +1,46 @@
+file "$(SSCAN)/sscanApp/Db/scanParms.db"
+{
+{P=xxx:,SCANREC=xxx:scan1,Q=m1,POS=$(Q).VAL,RDBK=$(Q).RBV}
+{P=xxx:,SCANREC=xxx:scan1,Q=m2,POS=$(Q).VAL,RDBK=$(Q).RBV}
+{P=xxx:,SCANREC=xxx:scan1,Q=m3,POS=$(Q).VAL,RDBK=$(Q).RBV}
+{P=xxx:,SCANREC=xxx:scan1,Q=m4,POS=$(Q).VAL,RDBK=$(Q).RBV}
+{P=xxx:,SCANREC=xxx:scan1,Q=m5,POS=$(Q).VAL,RDBK=$(Q).RBV}
+{P=xxx:,SCANREC=xxx:scan1,Q=m6,POS=$(Q).VAL,RDBK=$(Q).RBV}
+{P=xxx:,SCANREC=xxx:scan1,Q=m7,POS=$(Q).VAL,RDBK=$(Q).RBV}
+{P=xxx:,SCANREC=xxx:scan1,Q=m8,POS=$(Q).VAL,RDBK=$(Q).RBV}
+
+{P=xxx:,SCANREC=xxx:scan1,Q=Table1X,POS=table1.X,RDBK=table1.XRB}
+{P=xxx:,SCANREC=xxx:scan1,Q=Table1Y,POS=table1.Y,RDBK=table1.YRB}
+{P=xxx:,SCANREC=xxx:scan1,Q=Table1Z,POS=table1.Z,RDBK=table1.ZRB}
+{P=xxx:,SCANREC=xxx:scan1,Q=Table1AX,POS=table1.AX,RDBK=table1.AXRB}
+{P=xxx:,SCANREC=xxx:scan1,Q=Table1AY,POS=table1.AY,RDBK=table1.AYRB}
+{P=xxx:,SCANREC=xxx:scan1,Q=Table1AZ,POS=table1.AZ,RDBK=table1.AZRB}
+
+#{P=xxx:,SCANREC=xxx:scan1,Q=BraggE,POS=BraggEAO.VAL,RDBK=BraggERdbkAO.VAL}
+#{P=xxx:,SCANREC=xxx:scan1,Q=BraggLambda,POS=BraggLambdaAO.VAL,RDBK=BraggLambdaRdbkAO.VAL}
+#{P=xxx:,SCANREC=xxx:scan1,Q=BraggTheta,POS=BraggThetaAO.VAL,RDBK=BraggThetaRdbkAO.VAL}
+
+#{P=xxx:,SCANREC=xxx:scan1,Q=HR1_E,POS=HR1_EAO.VAL,RDBK=HR1_ERdbkAO}
+#{P=xxx:,SCANREC=xxx:scan1,Q=HR1_A,POS=HR1_worldOffAO.VAL,RDBK=HR1_worldOffAO.VAL}
+
+# old slit
+{P=xxx:,SCANREC=xxx:scan1,Q=Slit1Hp,POS=Slit1Hxp.VAL,RDBK=Slit1Ht2.A}
+{P=xxx:,SCANREC=xxx:scan1,Q=Slit1Hn,POS=Slit1Hxn.VAL,RDBK=Slit1Ht2.B}
+{P=xxx:,SCANREC=xxx:scan1,Q=Slit1Hsize,POS=Slit1Hsize.VAL,RDBK=Slit1Ht2.C}
+{P=xxx:,SCANREC=xxx:scan1,Q=Slit1Hcenter,POS=Slit1Hcenter.VAL,RDBK=Slit1Ht2.D}
+{P=xxx:,SCANREC=xxx:scan1,Q=Slit1Vp,POS=Slit1Vxp.VAL,RDBK=Slit1Vt2.A}
+{P=xxx:,SCANREC=xxx:scan1,Q=Slit1Vn,POS=Slit1Vxn.VAL,RDBK=Slit1Vt2.B}
+{P=xxx:,SCANREC=xxx:scan1,Q=Slit1Vsize,POS=Slit1Vsize.VAL,RDBK=Slit1Vt2.C}
+{P=xxx:,SCANREC=xxx:scan1,Q=Slit1Vcenter,POS=Slit1Vcenter.VAL,RDBK=Slit1Vt2.D}
+
+# new soft-motor-based slit
+#{P=xxx:,SCANREC=xxx:scan1,Q=Slit2Hxn,POS=$(Q).VAL,RDBK=$(Q).RBV}
+#{P=xxx:,SCANREC=xxx:scan1,Q=Slit2Hxp,POS=$(Q).VAL,RDBK=$(Q).RBV}
+#{P=xxx:,SCANREC=xxx:scan1,Q=Slit2Hsize,POS=$(Q).VAL,RDBK=$(Q).RBV}
+#{P=xxx:,SCANREC=xxx:scan1,Q=Slit2Hcenter,POS=$(Q).VAL,RDBK=$(Q).RBV}
+#{P=xxx:,SCANREC=xxx:scan1,Q=Slit2Vxn,POS=$(Q).VAL,RDBK=$(Q).RBV}
+#{P=xxx:,SCANREC=xxx:scan1,Q=Slit2Vxp,POS=$(Q).VAL,RDBK=$(Q).RBV}
+#{P=xxx:,SCANREC=xxx:scan1,Q=Slit2Vsize,POS=$(Q).VAL,RDBK=$(Q).RBV}
+#{P=xxx:,SCANREC=xxx:scan1,Q=Slit2Vcenter,POS=$(Q).VAL,RDBK=$(Q).RBV}
+
+}
diff --git a/iocBoot/iocLinux/st.cmd b/iocBoot/iocLinux/st.cmd
new file mode 100644
index 0000000..021774e
--- /dev/null
+++ b/iocBoot/iocLinux/st.cmd
@@ -0,0 +1,131 @@
+# vxWorks startup script
+
+# Read environment variables
+< envPaths
+
+# save_restore.cmd needs the full path to the startup directory, which
+# envPaths currently does not provide
+epicsEnvSet(STARTUP,$(TOP)/iocBoot/$(IOC))
+
+################################################################################
+# Tell EPICS all about the record types, device-support modules, drivers,
+# etc. in the software we just loaded (xxx.munch)
+dbLoadDatabase("../../dbd/iocxxx.dbd")
+iocxxx_registerRecordDeviceDriver(pdbbase)
+
+# Increase size of buffer for error logging from default 1256
+errlogInit(5000)
+
+# debug sseq record
+#var sseqRecDebug,10
+ 
+# need more entries in wait/scan-record channel-access queue?
+#var recDynLinkQsize, 1024
+
+# Specify largest array CA will transport
+# Note for N sscanRecord data points, need (N+1)*8 bytes, else MEDM
+# plot doesn't display
+epicsEnvSet EPICS_CA_MAX_ARRAY_BYTES 64008
+
+### save_restore setup
+# We presume a suitable initHook routine was compiled into the executable.
+# See also create_monitor_set(), after iocInit() .
+< save_restore.cmd
+
+# interpolation
+dbLoadRecords("$(CALC)/calcApp/Db/interp.db", "P=xxx:,N=2000")
+
+
+### 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/scan.db","P=xxx:,MAXPTS1=4000,MAXPTS2=200,MAXPTS3=10,MAXPTS4=10,MAXPTSH=4000")
+
+# Slits
+#dbLoadRecords("$(OPTICS)/opticsApp/Db/2slit.db","P=xxx:,SLIT=Slit1V,mXp=m3,mXn=m4")
+#dbLoadRecords("$(OPTICS)/opticsApp/Db/2slit.db","P=xxx:,SLIT=Slit1H,mXp=m5,mXn=m6")
+
+# 2-post mirror
+#dbLoadRecords("$(OPTICS)/opticsApp/Db/2postMirror.db","P=xxx:,Q=M1,mDn=m1,mUp=m2,LENGTH=0.3")
+
+# User filters
+#dbLoadRecords("$(OPTICS)/opticsApp/Db/filterMotor.db","P=xxx:,Q=fltr1:,MOTOR=m1,LOCK=fltr_1_2:")
+#dbLoadRecords("$(OPTICS)/opticsApp/Db/filterMotor.db","P=xxx:,Q=fltr2:,MOTOR=m2,LOCK=fltr_1_2:")
+
+# Optical tables
+#var tableRecordDebug,1
+#dbLoadRecords("$(OPTICS)/opticsApp/Db/table.db","P=xxx:,Q=Table1,T=table1,M0X=m1,M0Y=m2,M1Y=m3,M2X=m4,M2Y=m5,M2Z=m6,GEOM=SRI")
+
+### Monochromator support ###
+# Kohzu and PSL monochromators: Bragg and theta/Y/Z motors
+# standard geometry (geometry 1)
+#dbLoadRecords("$(OPTICS)/opticsApp/Db/kohzuSeq.db","P=xxx:,M_THETA=m1,M_Y=m2,M_Z=m3,yOffLo=17.4999,yOffHi=17.5001")
+# modified geometry (geometry 2)
+#dbLoadRecords("$(OPTICS)/opticsApp/Db/kohzuSeq.db","P=xxx:,M_THETA=m1,M_Y=m2,M_Z=m3,yOffLo=4,yOffHi=36")
+
+# Spherical grating monochromator
+#dbLoadRecords("$(OPTICS)/opticsApp/Db/SGM.db","P=xxx:,N=1,M_x=m1,M_rIn=m2,M_rOut=m3,M_g=m4")
+
+# 4-bounce high-resolution monochromator
+#dbLoadRecords("$(OPTICS)/opticsApp/Db/hrSeq.db","P=xxx:,N=1,M_PHI1=m1,M_PHI2=m2")
+
+### Stuff for user programming ###
+dbLoadRecords("$(CALC)/calcApp/Db/userCalcs10.db","P=xxx:")
+dbLoadRecords("$(CALC)/calcApp/Db/userStringCalcs10.db","P=xxx:")
+dbLoadRecords("$(CALC)/calcApp/Db/userTransforms10.db","P=xxx:")
+# extra userCalcs (must also load userCalcs10.db for the enable switch)
+dbLoadRecords("$(CALC)/calcApp/Db/userCalcN.db","P=xxx:,N=I_Detector")
+#dbLoadRecords("$(CALC)/calcApp/Db/userAve10.db","P=xxx:")
+# string sequence (sseq) record
+dbLoadRecords("$(STD)/stdApp/Db/yySseq.db","P=xxx:,S=Sseq1")
+dbLoadRecords("$(STD)/stdApp/Db/yySseq.db","P=xxx:,S=Sseq2")
+dbLoadRecords("$(STD)/stdApp/Db/yySseq.db","P=xxx:,S=Sseq3")
+# 4-step measurement
+#dbLoadRecords("$(STD)/stdApp/Db/4step.db", "P=xxx:")
+
+### serial support ###
+
+# generic serial ports
+#dbLoadRecords("$(IP)/ipApp/Db/generic_serial.db", "P=xxx:,C=0,SERVER=serial1")
+#dbLoadRecords("$(IP)/ipApp/Db/generic_serial.db", "P=xxx:,C=0,SERVER=serial2")
+
+# serial O/I block (generic serial record with format and parse string calcs)
+# on epics/mpf processor
+#dbLoadRecords("$(IP)/ipApp/Db/serial_OI_block.db","P=xxx:,N=0_1,C=0,SERVER=serial5")
+# on stand-alone mpf processor
+#dbLoadRecords("$(IP)/ipApp/Db/serial_OI_block.db","P=xxx:,N=1_1,C=0,SERVER=serial5")
+
+# Miscellaneous PV's, such as burtResult
+dbLoadRecords("$(STD)/stdApp/Db/misc.db","P=xxx:")
+
+
+###############################################################################
+iocInit
+
+### startup State Notation Language programs
+#seq &kohzuCtl, "P=xxx:, M_THETA=m1, M_Y=m2, M_Z=m3, GEOM=1, logfile=kohzuCtl.log"
+#seq &hrCtl, "P=xxx:, N=1, M_PHI1=m1, M_PHI2=m2, logfile=hrCtl1.log"
+
+### Start up the autosave task and tell it what to do.
+# The task is actually named "save_restore".
+# Note that you can reload these sets after creating them: e.g., 
+# reload_monitor_set("auto_settings.req",30,"P=xxx:")
+#
+# save positions every five seconds
+create_monitor_set("auto_positions.req",5,"P=xxx:")
+# save other things every thirty seconds
+create_monitor_set("auto_settings.req",30,"P=xxx:")
+
+### Start the saveData task.
+# saveData_MessagePolicy
+# 0: wait forever for space in message queue, then send message
+# 1: send message only if queue is not full
+# 2: send message only if queue is not full and specified time has passed (SetCptWait()
+#    sets this time.)
+# 3: if specified time has passed, wait for space in queue, then send message
+# else: don't send message
+#var "debug_saveData" 2
+#saveData_MessagePolicy = 2
+#saveData_SetCptWait_ms(100)
+saveData_Init("saveData.req", "P=xxx:")
+#saveData_PrintScanInfo("xxx:scan1")
diff --git a/iocBoot/iocSolaris/Makefile b/iocBoot/iocSolaris/Makefile
new file mode 100644
index 0000000..ab5b240
--- /dev/null
+++ b/iocBoot/iocSolaris/Makefile
@@ -0,0 +1,5 @@
+TOP = ../..
+include $(TOP)/configure/CONFIG
+ARCH = solaris-sparc-gnu
+TARGETS = envPaths
+include $(TOP)/configure/RULES.ioc
diff --git a/iocBoot/iocSolaris/README b/iocBoot/iocSolaris/README
new file mode 100644
index 0000000..1060b5e
--- /dev/null
+++ b/iocBoot/iocSolaris/README
@@ -0,0 +1,5 @@
+Assuming the EPICS_HOST_ARCH environment variable is set correctly,
+start the ioc from this directory by executing the following command.
+
+../../bin/${EPICS_HOST_ARCH}/xxx st.cmd
+
diff --git a/iocBoot/iocSolaris/auto_positions.req b/iocBoot/iocSolaris/auto_positions.req
new file mode 100644
index 0000000..5e89c53
--- /dev/null
+++ b/iocBoot/iocSolaris/auto_positions.req
@@ -0,0 +1,16 @@
+$(P)m1.OFF
+$(P)m1.DVAL
+$(P)m2.OFF
+$(P)m2.DVAL
+$(P)m3.OFF
+$(P)m3.DVAL
+$(P)m4.OFF
+$(P)m4.DVAL
+$(P)m5.OFF
+$(P)m5.DVAL
+$(P)m6.OFF
+$(P)m6.DVAL
+$(P)m7.OFF
+$(P)m7.DVAL
+$(P)m8.OFF
+$(P)m8.DVAL
diff --git a/iocBoot/iocSolaris/auto_settings.req b/iocBoot/iocSolaris/auto_settings.req
new file mode 100644
index 0000000..a426ea0
--- /dev/null
+++ b/iocBoot/iocSolaris/auto_settings.req
@@ -0,0 +1,48 @@
+file motor_settings.req P=$(P),M=m1
+file softMotor_settings.req P=$(P),SM=SM1
+file softMotor_settings.req P=$(P),SM=SM2
+file softMotor_settings.req P=$(P),SM=SM3
+file softMotor_settings.req P=$(P),SM=SM4
+file softMotor_settings.req P=$(P),SM=SM5
+file softMotor_settings.req P=$(P),SM=SM6
+file softMotor_settings.req P=$(P),SM=SM7
+file softMotor_settings.req P=$(P),SM=SM8
+file softMotor_settings.req P=$(P),SM=SM9
+file softMotor_settings.req P=$(P),SM=SM10
+
+file scanParms_settings.req P=$(P),M=m1
+
+file table_settings.req P=$(P),T=table1,Q=table1
+
+file scan_settings.req P=$(P),S=scan1
+file scan_settings.req P=$(P),S=scan2
+file scan_settings.req P=$(P),S=scan3
+file scan_settings.req P=$(P),S=scan4
+file scan_settings.req P=$(P),S=scanH
+
+# Kohzu monochromator
+#$(P)BraggHAO.VAL
+#$(P)BraggKAO.VAL
+#$(P)BraggLAO.VAL
+#$(P)BraggAAO.VAL
+#$(P)BraggTypeMO.VAL
+#$(P)KohzuMode2MO.VAL
+#$(P)Kohzu_yOffsetAO.VAL
+
+file userCalcs10_settings.req P=$(P)
+file userCalcN_settings.req P=$(P),N=I_Detector
+file saveData_settings.req P=$(P)
+file userTransforms10_settings.req P=$(P)
+file userStringCalcs10_settings.req P=$(P)
+file userCalcOuts10_settings.req P=$(P)
+# string-sequence records
+file sseq_settings.req P=$(P),S=Sseq1
+file sseq_settings.req P=$(P),S=Sseq2
+file sseq_settings.req P=$(P),S=Sseq3
+
+
+# 4-step measurement
+file auto_4step_settings.req P=$(P),Q=4step
+
+file userAve10_settings.req P=$(P)
+
diff --git a/iocBoot/iocSolaris/envPaths b/iocBoot/iocSolaris/envPaths
new file mode 100644
index 0000000..0d144e7
--- /dev/null
+++ b/iocBoot/iocSolaris/envPaths
@@ -0,0 +1,28 @@
+epicsEnvSet(ARCH,"solaris-sparc-gnu")
+epicsEnvSet(IOC,"iocSolaris")
+epicsEnvSet(TOP,"/home/oxygen4/MOONEY/epics/synApps_5_1/support/xxx")
+epicsEnvSet(SUPPORT,"/home/oxygen/MOONEY/epics/synApps_5_1/support")
+epicsEnvSet(EPICS_BASE,"/home/oxygen/MOONEY/epics/base-3.14.7")
+epicsEnvSet(ALLEN_BRADLEY,"/home/oxygen/MOONEY/epics/synApps_5_1/support/allenBradley/2-1")
+epicsEnvSet(ASYN,"/home/oxygen/MOONEY/epics/synApps_5_1/support/asyn/4-2")
+epicsEnvSet(AUTOSAVE,"/home/oxygen/MOONEY/epics/synApps_5_1/support/autosave/4-1")
+epicsEnvSet(GENSUB,"/home/oxygen/MOONEY/epics/synApps_5_1/support/genSub/1-6")
+epicsEnvSet(CALC,"/home/oxygen/MOONEY/epics/synApps_5_1/support/calc/cvs")
+epicsEnvSet(CAMAC,"/home/oxygen/MOONEY/epics/synApps_5_1/support/camac/cvs")
+epicsEnvSet(CCD,"/home/oxygen/MOONEY/epics/synApps_5_1/support/ccd/cvs")
+epicsEnvSet(DAC128V,"/home/oxygen/MOONEY/epics/synApps_5_1/support/dac128V/cvs")
+epicsEnvSet(DXP,"/home/oxygen/MOONEY/epics/synApps_5_1/support/dxp/cvs")
+epicsEnvSet(IP,"/home/oxygen/MOONEY/epics/synApps_5_1/support/ip/2-4")
+epicsEnvSet(IP330,"/home/oxygen/MOONEY/epics/synApps_5_1/support/ip330/cvs")
+epicsEnvSet(IPAC,"/home/oxygen/MOONEY/epics/synApps_5_1/support/ipac/2-8")
+epicsEnvSet(IPUNIDIG,"/home/oxygen/MOONEY/epics/synApps_5_1/support/ipUnidig/cvs")
+epicsEnvSet(MCA,"/home/oxygen/MOONEY/epics/synApps_5_1/support/mca/cvs")
+epicsEnvSet(MOTOR,"/home/oxygen/MOONEY/epics/synApps_5_1/support/motor/cvs")
+epicsEnvSet(OPTICS,"/home/oxygen/MOONEY/epics/synApps_5_1/support/optics/2-4")
+epicsEnvSet(QUADEM,"/home/oxygen/MOONEY/epics/synApps_5_1/support/quadEM/cvs")
+epicsEnvSet(SNCSEQ,"/home/oxygen/MOONEY/epics/synApps_5_1/support/seq/2-0-9")
+epicsEnvSet(SSCAN,"/home/oxygen/MOONEY/epics/synApps_5_1/support/sscan/cvs")
+epicsEnvSet(STD,"/home/oxygen/MOONEY/epics/synApps_5_1/support/std/cvs")
+epicsEnvSet(VME,"/home/oxygen/MOONEY/epics/synApps_5_1/support/vme/cvs")
+epicsEnvSet(VXSTATS,"/home/oxygen/MOONEY/epics/synApps_5_1/support/vxStats/cvs")
+epicsEnvSet(XXX,"/home/oxygen/MOONEY/epics/synApps_5_1/support/xxx")
diff --git a/iocBoot/iocSolaris/motor.substitutions b/iocBoot/iocSolaris/motor.substitutions
new file mode 100644
index 0000000..a1c4a2a
--- /dev/null
+++ b/iocBoot/iocSolaris/motor.substitutions
@@ -0,0 +1,21 @@
+file "$(MOTOR)/db/motor.db"
+{
+pattern
+{P,		N,	M,		DTYP,			C,	S,	DESC,			EGU,		DIR,	VELO,	VBAS,	ACCL,	BDST,	BVEL,	BACC,	MRES,	PREC,	DHLM,	DLLM,	INIT}
+{xxx:,	1,	m$(N),	"OMS VME8/44",	0,	0,	"M0X",			mm,			Pos,	1,		.1,		.2,		0,		1,		.2,		2.5e-4,	5,		100,	-100,	""}
+{xxx:,	2,	m$(N),	"OMS VME8/44",	0,	1,	"M0Y",			mm,			Pos,	1,		.1,		.2,		0,		1,		.2,		2.5e-4,	5,		100,	-100,	""}
+{xxx:,	3,	m$(N),	"OMS VME8/44",	0,	2,	"M1Y",			mm,			Pos,	1,		.1,		.2,		0,		1,		.2,		2.5e-4,	5,		100,	-100,	""}
+{xxx:,	4,	m$(N),	"OMS VME8/44",	0,	3,	"M2X",			mm,			Pos,	1,		.1,		.2,		0,		1,		.2,		2.5e-4,	5,		100,	-100,	""}
+{xxx:,	5,	m$(N),	"OMS VME8/44",	0,	4,	"M2Y",			mm,			Pos,	1,		.1,		.2,		0,		1,		.2,		2.5e-4,	5,		100,	-100,	""}
+{xxx:,	6,	m$(N),	"OMS VME8/44",	0,	5,	"M2Z",			mm,			Pos,	1,		.1,		.2,		0,		1,		.2,		2.5e-4,	5,		100,	-100,	""}
+{xxx:,	7,	m$(N),	"OMS VME8/44",	0,	6,	"motor $(N)",	degrees,	Pos,	1,		.1,		.2,		0,		1,		.2,		2.5e-4,	5,		100,	-100,	""}
+{xxx:,	8,	m$(N),	"OMS VME8/44",	0,	7,	"motor $(N)",	degrees,	Pos,	1,		.1,		.2,		0,		1,		.2,		2.5e-4,	5,		100,	-100,	""}
+{xxx:,	9,	m$(N),	"OMS VME58",	0,	0,	"motor $(N)",	degrees,	Pos,	1,		.1,		.2,		0,		1,		.2,		2.5e-4,	5,		100,	-100,	""}
+{xxx:,	10,	m$(N),	"OMS VME58",	0,	1,	"motor $(N)",	degrees,	Pos,	1,		.1,		.2,		0,		1,		.2,		2.5e-4,	5,		100,	-100,	""}
+{xxx:,	11,	m$(N),	"OMS VME58",	0,	2,	"motor $(N)",	degrees,	Pos,	1,		.1,		.2,		0,		1,		.2,		2.5e-4,	5,		100,	-100,	""}
+{xxx:,	12,	m$(N),	"OMS VME58",	0,	3,	"motor $(N)",	degrees,	Pos,	1,		.1,		.2,		0,		1,		.2,		2.5e-4,	5,		100,	-100,	""}
+{xxx:,	13,	m$(N),	"OMS VME58",	0,	4,	"motor $(N)",	degrees,	Pos,	1,		.1,		.2,		0,		1,		.2,		2.5e-4,	5,		100,	-100,	""}
+{xxx:,	14,	m$(N),	"OMS VME58",	0,	5,	"motor $(N)",	degrees,	Pos,	1,		.1,		.2,		0,		1,		.2,		2.5e-4,	5,		100,	-100,	""}
+{xxx:,	15,	m$(N),	"OMS VME58",	0,	6,	"motor $(N)",	degrees,	Pos,	1,		.1,		.2,		0,		1,		.2,		2.5e-4,	5,		100,	-100,	""}
+{xxx:,	16,	m$(N),	"OMS VME58",	0,	7,	"motor $(N)",	degrees,	Pos,	1,		.1,		.2,		0,		1,		.2,		2.5e-4,	5,		100,	-100,	""}
+}
diff --git a/iocBoot/iocSolaris/run b/iocBoot/iocSolaris/run
new file mode 100755
index 0000000..001877b
--- /dev/null
+++ b/iocBoot/iocSolaris/run
@@ -0,0 +1 @@
+../../bin/${EPICS_HOST_ARCH}/xxx st.cmd
diff --git a/iocBoot/iocSolaris/saveData.req b/iocBoot/iocSolaris/saveData.req
new file mode 100644
index 0000000..6eaff4e
--- /dev/null
+++ b/iocBoot/iocSolaris/saveData.req
@@ -0,0 +1,40 @@
+[prefix]
+$(P)
+
+[status]
+$(P)saveData_status
+
+[message]
+$(P)saveData_message
+
+[filename]
+$(P)saveData_fileName
+
+[counter]	# scan counter
+$(P)saveData_scanNumber
+
+[fileSystem] # scan file system
+$(P)saveData_fileSystem
+
+[subdir]	# scan file subdirectory
+$(P)saveData_subDir
+
+[fullPathName]
+$(P)saveData_fullPathName
+
+[realTime1D] # if nonzero, write 1D data as it comes in
+$(P)saveData_realTime1D
+
+[scanRecord]	# specify scan records to be monitored
+$(P)scanH
+$(P)scan1
+$(P)scan2
+$(P)scan3
+$(P)scan4
+
+[extraPV]
+$(P)userCalc1.CALC	"string"
+$(P)saveData_realTime1D "enum"
+$(P)saveData_scanNumber	"long"
+$(P)saveData_fileSystem	"filesystem"
+$(P)scan1.P1SM		"scan mode"
diff --git a/iocBoot/iocSolaris/save_restore.cmd b/iocBoot/iocSolaris/save_restore.cmd
new file mode 100644
index 0000000..6aadbca
--- /dev/null
+++ b/iocBoot/iocSolaris/save_restore.cmd
@@ -0,0 +1,56 @@
+### save_restore setup
+#
+# The rest this file does not require modification for standard use, but...
+# If you want save_restore to manage its own NFS mount, specify the name and
+# IP address of the file server to which save files should be written.
+# This currently is supported only on vxWorks.
+#save_restoreSet_NFSHost("oxygen", "164.54.52.4")
+
+# status-PV prefix
+save_restoreSet_status_prefix("xxx:")
+# Debug-output level
+save_restoreSet_Debug(0)
+
+# Ok to save/restore save sets with missing values (no CA connection to PV)?
+save_restoreSet_IncompleteSetsOk(1)
+# Save dated backup files?
+save_restoreSet_DatedBackupFiles(1)
+
+# Number of sequenced backup files to write
+save_restoreSet_NumSeqFiles(3)
+# Time interval between sequenced backups
+save_restoreSet_SeqPeriodInSeconds(300)
+
+# specify where save files should be
+set_savefile_path("$(STARTUP)", "autosave")
+
+# 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("auto_positions.sav")
+set_pass0_restoreFile("auto_settings.sav")
+set_pass1_restoreFile("auto_settings.sav")
+
+# specify directories in which to to search for included request files
+# Note cdCommands defines 'startup', but envPaths does not
+set_requestfile_path("$(STARTUP)", "")
+set_requestfile_path("$(STARTUP)", "autosave")
+set_requestfile_path("$(AUTOSAVE)", "asApp/Db")
+set_requestfile_path("$(CALC)", "calcApp/Db")
+#set_requestfile_path("$(CAMAC)", "camacApp/Db")
+set_requestfile_path("$(CCD)", "ccdApp/Db")
+set_requestfile_path("$(DAC128V)", "dac128VApp/Db")
+set_requestfile_path("$(DXP)", "dxpApp/Db")
+set_requestfile_path("$(IP)", "ipApp/Db")
+set_requestfile_path("$(IP330)", "ip330App/Db")
+set_requestfile_path("$(IPUNIDIG)", "ipUnidigApp/Db")
+#set_requestfile_path("$(LOVE)", "loveApp/Db")
+set_requestfile_path("$(MCA)", "mcaApp/Db")
+set_requestfile_path("$(MOTOR)", "motorApp/Db")
+set_requestfile_path("$(OPTICS)", "opticsApp/Db")
+set_requestfile_path("$(QUADEM)", "quadEMApp/Db")
+set_requestfile_path("$(SSCAN)", "sscanApp/Db")
+set_requestfile_path("$(STD)", "stdApp/Db")
+set_requestfile_path("$(VME)", "vmeApp/Db")
+
+dbLoadRecords("$(AUTOSAVE)/asApp/Db/save_restoreStatus.db", "P=xxx:")
diff --git a/iocBoot/iocSolaris/scanParms.substitutions b/iocBoot/iocSolaris/scanParms.substitutions
new file mode 100644
index 0000000..6cda7e7
--- /dev/null
+++ b/iocBoot/iocSolaris/scanParms.substitutions
@@ -0,0 +1,48 @@
+file "$(SSCAN)/sscanApp/Db/scanParms.db"
+{
+{P=xxx:,SCANREC=xxx:scan1,Q=SM1,POS=$(Q).VAL,RDBK=$(Q).RBV}
+{P=xxx:,SCANREC=xxx:scan1,Q=SM2,POS=$(Q).VAL,RDBK=$(Q).RBV}
+{P=xxx:,SCANREC=xxx:scan1,Q=SM3,POS=$(Q).VAL,RDBK=$(Q).RBV}
+{P=xxx:,SCANREC=xxx:scan1,Q=SM4,POS=$(Q).VAL,RDBK=$(Q).RBV}
+{P=xxx:,SCANREC=xxx:scan1,Q=SM5,POS=$(Q).VAL,RDBK=$(Q).RBV}
+{P=xxx:,SCANREC=xxx:scan1,Q=SM6,POS=$(Q).VAL,RDBK=$(Q).RBV}
+{P=xxx:,SCANREC=xxx:scan1,Q=SM7,POS=$(Q).VAL,RDBK=$(Q).RBV}
+{P=xxx:,SCANREC=xxx:scan1,Q=SM8,POS=$(Q).VAL,RDBK=$(Q).RBV}
+{P=xxx:,SCANREC=xxx:scan1,Q=SM9,POS=$(Q).VAL,RDBK=$(Q).RBV}
+{P=xxx:,SCANREC=xxx:scan1,Q=SM10,POS=$(Q).VAL,RDBK=$(Q).RBV}
+
+{P=xxx:,SCANREC=xxx:scan1,Q=Table1X,POS=table1.X,RDBK=table1.XRB}
+{P=xxx:,SCANREC=xxx:scan1,Q=Table1Y,POS=table1.Y,RDBK=table1.YRB}
+{P=xxx:,SCANREC=xxx:scan1,Q=Table1Z,POS=table1.Z,RDBK=table1.ZRB}
+{P=xxx:,SCANREC=xxx:scan1,Q=Table1AX,POS=table1.AX,RDBK=table1.AXRB}
+{P=xxx:,SCANREC=xxx:scan1,Q=Table1AY,POS=table1.AY,RDBK=table1.AYRB}
+{P=xxx:,SCANREC=xxx:scan1,Q=Table1AZ,POS=table1.AZ,RDBK=table1.AZRB}
+
+#{P=xxx:,SCANREC=xxx:scan1,Q=BraggE,POS=BraggEAO.VAL,RDBK=BraggERdbkAO.VAL}
+#{P=xxx:,SCANREC=xxx:scan1,Q=BraggLambda,POS=BraggLambdaAO.VAL,RDBK=BraggLambdaRdbkAO.VAL}
+#{P=xxx:,SCANREC=xxx:scan1,Q=BraggTheta,POS=BraggThetaAO.VAL,RDBK=BraggThetaRdbkAO.VAL}
+
+#{P=xxx:,SCANREC=xxx:scan1,Q=HR1_E,POS=HR1_EAO.VAL,RDBK=HR1_ERdbkAO}
+#{P=xxx:,SCANREC=xxx:scan1,Q=HR1_A,POS=HR1_worldOffAO.VAL,RDBK=HR1_worldOffAO.VAL}
+
+# old slit
+{P=xxx:,SCANREC=xxx:scan1,Q=Slit1Hp,POS=Slit1Hxp.VAL,RDBK=Slit1Ht2.A}
+{P=xxx:,SCANREC=xxx:scan1,Q=Slit1Hn,POS=Slit1Hxn.VAL,RDBK=Slit1Ht2.B}
+{P=xxx:,SCANREC=xxx:scan1,Q=Slit1Hsize,POS=Slit1Hsize.VAL,RDBK=Slit1Ht2.C}
+{P=xxx:,SCANREC=xxx:scan1,Q=Slit1Hcenter,POS=Slit1Hcenter.VAL,RDBK=Slit1Ht2.D}
+{P=xxx:,SCANREC=xxx:scan1,Q=Slit1Vp,POS=Slit1Vxp.VAL,RDBK=Slit1Vt2.A}
+{P=xxx:,SCANREC=xxx:scan1,Q=Slit1Vn,POS=Slit1Vxn.VAL,RDBK=Slit1Vt2.B}
+{P=xxx:,SCANREC=xxx:scan1,Q=Slit1Vsize,POS=Slit1Vsize.VAL,RDBK=Slit1Vt2.C}
+{P=xxx:,SCANREC=xxx:scan1,Q=Slit1Vcenter,POS=Slit1Vcenter.VAL,RDBK=Slit1Vt2.D}
+
+# new soft-motor-based slit
+#{P=xxx:,SCANREC=xxx:scan1,Q=Slit2Hxn,POS=$(Q).VAL,RDBK=$(Q).RBV}
+#{P=xxx:,SCANREC=xxx:scan1,Q=Slit2Hxp,POS=$(Q).VAL,RDBK=$(Q).RBV}
+#{P=xxx:,SCANREC=xxx:scan1,Q=Slit2Hsize,POS=$(Q).VAL,RDBK=$(Q).RBV}
+#{P=xxx:,SCANREC=xxx:scan1,Q=Slit2Hcenter,POS=$(Q).VAL,RDBK=$(Q).RBV}
+#{P=xxx:,SCANREC=xxx:scan1,Q=Slit2Vxn,POS=$(Q).VAL,RDBK=$(Q).RBV}
+#{P=xxx:,SCANREC=xxx:scan1,Q=Slit2Vxp,POS=$(Q).VAL,RDBK=$(Q).RBV}
+#{P=xxx:,SCANREC=xxx:scan1,Q=Slit2Vsize,POS=$(Q).VAL,RDBK=$(Q).RBV}
+#{P=xxx:,SCANREC=xxx:scan1,Q=Slit2Vcenter,POS=$(Q).VAL,RDBK=$(Q).RBV}
+
+}
diff --git a/iocBoot/iocSolaris/softMotor.substitutions b/iocBoot/iocSolaris/softMotor.substitutions
new file mode 100644
index 0000000..988001d
--- /dev/null
+++ b/iocBoot/iocSolaris/softMotor.substitutions
@@ -0,0 +1,15 @@
+file "$(STD)/stdApp/Db/softMotor.db"
+{
+pattern
+{P,		SM}
+{xxx:,	SM1}
+{xxx:,	SM2}
+{xxx:,	SM3}
+{xxx:,	SM4}
+{xxx:,	SM5}
+{xxx:,	SM6}
+{xxx:,	SM7}
+{xxx:,	SM8}
+{xxx:,	SM9}
+{xxx:,	SM10}
+}
diff --git a/iocBoot/iocSolaris/st.cmd b/iocBoot/iocSolaris/st.cmd
new file mode 100644
index 0000000..b7a6f1b
--- /dev/null
+++ b/iocBoot/iocSolaris/st.cmd
@@ -0,0 +1,142 @@
+# vxWorks startup script
+
+# Read environment variables
+< envPaths
+
+# save_restore.cmd needs the full path to the startup directory, which
+# envPaths currently does not provide
+epicsEnvSet(STARTUP,$(TOP)/iocBoot/$(IOC))
+
+################################################################################
+# Tell EPICS all about the record types, device-support modules, drivers,
+# etc. in the software we just loaded (xxx.munch)
+dbLoadDatabase("../../dbd/iocxxx_solaris.dbd")
+iocxxx_solaris_registerRecordDeviceDriver(pdbbase)
+
+# Increase size of buffer for error logging from default 1256
+errlogInit(5000)
+
+# debug sseq record
+#var sseqRecDebug,10
+ 
+# need more entries in wait/scan-record channel-access queue?
+#var recDynLinkQsize, 1024
+
+# Specify largest array CA will transport
+# Note for N sscanRecord data points, need (N+1)*8 bytes, else MEDM
+# plot doesn't display
+epicsEnvSet EPICS_CA_MAX_ARRAY_BYTES 64008
+
+### save_restore setup
+# We presume a suitable initHook routine was compiled into the executable.
+# See also create_monitor_set(), after iocInit() .
+< save_restore.cmd
+
+dbLoadRecords("$(TOP)/xxxApp/Db/busy.db", "P=xxx:,B=busy")
+
+# Motors
+dbLoadTemplate("softMotor.substitutions")
+
+# interpolation
+dbLoadRecords("$(CALC)/calcApp/Db/interp.db", "P=xxx:,N=2000")
+
+
+### 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/scan.db","P=xxx:,MAXPTS1=4000,MAXPTS2=200,MAXPTS3=10,MAXPTS4=10,MAXPTSH=4000")
+
+# 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("scanParms.substitutions")
+
+# Slits
+#dbLoadRecords("$(OPTICS)/opticsApp/Db/2slit.db","P=xxx:,SLIT=Slit1V,mXp=m3,mXn=m4")
+#dbLoadRecords("$(OPTICS)/opticsApp/Db/2slit.db","P=xxx:,SLIT=Slit1H,mXp=m5,mXn=m6")
+
+# 2-post mirror
+#dbLoadRecords("$(OPTICS)/opticsApp/Db/2postMirror.db","P=xxx:,Q=M1,mDn=m1,mUp=m2,LENGTH=0.3")
+
+# User filters
+#dbLoadRecords("$(OPTICS)/opticsApp/Db/filterMotor.db","P=xxx:,Q=fltr1:,MOTOR=m1,LOCK=fltr_1_2:")
+#dbLoadRecords("$(OPTICS)/opticsApp/Db/filterMotor.db","P=xxx:,Q=fltr2:,MOTOR=m2,LOCK=fltr_1_2:")
+
+# Optical tables
+#var tableRecordDebug,1
+#dbLoadRecords("$(OPTICS)/opticsApp/Db/table.db","P=xxx:,Q=Table1,T=table1,M0X=m1,M0Y=m2,M1Y=m3,M2X=m4,M2Y=m5,M2Z=m6,GEOM=SRI")
+
+### Monochromator support ###
+# Kohzu and PSL monochromators: Bragg and theta/Y/Z motors
+# standard geometry (geometry 1)
+#dbLoadRecords("$(OPTICS)/opticsApp/Db/kohzuSeq.db","P=xxx:,M_THETA=m1,M_Y=m2,M_Z=m3,yOffLo=17.4999,yOffHi=17.5001")
+# modified geometry (geometry 2)
+#dbLoadRecords("$(OPTICS)/opticsApp/Db/kohzuSeq.db","P=xxx:,M_THETA=m1,M_Y=m2,M_Z=m3,yOffLo=4,yOffHi=36")
+
+# Spherical grating monochromator
+#dbLoadRecords("$(OPTICS)/opticsApp/Db/SGM.db","P=xxx:,N=1,M_x=m1,M_rIn=m2,M_rOut=m3,M_g=m4")
+
+# 4-bounce high-resolution monochromator
+#dbLoadRecords("$(OPTICS)/opticsApp/Db/hrSeq.db","P=xxx:,N=1,M_PHI1=m1,M_PHI2=m2")
+
+### Stuff for user programming ###
+dbLoadRecords("$(CALC)/calcApp/Db/userCalcs10.db","P=xxx:")
+dbLoadRecords("$(CALC)/calcApp/Db/userStringCalcs10.db","P=xxx:")
+dbLoadRecords("$(CALC)/calcApp/Db/userTransforms10.db","P=xxx:")
+# extra userCalcs (must also load userCalcs10.db for the enable switch)
+dbLoadRecords("$(CALC)/calcApp/Db/userCalcN.db","P=xxx:,N=I_Detector")
+#dbLoadRecords("$(CALC)/calcApp/Db/userAve10.db","P=xxx:")
+dbLoadRecords("$(CALC)/calcApp/Db/userCalcOuts10.db","P=xxx:")
+# string sequence (sseq) record
+dbLoadRecords("$(STD)/stdApp/Db/yySseq.db","P=xxx:,S=Sseq1")
+dbLoadRecords("$(STD)/stdApp/Db/yySseq.db","P=xxx:,S=Sseq2")
+dbLoadRecords("$(STD)/stdApp/Db/yySseq.db","P=xxx:,S=Sseq3")
+# 4-step measurement
+#dbLoadRecords("$(STD)/stdApp/Db/4step.db", "P=xxx:")
+
+### serial support ###
+
+# generic serial ports
+#dbLoadRecords("$(IP)/ipApp/Db/generic_serial.db", "P=xxx:,C=0,SERVER=serial1")
+#dbLoadRecords("$(IP)/ipApp/Db/generic_serial.db", "P=xxx:,C=0,SERVER=serial2")
+
+# serial O/I block (generic serial record with format and parse string calcs)
+# on epics/mpf processor
+#dbLoadRecords("$(IP)/ipApp/Db/serial_OI_block.db","P=xxx:,N=0_1,C=0,SERVER=serial5")
+# on stand-alone mpf processor
+#dbLoadRecords("$(IP)/ipApp/Db/serial_OI_block.db","P=xxx:,N=1_1,C=0,SERVER=serial5")
+
+# Miscellaneous PV's, such as burtResult
+dbLoadRecords("$(STD)/stdApp/Db/misc.db","P=xxx:")
+
+
+###############################################################################
+iocInit
+
+### startup State Notation Language programs
+#seq &kohzuCtl, "P=xxx:, M_THETA=m1, M_Y=m2, M_Z=m3, GEOM=1, logfile=kohzuCtl.log"
+#seq &hrCtl, "P=xxx:, N=1, M_PHI1=m1, M_PHI2=m2, logfile=hrCtl1.log"
+
+### Start up the autosave task and tell it what to do.
+# The task is actually named "save_restore".
+# Note that you can reload these sets after creating them: e.g., 
+# reload_monitor_set("auto_settings.req",30,"P=xxx:")
+#
+# save positions every five seconds
+create_monitor_set("auto_positions.req",5,"P=xxx:")
+# save other things every thirty seconds
+create_monitor_set("auto_settings.req",30,"P=xxx:")
+
+### Start the saveData task.
+# saveData_MessagePolicy
+# 0: wait forever for space in message queue, then send message
+# 1: send message only if queue is not full
+# 2: send message only if queue is not full and specified time has passed (SetCptWait()
+#    sets this time.)
+# 3: if specified time has passed, wait for space in queue, then send message
+# else: don't send message
+#var "debug_saveData" 2
+#saveData_MessagePolicy = 2
+#saveData_SetCptWait_ms(100)
+saveData_Init("saveData.req", "P=xxx:")
+#saveData_PrintScanInfo("xxx:scan1")
-- 
GitLab