diff --git a/.gitignore b/.gitignore
index 37cbf09b..fe0d44f6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,6 +5,7 @@ O.*
bin/
/db/
dbd/
+/iocsh/
html/
include/
lib/
@@ -16,3 +17,4 @@ auto_settings.sav*
auto_positions.sav*
*.local
makelog.txt
+.loglogin
diff --git a/.loglogin b/.loglogin
deleted file mode 100644
index f989b568..00000000
--- a/.loglogin
+++ /dev/null
@@ -1,2 +0,0 @@
-02/17/2021 - 08:26:06 - bm17-bluesky
-02/17/2021 - 08:34:14 - bm17-bluesky
diff --git a/configure/RELEASE b/configure/RELEASE
index f1908cec..59171a2a 100644
--- a/configure/RELEASE
+++ b/configure/RELEASE
@@ -9,14 +9,16 @@
#
# Add your declarations here
+
+
# SUPPORT=/home/oxygen/MOONEY/epics/synAppsSVN/support
-SUPPORT=/APSshare/epics/synApps_6_1/support-v7
+SUPPORT=/APSshare/epics/synApps_6_2_1/support
-ASYN=$(SUPPORT)/asyn-R4-36
-IPAC=$(SUPPORT)/ipac-2-15
-SNCSEQ=$(SUPPORT)/seq-2-2-6
+ASYN=$(SUPPORT)/asyn-R4-42
+IPAC=$(SUPPORT)/ipac-2-16
+SNCSEQ=$(SUPPORT)/seq-2-2-9
-EPICS_BASE=/APSshare/epics/base-7.0.3
+EPICS_BASE=/APSshare/epics/base-7.0.4.1
# These lines allow developers to override these RELEASE settings
# without having to modify this file directly.
diff --git a/ipApp/Db/KeyenceCL3000.proto b/ipApp/Db/KeyenceCL3000.proto
new file mode 100644
index 00000000..2c7e3162
--- /dev/null
+++ b/ipApp/Db/KeyenceCL3000.proto
@@ -0,0 +1,97 @@
+Terminator = CR;
+
+emission_ctrl {
+ out "LC,%i";
+ in "LC";
+ @mismatch {in "%(\$1:errorString)s";}
+}
+
+setMode {
+ out "%s";
+ in "%(\$1:mode_RBV)s";
+ @mismatch {in "%(\$1:errorString)s";}
+}
+
+autoZero {
+ out "ZS,%i,\$1";
+ in "ZS";
+ @mismatch {in "%(\$2:\$1:errorString)s";}
+}
+
+setOffset {
+ out "SW,OF,\$1,%+08.4f";
+ in "SW,OF";
+ @mismatch {in "%(\$2:\$1:errorString)s";}
+}
+
+setOffsetStr {
+ out "SW,OF,\$1,%s";
+ in "SW,OF";
+ @mismatch {in "%(\$2:\$1:errorString)s";}
+}
+
+getOffset {
+ out "SR,OF,\$1";
+ in "SR,OF,\$1,%f";
+ @mismatch {in "%(\$2:\$1:errorString)s";}
+}
+
+setScaling {
+ out "SW,SC,\$1,+00.0000,+00.0000,+01.0000,%+08.4f";
+ in "SW,SC";
+ @mismatch {in "%(\$2:\$1:errorString)s";}
+}
+
+setScalingStr {
+ out "SW,SC,\$1,%s";
+ in "SW,SC";
+ @mismatch {in "%(\$2:\$1:errorString)s";}
+}
+
+
+getScaling {
+ out "SR,SC,\$1";
+ in "SR,SC,\$1,%*f,%*f,%*f,%f";
+ @mismatch {in "%(\$2:\$1:errorString)s";}
+}
+
+# Measurement value get request options.
+# 0: Measurement value only
+# 1: Measurement value + Measurement result information
+# 2: Measurement value + Judgment result
+# 3: Measurement value + Measurement result information + Judgment result
+# 4: Count value + Measurement value
+# 5: Count value + Measurement value + Measurement result information
+# 6: Count value + Measurement value + Judgment result
+# 7: Count value + Measurement value + Measurement result information + Judgment result
+
+
+getMeas {
+ out "MS,%(\$2:\$1:measType)i,\$1";
+ in "MS,%(\$2:\$1:measString)s";
+ @mismatch {in "%(\$2:\$1:errorString)s";}
+}
+
+# generic send/receive a command. Note that it requires the first two chars of
+# the send string to be the length, so external formatting is required.
+sendCmd {
+ out "%s";
+ in "%(\$2:\$1:replyString)s";
+}
+
+# Unused/not fully tested or troubleshot
+
+
+startAuto {
+ out "NS,%(\$2:\$1:measType),\$1";
+ in "NS";
+ @mismatch {in "%(\$2:\$1:errorString)s";}
+}
+
+stopAuto {
+ out "NT";
+ in "NT";
+ @mismatch {in "%(\$2:\$1:errorString)s";}
+}
+
+
diff --git a/ipApp/Db/KeyenceCL3000_chan.db b/ipApp/Db/KeyenceCL3000_chan.db
new file mode 100644
index 00000000..bf8715a1
--- /dev/null
+++ b/ipApp/Db/KeyenceCL3000_chan.db
@@ -0,0 +1,302 @@
+# Channel specific control of Keyence CL-3000
+
+record(bo, "$(P)$(S):$(CHAN):autoZero")
+{
+ field(DTYP, "stream")
+ field(OUT, "@KeyenceCL3000.proto autoZero($(CHAN), $(P)$(S)) $(PORT)")
+ field(DESC, "Turn on/off automatic zeroing")
+ field(ZNAM, "OFF")
+ field(ONAM, "ON")
+}
+
+record(ao, "$(P)$(S):$(CHAN):offset_set")
+{
+# field(DTYP, "stream")
+# field(OUT, "@KeyenceCL3000.proto setOffset($(CHAN), $(P)$(S)) $(PORT)")
+ field(DESC, "Offset setting")
+ field(FLNK, "$(P)$(S):$(CHAN):offset_string PP")
+ field(PREC, "4")
+ field(PINI, "1")
+}
+
+record(scalcout, "$(P)$(S):$(CHAN):offset_string")
+{
+ field(DTYP, "stream")
+ field(INPA, "$(P)$(S):$(CHAN):offset_set PP")
+ field(AA, "$(MINDISP)")
+# field(BB, "SW,OF,$(CHAN),")
+ field(CALC, "$P(AA,A)")
+ field(OUT, "@KeyenceCL3000.proto setOffsetStr($(CHAN), $(P)$(S)) $(PORT)")
+ field(DESC, "Offset setting string")
+ field(FLNK, "$(P)$(S):$(CHAN):offset_RBV PP")
+}
+
+record(ai, "$(P)$(S):$(CHAN):offset_RBV")
+{
+ field(DTYP, "stream")
+ field(INP, "@KeyenceCL3000.proto getOffset($(CHAN), $(P)$(S)) $(PORT)")
+ field(DESC, "Offset readback")
+ field(PREC, "4")
+}
+
+record(ao, "$(P)$(S):$(CHAN):scaling_set")
+{
+# field(DTYP, "stream")
+# field(OUT, "@KeyenceCL3000.proto setScaling($(CHAN), $(P)$(S)) $(PORT)")
+ field(DESC, "Scaling setting")
+ field(FLNK, "$(P)$(S):$(CHAN):scaling_string PP")
+ field(PREC, "4")
+ field(PINI, "1")
+}
+
+record(scalcout, "$(P)$(S):$(CHAN):scaling_string")
+{
+ field(DTYP, "stream")
+ field(A, "0")
+ field(B, "0")
+ field(C, "1")
+ field(INPD, "$(P)$(S):$(CHAN):scaling_set PP")
+ field(AA, "$(MINDISP)")
+# field(BB, "SW,SC,$(CHAN),")
+ field(CALC, "$P(AA,A)+','+$P(AA,B)+','+$P(AA,C)+','+$P(AA,D)")
+ field(OUT, "@KeyenceCL3000.proto setScalingStr($(CHAN), $(P)$(S)) $(PORT)")
+ field(DESC, "Scaling setting string")
+ field(FLNK, "$(P)$(S):$(CHAN):scaling_RBV PP")
+}
+
+record(ai, "$(P)$(S):$(CHAN):scaling_RBV")
+{
+ field(DTYP, "stream")
+ field(INP, "@KeyenceCL3000.proto getScaling($(CHAN), $(P)$(S)) $(PORT)")
+ field(DESC, "Scaling readback")
+ field(PREC, "4")
+}
+
+# Measurement value get request options.
+# 0: Measurement value only
+# 1: Measurement value + Measurement result information
+# 2: Measurement value + Judgment result
+# 3: Measurement value + Measurement result information + Judgment result
+# 4: Count value + Measurement value
+# 5: Count value + Measurement value + Measurement result information
+# 6: Count value + Measurement value + Judgment result
+# 7: Count value + Measurement value + Measurement result information + Judgment result
+
+record(mbbo, "$(P)$(S):$(CHAN):measType")
+{
+ field(DTYP, "Soft Channel")
+ field(ZRST, "Meas value only")
+ field(ONST, "Meas value + result info")
+ field(TWST, "Meas value + judgement")
+ field(THST, "Meas + result + judgement")
+ field(FRST, "Count + Meas value")
+ field(FVST, "Count + Meas + result")
+ field(SXST, "Count + Meas + judgement")
+ field(SVST, "All")
+}
+
+record(ao, "$(P)$(S):$(CHAN):measurement")
+{
+ field(DTYP, "stream")
+ field(OUT, "@KeyenceCL3000.proto getMeas($(CHAN), $(P)$(S)) $(PORT)")
+ field(DESC, "Measurement value")
+ field(FLNK, "$(P)$(S):$(CHAN):measString")
+}
+
+record(ai, "$(P)$(S):$(CHAN):measurement_RBV")
+{
+ field(DTYP, "Soft Channel")
+ field(PREC, "4")
+ field(EGU, "mm")
+ field(DESC, "Measurement value")
+}
+
+record(ai, "$(P)$(S):$(CHAN):resultInfo_RBV")
+{
+ field(DTYP, "Soft Channel")
+ field(DESC, "Result Info")
+}
+
+record(stringin, "$(P)$(S):$(CHAN):judgement_RBV")
+{
+ field(DTYP, "Soft Channel")
+ field(DESC, "Judgement value")
+}
+
+record(ai, "$(P)$(S):$(CHAN):Count_RBV")
+{
+ field(DTYP, "Soft Channel")
+ field(DESC, "Count value")
+}
+
+########################################################################
+# When an error occurs on command acceptance An error response “ER, **, nn” will be returned.
+# The error response consists of the following information:
+# ○○ Received command that caused the error
+#
+# 2-digit error code
+# • 72: Timeout error
+# • 73: Command length error
+# • 74: Undefined command error
+# nn • 81: State error
+# • 82: Parameter count error
+# • 83: Parameter range error
+# • 84: Command specific error (Refer to the command
+# details)
+########################################################################
+
+record(stringin, "$(P)$(S):$(CHAN):errorString")
+{
+ field(DTYP, "Soft Channel")
+ field(DESC, "Last error")
+}
+
+record(stringin, "$(P)$(S):$(CHAN):measString")
+{
+ field(DESC, "Measurement string")
+ field(FLNK, "$(P)$(S):$(CHAN):parseSeq")
+}
+
+########################################################################
+# Parsing measurement string
+#
+# 4x sCalcouts -- called selectively based on measurement type
+# 1. Get first float (either counts or measurement); all types (0-7)
+# 2. Get second float/string (either measurement, result or judgment); types 1-7
+# 3. Get third float/string (either result or judgment; types 3, 5-7
+# 4. Get fourth string (judgement); type 7
+#
+# 2x sseq
+# 1. Choose sCalcouts based on calcMask
+# 2. distribute parsed strings based on distMask
+#
+# 2x calcouts
+# 1. calcMask: Calc mask to choose which sCalcouts to complete based on measurement type
+# 0 --> calc1
+# 1,2,4 --> calc1, calc2
+# 3,5,6 --> calc1, calc2, calc3
+# 7 --> calc1, calc2, calc3, calc4
+# 2. distMask: Calc mask for sseq to send correct strings to correct RBV PV
+# 0 --> 1; 1 --> 9; 2 --> 33; 3 --> 73; 4 --> 6; 5 --> 22; 6 --> 70; 7 --> 150
+#
+########################################################################
+
+
+record(scalcout, "$(P)$(S):$(CHAN):parseMeasStr1")
+{
+ field(DESC, "Get first element of return string")
+ field(INAA, "$(P)$(S):$(CHAN):measString NPP")
+ field(CALC, "BB:=$S(AA,\"%f,%*s\");B:=DBL(BB);BB")
+}
+
+record(scalcout, "$(P)$(S):$(CHAN):parseMeasStr2")
+{
+ field(DESC, "Get second element - if there")
+ field(INAA, "$(P)$(S):$(CHAN):measString NPP")
+ field(INPA, "$(P)$(S):$(CHAN):measType")
+ field(CALC, "BB:=(A=2?$S(AA,\"%*f,%s\"):$S(AA,\"%*f,%f,%*s\"));BB")
+}
+
+record(scalcout, "$(P)$(S):$(CHAN):parseMeasStr3")
+{
+ field(DESC, "Get third element - if there")
+ field(INAA, "$(P)$(S):$(CHAN):measString NPP")
+ field(INPA, "$(P)$(S):$(CHAN):measType")
+ field(CALC, "BB:=((A%3)=0?$S(AA,\"%*f,%*f,%s\"):$S(AA,\"%*f,%*f,%f,%*s\"));BB")
+}
+
+record(scalcout, "$(P)$(S):$(CHAN):parseMeasStr4")
+{
+ field(DESC, "Get fourth element - if there")
+ field(INAA, "$(P)$(S):$(CHAN):measString NPP")
+ field(CALC, "BB:=$S(AA,\"%*f,%*f,%*f,%s\");BB")
+}
+
+# Use Meas Type as mask to process the RBVs which pull in various elements of earlier string calc
+record(seq, "$(P)$(S):$(CHAN):parseSeq")
+{
+ field(LNK1, "$(P)$(S):$(CHAN):parseMeasStr1.PROC PP")
+ field(LNK2, "$(P)$(S):$(CHAN):parseMeasStr2.PROC PP")
+ field(LNK3, "$(P)$(S):$(CHAN):parseMeasStr3.PROC PP")
+ field(LNK4, "$(P)$(S):$(CHAN):parseMeasStr4.PROC PP")
+ field(SELM, "2")
+ field(SELL, "$(P)$(S):$(CHAN):parseMask PP")
+ field(FLNK, "$(P)$(S):$(CHAN):distSeq")
+}
+
+
+record(sseq, "$(P)$(S):$(CHAN):distSeq")
+{
+ field(DOL1, "$(P)$(S):$(CHAN):parseMeasStr1.VAL PP")
+ field(LNK1, "$(P)$(S):$(CHAN):measurement_RBV PP")
+ field(DOL2, "$(P)$(S):$(CHAN):parseMeasStr2.VAL PP")
+ field(LNK2, "$(P)$(S):$(CHAN):measurement_RBV PP")
+ field(DOL3, "$(P)$(S):$(CHAN):parseMeasStr1.VAL PP")
+ field(LNK3, "$(P)$(S):$(CHAN):Count_RBV PP")
+ field(DOL4, "$(P)$(S):$(CHAN):parseMeasStr2.VAL PP")
+ field(LNK4, "$(P)$(S):$(CHAN):resultInfo_RBV PP")
+ field(DOL5, "$(P)$(S):$(CHAN):parseMeasStr3.VAL PP")
+ field(LNK5, "$(P)$(S):$(CHAN):resultInfo_RBV PP")
+ field(DOL6, "$(P)$(S):$(CHAN):parseMeasStr2.SVAL PP")
+ field(LNK6, "$(P)$(S):$(CHAN):judgement_RBV PP")
+ field(DOL7, "$(P)$(S):$(CHAN):parseMeasStr3.SVAL PP")
+ field(LNK7, "$(P)$(S):$(CHAN):judgement_RBV PP")
+ field(DOL8, "$(P)$(S):$(CHAN):parseMeasStr4.SVAL PP")
+ field(LNK8, "$(P)$(S):$(CHAN):judgement_RBV PP")
+ field(SELM, "2")
+ field(SELL, "$(P)$(S):$(CHAN):distMask PP")
+}
+
+# Calcs for Masks to determine which elements of the sequences get run
+record(acalcout, "$(P)$(S):$(CHAN):parseMask")
+{
+ field(DESC, "Mask for string parse seq")
+ field(INPA, "$(P)$(S):$(CHAN):measType CP")
+ field(INPB, "1")
+ field(INPC, "3")
+ field(INPD, "3")
+ field(INPE, "7")
+ field(INPF, "3")
+ field(INPG, "7")
+ field(INPH, "7")
+ field(INPI, "15")
+ field(CALC, "@(A+1)")
+# field(CALC, "A=0?1:(A=7?15:(A<3?3:(A=4?3:7)))")
+# field(OUT, "$(P)$(S):$(CHAN):parseSeq.SELN")
+}
+
+record(acalcout, "$(P)$(S):$(CHAN):distMask")
+{
+ field(DESC, "Mask for string parse seq")
+ field(INPA, "$(P)$(S):$(CHAN):measType CP")
+ field(INPB, "1")
+ field(INPC, "9")
+ field(INPD, "33")
+ field(INPE, "73")
+ field(INPF, "6")
+ field(INPG, "22")
+ field(INPH, "70")
+ field(INPI, "150")
+ field(CALC, "@(A+1)")
+# field(OUT, "$(P)$(S):$(CHAN):distSeq.SELN")
+}
+
+
+########################################################################
+#
+# Generic command handlers
+#
+########################################################################
+
+record(stringout, "$(P)$(S):$(CHAN):sendCmd")
+{
+ field(DTYP, "stream")
+ field(OUT, "@KeyenceCL3000.proto sendCmd($(CHAN), $(P)$(S)) $(PORT)")
+ field(DESC, "Measurement string")
+ field(FLNK, "$(P)$(S):$(CHAN):replyString PP")
+}
+
+record(stringin, "$(P)$(S):$(CHAN):replyString")
+{
+ field(DESC, "Measurement string")
+}
diff --git a/ipApp/Db/KeyenceCL3000_chan_settings.req b/ipApp/Db/KeyenceCL3000_chan_settings.req
new file mode 100644
index 00000000..441f4b78
--- /dev/null
+++ b/ipApp/Db/KeyenceCL3000_chan_settings.req
@@ -0,0 +1,4 @@
+$(P)$(S):$(CHAN):measurement.SCAN
+$(P)$(S):$(CHAN):measType
+$(P)$(S):$(CHAN):offset_set
+$(P)$(S):$(CHAN):scaling_set
diff --git a/ipApp/Db/KeyenceCL3000_main.db b/ipApp/Db/KeyenceCL3000_main.db
new file mode 100644
index 00000000..e056fd07
--- /dev/null
+++ b/ipApp/Db/KeyenceCL3000_main.db
@@ -0,0 +1,41 @@
+record(bo, "$(P)$(S):setMode")
+{
+ field(DESC, "Set mode of device")
+ field(ZNAM, "Measurement")
+ field(ONAM, "Setup")
+}
+
+record(scalcout, "$(P)$(S):calcMode")
+{
+ field(DTYP, "stream")
+ field(INPA, "$(P)$(S):setMode CP")
+ field(AA, "R0")
+ field(BB, "Q0")
+ field(DTYP, "stream")
+ field(CALC, "A=0?AA:BB")
+ field(OUT, "@KeyenceCL3000.proto setMode($(P)$(S)) $(PORT)")
+ field(FLNK, "$(P)$(S):mode_RBV")
+}
+
+record(stringin, "$(P)$(S):mode_RBV")
+{
+ field(DESC, "Mode of device")
+}
+
+record(bo, "$(P)$(S):emissControl")
+{
+ field(DTYP, "stream")
+ field(OUT, "@KeyenceCL3000.proto emission_ctrl($(P)$(S)) $(PORT)")
+ field(DESC, "Turn on/off emission control")
+ field(ZNAM, "OFF")
+ field(ONAM, "ON")
+}
+
+record(stringin, "$(P)$(S):errorString")
+{
+ field(DTYP, "Soft Channel")
+ field(DESC, "Last error")
+}
+
+
+
diff --git a/ipApp/Db/Thorlabs_SC10.db b/ipApp/Db/Thorlabs_SC10.db
new file mode 100644
index 00000000..dd96b53c
--- /dev/null
+++ b/ipApp/Db/Thorlabs_SC10.db
@@ -0,0 +1,247 @@
+# Database for the Thorlabs SC10 shutter controller
+
+
+###############################################################################
+# Binary control and readbacks
+#
+# Note: baud control is not implemented but only has two options 0 (9600) and 1
+# (115k)
+###############################################################################
+
+record(bo, "$(P)$(S):Enable")
+{
+ field(DTYP, "stream")
+ field(OUT, "@Thorlabs_SC10.proto setEnable $(PORT)")
+ field(DESC, "Shutter enable")
+ field(ZNAM, "Disabled")
+ field(ONAM, "Enabled")
+ field(FLNK, "$(P)$(S):Enable_RBV PP")
+}
+
+record(bi, "$(P)$(S):Enable_RBV")
+{
+ field(DTYP, "stream")
+ field(INP, "@Thorlabs_SC10.proto getEnable $(PORT)")
+ field(DESC, "Shutter enable status")
+ field(ZNAM, "Disabled")
+ field(ONAM, "Enabled")
+}
+
+record(bo, "$(P)$(S):TriggerMode")
+{
+ field(DTYP, "stream")
+ field(OUT, "@Thorlabs_SC10.proto setTrig $(PORT)")
+ field(DESC, "Shutter trigger mode")
+ field(ZNAM, "Internal")
+ field(ONAM, "External")
+ field(FLNK, "$(P)$(S):TriggerMode_RBV PP")
+}
+
+record(bi, "$(P)$(S):TriggerMode_RBV")
+{
+ field(DTYP, "stream")
+ field(INP, "@Thorlabs_SC10.proto getTrig $(PORT)")
+ field(DESC, "Shutter trigger mode status")
+ field(ZNAM, "Internal")
+ field(ONAM, "External")
+}
+
+record(bo, "$(P)$(S):ExtTriggerOutMode")
+{
+ field(DTYP, "stream")
+ field(OUT, "@Thorlabs_SC10.proto setXTO $(PORT)")
+ field(DESC, "External trigger out mode")
+ field(ZNAM, "Shutter")
+ field(ONAM, "Controller")
+ field(FLNK, "$(P)$(S):ExtTriggerOutMode_RBV PP")
+}
+
+record(bi, "$(P)$(S):ExtTriggerOutMode_RBV")
+{
+ field(DTYP, "stream")
+ field(INP, "@Thorlabs_SC10.proto getXTO $(PORT)")
+ field(DESC, "External trigger out mode")
+ field(ZNAM, "Shutter")
+ field(ONAM, "Controller")
+}
+
+record(bi, "$(P)$(S):ClosedStatus_RBV")
+{
+ field(DTYP, "stream")
+ field(INP, "@Thorlabs_SC10.proto getClosed $(PORT)")
+ field(DESC, "Shutter Closed status")
+ field(ZNAM, "Open")
+ field(ONAM, "Closed")
+}
+
+record(bi, "$(P)$(S):InterlockStatus_RBV")
+{
+ field(DTYP, "stream")
+ field(INP, "@Thorlabs_SC10.proto getInterlock $(PORT)")
+ field(DESC, "Shutter Closed status")
+ field(ZNAM, "Un-tripped")
+ field(ONAM, "Tripped")
+}
+
+###############################################################################
+# Multi-bit Binary control and readbacks
+###############################################################################
+
+record(mbbo, "$(P)$(S):Mode"){
+ field(DTYP, "Soft Channel")
+ field(ZRST, "Manual")
+ field(ONST, "Auto")
+ field(TWST, "Single")
+ field(THST, "Repeat")
+ field(FRST, "External Gate")
+}
+
+record(calcout, "$(P)$(S):ModeCalc"){
+ field(INPA, "$(P)$(S):Mode CP")
+ field(CALC, "A+1")
+ field(OUT, "$(P)$(S):ModeSet PP")
+}
+
+record(ao, "$(P)$(S):ModeSet") {
+ field(DTYP, "stream")
+ field(OUT, "@Thorlabs_SC10.proto setMode $(PORT)")
+ field(PREC, "0")
+ field(FLNK, "$(P)$(S):ModeSet_RBV PP")
+}
+
+record(ai, "$(P)$(S):ModeSet_RBV") {
+ field(DTYP, "stream")
+ field(INP, "@Thorlabs_SC10.proto getMode $(PORT)")
+ field(PREC, "0")
+}
+
+record(calcout, "$(P)$(S):ModeRBVCalc"){
+ field(INPA, "$(P)$(S):ModeSet_RBV CP")
+ field(CALC, "A-1")
+ field(OUT, "$(P)$(S):Mode_RBV PP")
+}
+
+record(mbbi, "$(P)$(S):Mode_RBV"){
+ field(DTYP, "Soft Channel")
+ field(ZRST, "Manual")
+ field(ONST, "Auto")
+ field(TWST, "Single")
+ field(THST, "Repeat")
+ field(FRST, "External Gate")
+}
+
+###############################################################################
+# Integer control and readbacks
+###############################################################################
+
+record(ao, "$(P)$(S):Reps") {
+ field(DTYP, "stream")
+ field(OUT, "@Thorlabs_SC10.proto setRep $(PORT)")
+ field(PREC, "0")
+ field(DRVH, "99")
+ field(DRVL, "1")
+ field(FLNK, "$(P)$(S):Reps_RBV PP")
+}
+
+record(ai, "$(P)$(S):Reps_RBV") {
+ field(DTYP, "stream")
+ field(INP, "@Thorlabs_SC10.proto getRep $(PORT)")
+ field(PREC, "0")
+}
+
+record(ao, "$(P)$(S):OpenTime") {
+ field(DTYP, "stream")
+ field(OUT, "@Thorlabs_SC10.proto setOpen $(PORT)")
+ field(PREC, "0")
+ field(DRVH, "999999")
+ field(DRVL, "1")
+ field(EGU, "ms")
+ field(FLNK, "$(P)$(S):OpenTime_RBV PP")
+}
+
+record(ai, "$(P)$(S):OpenTime_RBV") {
+ field(DTYP, "stream")
+ field(INP, "@Thorlabs_SC10.proto getOpen $(PORT)")
+ field(PREC, "0")
+ field(EGU, "ms")
+}
+
+record(ao, "$(P)$(S):ShutTime") {
+ field(DTYP, "stream")
+ field(OUT, "@Thorlabs_SC10.proto setShut $(PORT)")
+ field(PREC, "0")
+ field(DRVH, "999999")
+ field(DRVL, "1")
+ field(EGU, "ms")
+ field(FLNK, "$(P)$(S):ShutTime_RBV PP")
+}
+
+record(ai, "$(P)$(S):ShutTime_RBV") {
+ field(DTYP, "stream")
+ field(INP, "@Thorlabs_SC10.proto getShut $(PORT)")
+ field(PREC, "0")
+ field(EGU, "ms")
+}
+
+###############################################################################
+# Stream Commands
+###############################################################################
+
+#save (save baud rate and output mode)
+record(bo, "$(P)$(S):Save")
+{
+ field(DTYP, "stream")
+ field(OUT, "@Thorlabs_SC10.proto saveComm $(PORT)")
+ field(DESC, "Shutter trigger mode")
+}
+
+#savp (save settings [ex mode, open time, closed time] to EEPROM)
+record(bo, "$(P)$(S):SaveProg")
+{
+ field(DTYP, "stream")
+ field(OUT, "@Thorlabs_SC10.proto saveProg $(PORT)")
+ field(DESC, "Shutter trigger mode")
+}
+
+#resp (load settings [ex mode, open time, closed time] from EEPROM)
+record(bo, "$(P)$(S):RestoreProg")
+{
+ field(DTYP, "stream")
+ field(OUT, "@Thorlabs_SC10.proto restoreProg $(PORT)")
+ field(DESC, "Shutter trigger mode")
+}
+
+###############################################################################
+# Readback updates
+###############################################################################
+
+# seq for updates of all RBVs
+record(seq, "$(P)$(S):UpdateRBVs") {
+ field(SCAN, "1 second")
+ field(LNK1, "$(P)$(S):Enable_RBV.PROC PP")
+ field(DLY2, "0.1")
+ field(LNK2, "$(P)$(S):TriggerMode_RBV.PROC PP")
+ field(DLY3, "0.1")
+ field(LNK3, "$(P)$(S):ExtTriggerOutMode_RBV.PROC PP")
+ field(DLY4, "0.1")
+ field(LNK4, "$(P)$(S):ClosedStatus_RBV.PROC PP")
+ field(DLY5, "0.1")
+ field(LNK5, "$(P)$(S):InterlockStatus_RBV.PROC PP")
+ field(DLY6, "0.1")
+ field(LNK6, "$(P)$(S):ModeSet_RBV.PROC PP")
+ field(DLY7, "0.1")
+ field(LNK7, "$(P)$(S):Reps_RBV.PROC PP")
+ field(DLY8, "0.1")
+ field(LNK8, "$(P)$(S):OpenTime_RBV.PROC PP")
+ field(DLY9, "0.1")
+ field(LNK9, "$(P)$(S):ShutTime_RBV.PROC PP")
+}
+
+###############################################################################
+# Other
+###############################################################################
+record(stringin, "$(P)$(S):ID"){
+ field(SCAN, "Passive")
+ field(DTYP, "stream")
+ field(INP, "@Thorlabs_SC10.proto getID $(PORT)")
+}
diff --git a/ipApp/Db/Thorlabs_SC10.proto b/ipApp/Db/Thorlabs_SC10.proto
new file mode 100644
index 00000000..9e1a8375
--- /dev/null
+++ b/ipApp/Db/Thorlabs_SC10.proto
@@ -0,0 +1,125 @@
+########################################################################
+# Protocol file for the Thorlabs SC10 shutter controller
+#
+# Author: M. Wyman (APS)
+# Date: July 2023
+########################################################################
+
+
+ExtraInput = Ignore;
+timeout = 2000;
+ReadTimeout = 500;
+
+#Terminator set to be \r for output and \r> for input in asyn options
+#Terminator = CR;
+
+
+#######################################
+getID {
+ out "id?";
+ in "id?\x0d%s"
+}
+
+#######################################
+
+setEnable{
+ out "ens";
+ in "ens";
+}
+
+getEnable{
+ out "ens?";
+ in "ens?\x0d%{0|1}";
+}
+
+setTrig{
+ out "trig=%{0|1}";
+ in "trig=%{0|1}";
+}
+
+getTrig{
+ out "trig?";
+ in "trig?\x0d%{0|1}";
+}
+
+setXTO{
+ out "xto=%{0|1}";
+ in "xto=%{0|1}";
+}
+
+getXTO{
+ out "xto?";
+ in "xto?\x0d%{0|1}";
+}
+
+getClosed{
+ out "closed?";
+ in "closed?\x0d%{0|1}";
+}
+
+getInterlock{
+ out "interlock?";
+ in "interlock?\x0d%{0|1}";
+}
+
+#######################################
+#multi-bit binary
+
+setMode{
+ out "mode=%i";
+ in "mode=%i";
+}
+
+getMode{
+ out "mode?";
+ in "mode?\x0d%i";
+}
+
+#######################################
+
+setRep{
+ out "rep=%i";
+ in "rep=%i";
+}
+
+getRep{
+ out "rep?";
+ in "rep?\x0d%i";
+}
+
+setOpen{
+ out "open=%i";
+ in "open=%i";
+}
+
+getOpen{
+ out "open?";
+ in "open?\x0d%i";
+}
+
+setShut{
+ out "shut=%i";
+ in "shut=%i";
+}
+
+getShut{
+ out "shut?";
+ in "shut?\x0d%i";
+}
+
+#######################################
+
+saveComm{
+ out "save";
+ in "save";
+}
+
+saveProg{
+ out "savp";
+ in "savp";
+}
+
+restoreProg{
+ out "resp";
+ in "resp";
+}
diff --git a/ipApp/Db/Thorlabs_SC10_settings.req b/ipApp/Db/Thorlabs_SC10_settings.req
new file mode 100644
index 00000000..29bf8daf
--- /dev/null
+++ b/ipApp/Db/Thorlabs_SC10_settings.req
@@ -0,0 +1,8 @@
+$(P)$(S):UpdateRBVs.SCAN
+$(P)$(S):ShutTime
+$(P)$(S):OpenTime
+$(P)$(S):Reps
+$(P)$(S):Mode
+$(P)$(S):ExtTriggerOutMode
+$(P)$(S):TriggerMode
+$(P)$(S):Enable
diff --git a/ipApp/Db/XIA_pfcu_filters.db b/ipApp/Db/XIA_pfcu_filters.db
new file mode 100644
index 00000000..7567ccec
--- /dev/null
+++ b/ipApp/Db/XIA_pfcu_filters.db
@@ -0,0 +1,353 @@
+########################################################################
+#
+# XIA PFCU 4-filter stream support
+#
+#
+# Author: M. Wyman (APS)
+# Date: March 2023
+########################################################################
+
+########################################################################
+# Mode configuration PVs
+########################################################################
+
+record(bo, "$(P)$(F):mode"){
+ field(ZNAM,"Filter")
+ field(ONAM,"Shutter")
+ field(PINI, "YES")
+ field(VAL, "0")
+}
+
+record(calcout, "$(P)$(F):calcMode"){
+ field(INPA, "$(P)$(F):setMode CP")
+ field(CALC, "A=0?4:2")
+ field(DTYP, "stream")
+ field(OUT, "@XIA_pfcu_filters.proto setMode($(ADDR), $(P)$(F):calcModeRBV.AA) $(PORT)")
+# field(OUT, "$(P)$(F):setMode PP")
+ field(FLNK, "$(P)$(F):calcModeRBV PP")
+}
+
+#record(bo, "$(P)$(F):setMode"){
+# field(DTYP, "stream")
+# field(OUT, "@XIA_pfcu_filters.proto setMode($(ADDR), $(P)$(F):calcModeRBV.AA) $(PORT)")
+# field(FLNK, "$(P)$(F):calcModeRBV PP")
+#}
+
+record(scalcout, "$(P)$(F):calcModeRBV"){
+ field(BB, "Disabled")
+ field(CALC, "AA=BB?0:1")
+ field(OUT, "$(P)$(F):modeRBV PP")
+}
+
+record(bi, "$(P)$(F):modeRBV") {
+ field(ZNAM,"Filter")
+ field(ONAM,"Shutter")
+}
+
+########################################################################
+# Filter configuration PVs
+########################################################################
+
+record(mbbo, "$(P)$(F):config"){
+ field(DTYP, "Soft Channel")
+ field(ZRST, "0000")
+ field(ONST, "0001")
+ field(TWST, "0010")
+ field(THST, "0011")
+ field(FRST, "0100")
+ field(FVST, "0101")
+ field(SXST, "0110")
+ field(SVST, "0111")
+ field(EIST, "1000")
+ field(NIST, "1001")
+ field(TEST, "1010")
+ field(ELST, "1011")
+ field(TVST, "1100")
+ field(TTST, "1101")
+ field(FTST, "1110")
+ field(FFST, "1111")
+ field(OUT, "$(P)$(F):setConfig PP")
+}
+
+record(transform, "$(P)$(F):configTransform"){
+ field(INPA, "$(P)$(F):config CP")
+ field(CLCB, "(A>>3)%2")
+ field(OUTB, "$(P)$(F):filter1 PP")
+ field(CLCC, "(A>>2)%2")
+ field(OUTC, "$(P)$(F):filter2 PP")
+ field(CLCD, "(A>>1)%2")
+ field(OUTD, "$(P)$(F):filter3 PP")
+ field(CLCE, "A%2")
+ field(OUTE, "$(P)$(F):filter4 PP")
+}
+
+record(calcout, "$(P)$(F):calcConfig")
+{
+ field(DISV, "1")
+ field(SDIS, "$(P)$(F):setConfig.PACT")
+ field(INPA, "$(P)$(F):filter1 CP")
+ field(INPB, "$(P)$(F):filter2 CP")
+ field(INPC, "$(P)$(F):filter3 CP")
+ field(INPD, "$(P)$(F):filter4 CP")
+ field(CALC, "A*8+B*4+C*2+D")
+ field(OUT, "$(P)$(F):setConfig PP")
+}
+
+record(mbbo, "$(P)$(F):setConfig"){
+ field(DISV, "1")
+ field(SDIS, "$(P)$(F):config_sync.PACT")
+ field(DTYP, "stream")
+ field(ZRST, "0000")
+ field(ONST, "0001")
+ field(TWST, "0010")
+ field(THST, "0011")
+ field(FRST, "0100")
+ field(FVST, "0101")
+ field(SXST, "0110")
+ field(SVST, "0111")
+ field(EIST, "1000")
+ field(NIST, "1001")
+ field(TEST, "1010")
+ field(ELST, "1011")
+ field(TVST, "1100")
+ field(TTST, "1101")
+ field(FTST, "1110")
+ field(FFST, "1111")
+
+ field(OUT, "@XIA_pfcu_filters.proto setState($(ADDR), $(P)$(F):) $(PORT)")
+ field(FLNK, "$(P)$(F):calcConfigRBV")
+}
+
+record(calcout, "$(P)$(F):readConfig") {
+ field(DTYP, "stream")
+ field(CALC, "0")
+ field(OUT, "@XIA_pfcu_filters.proto getState($(ADDR), $(P)$(F):) $(PORT)")
+ field(PINI, "YES")
+ field(FLNK, "$(P)$(F):calcConfigRBV")
+}
+
+record(scalcout, "$(P)$(F):calcConfigRBV"){
+ field(INPA, "$(P)$(F):filter1_RBV PP")
+ field(INPB, "$(P)$(F):filter2_RBV PP")
+ field(INPC, "$(P)$(F):filter3_RBV PP")
+ field(INPD, "$(P)$(F):filter4_RBV PP")
+ field(CALC, "AA:=PRINTF('%i',A)+PRINTF('%i',B)+PRINTF('%i',C)+PRINTF('%i',D);AA")
+ field(OUT, "$(P)$(F):config_RBV PP")
+}
+
+record(mbbi, "$(P)$(F):config_RBV"){
+ field(ZRST, "0000")
+ field(ONST, "0001")
+ field(TWST, "0010")
+ field(THST, "0011")
+ field(FRST, "0100")
+ field(FVST, "0101")
+ field(SXST, "0110")
+ field(SVST, "0111")
+ field(EIST, "1000")
+ field(NIST, "1001")
+ field(TEST, "1010")
+ field(ELST, "1011")
+ field(TVST, "1100")
+ field(TTST, "1101")
+ field(FTST, "1110")
+ field(FFST, "1111")
+ field(FLNK, "$(P)$(F):config_sync")
+}
+
+record(mbbo, "$(P)$(F):config_sync"){
+ field(DOL, "$(P)$(F):config_RBV NPP")
+ field(OMSL, "closed_loop")
+ field(OUT, "$(P)$(F):config PP")
+}
+
+record(bo, "$(P)$(F):filter1"){
+ field(ZNAM,"OUT")
+ field(ONAM,"IN")
+}
+
+record(bo, "$(P)$(F):filter2"){
+ field(ZNAM,"OUT")
+ field(ONAM,"IN")
+}
+
+record(bo, "$(P)$(F):filter3"){
+ field(ZNAM,"OUT")
+ field(ONAM,"IN")
+}
+
+record(bo, "$(P)$(F):filter4"){
+ field(ZNAM,"OUT")
+ field(ONAM,"IN")
+}
+
+record(mbbi, "$(P)$(F):filter1_RBV"){
+ field(ZRST,"Out")
+ field(ONST,"In")
+ field(TWST,"Short Circuit")
+ field(THST,"Open Circuit")
+}
+
+record(mbbi, "$(P)$(F):filter2_RBV"){
+ field(ZRST,"Out")
+ field(ONST,"In")
+ field(TWST,"Short Circuit")
+ field(THST,"Open Circuit")
+}
+
+record(mbbi, "$(P)$(F):filter3_RBV"){
+ field(ZRST,"Out")
+ field(ONST,"In")
+ field(TWST,"Short Circuit")
+ field(THST,"Open Circuit")
+}
+
+record(mbbi, "$(P)$(F):filter4_RBV"){
+ field(ZRST,"Out")
+ field(ONST,"In")
+ field(TWST,"Short Circuit")
+ field(THST,"Open Circuit")
+}
+
+record(ao,"$(P)$(F):filter1_thick")
+{
+ field(VAL,"0.1626")
+ field(DESC,"filter 1")
+ field(EGU, "mm")
+ field(PREC,"3")
+}
+
+record(ao,"$(P)$(F):filter2_thick")
+{
+ field(VAL,"0.3226")
+ field(DESC,"filter 2")
+ field(EGU, "mm")
+ field(PREC,"3")
+}
+
+record(ao,"$(P)$(F):filter3_thick")
+{
+ field(VAL,"0.6325")
+ field(DESC,"filter 3")
+ field(EGU, "mm")
+ field(PREC,"3")
+}
+
+record(ao,"$(P)$(F):filter4_thick")
+{
+ field(VAL,"1.27")
+ field(DESC,"filter 4")
+ field(EGU, "mm")
+ field(PREC,"3")
+}
+
+record(mbbo, "$(P)$(F):filter1_mat"){
+ field(VAL,"0")
+ field(ZRST,"Al")
+ field(ONST,"Mo")
+ field(TWST,"Ti")
+ field(THST,"Glass")
+ field(FRST,"Other")
+ field(DESC,"material filter 1")
+}
+
+record(mbbo, "$(P)$(F):filter2_mat"){
+ field(VAL,"0")
+ field(ZRST,"Al")
+ field(ONST,"Mo")
+ field(TWST,"Ti")
+ field(THST,"Glass")
+ field(FRST,"Other")
+ field(DESC,"material filter 2")
+}
+
+record(mbbo, "$(P)$(F):filter3_mat"){
+ field(VAL,"0")
+ field(ZRST,"Al")
+ field(ONST,"Mo")
+ field(TWST,"Ti")
+ field(THST,"Glass")
+ field(FRST,"Other")
+ field(DESC,"material filter 3")
+}
+
+record(mbbo, "$(P)$(F):filter4_mat"){
+ field(VAL,"0")
+ field(ZRST,"Al")
+ field(ONST,"Mo")
+ field(TWST,"Ti")
+ field(THST,"Glass")
+ field(FRST,"Other")
+ field(DESC,"material filter 4")
+}
+
+record(stringout,"$(P)$(F):filter1_other") {
+}
+record(stringout,"$(P)$(F):filter2_other") {
+}
+record(stringout,"$(P)$(F):filter3_other") {
+}
+record(stringout,"$(P)$(F):filter4_other") {
+}
+
+
+
+
+########################################################################
+# Admistrative PVs
+########################################################################
+
+record(calcout, "$(P)$(F):readFault") {
+ field(DTYP, "stream")
+ field(CALC, "0")
+ field(OUT, "@XIA_pfcu_filters.proto fault($(ADDR), $(P)$(F):) $(PORT)")
+# field(PINI, "YES")
+ field(SCAN, "2 second")
+}
+
+record(calcout, "$(P)$(F):clearFault") {
+ field(DTYP, "stream")
+ field(CALC, "0")
+ field(OUT, "@XIA_pfcu_filters.proto clear($(ADDR), $(P)$(F):) $(PORT)")
+ field(SCAN, "Passive")
+}
+
+record(bo, "$(P)$(F):control"){
+ field(ZNAM,"Locked")
+ field(ONAM,"Unlocked")
+ field(PINI, "YES")
+ field(VAL, "1")
+}
+
+record(scalcout, "$(P)$(F):calcControlMode")
+{
+ field(INPA, "$(P)$(F):control CP")
+ field(AA, "L")
+ field(BB, "U")
+ field(CALC, "A=0?AA:BB")
+ field(DTYP, "stream")
+ field(OUT, "@XIA_pfcu_filters.proto setControl($(ADDR), $(P)$(F):calcControlRBV.AA) $(PORT)")
+ field(FLNK, "$(P)$(F):calcControlRBV PP")
+}
+
+record(scalcout, "$(P)$(F):calcControlRBV")
+{
+ field(BB, "Disabled")
+ field(CALC, "AA=BB?0:1")
+ field(OUT, "$(P)$(F):modeRBV PP")
+}
+
+record(bi, "$(P)$(F):controlRBV")
+{
+ field(ZNAM,"Locked")
+ field(ONAM,"Unlocked")
+}
+
+record(waveform, "$(P)$(F):sysReport")
+{
+ field(DTYP, "stream")
+ field(INP, "@XIA_pfcu_filters.proto sysReport($(ADDR)) $(PORT)")
+ field(PINI, "YES")
+ field(FTVL, "CHAR")
+ field(NELM, "1000")
+}
diff --git a/ipApp/Db/XIA_pfcu_filters.proto b/ipApp/Db/XIA_pfcu_filters.proto
new file mode 100644
index 00000000..a02e4590
--- /dev/null
+++ b/ipApp/Db/XIA_pfcu_filters.proto
@@ -0,0 +1,57 @@
+########################################################################
+# Protocol file for the XIA PFCU 4 filter controller
+#
+# Author: M. Wyman (APS)
+# Date: March 2023
+########################################################################
+
+Terminator = CR;
+ExtraInput = Ignore;
+timeout = 2000;
+ReadTimeout = 500;
+
+setMode {
+ out "!PFCU\$1 {4|2}";
+ in "\%PFCU\$1 OK Shutter Mode %{Disabled|Enabled} DONE\;";
+}
+
+stateRead {
+ in "\%PFCU\$1 OK %(\$2filter1_RBV)1s%(\$2filter2_RBV)1s%(\$2filter3_RBV)1s%(\$2filter4_RBV)1s DONE\;";
+}
+
+setState {
+ out "!PFCU\$1 W %4.4s";
+ stateRead;
+# stateRead(\$1, \$2);
+# in "\%PFCU\$1 OK %(\$2filter1_RBV)1.1s%(\$2filter2_RBV)1.1s%(\$2filter3_RBV)1.1s%(\$2filter4_RBV)1.1s DONE\;";
+}
+
+getState {
+ out "!PFCU\$1 P";
+ stateRead;
+# stateRead(\$1, \$2);
+# in "\%PFCU\$1 OK %(\$2filter1_RBV)1.1s%(\$2filter2_RBV)1.1s%(\$2filter3_RBV)1.1s%(\$2filter4_RBV)1.1s DONE\;";
+}
+
+
+setControl {
+ out "!PFCU\$1 {L|U}";
+ in "\%PFCU\$1 OK %{Locked|Unlocked} DONE\;";
+}
+
+sysReport {
+ out "!PFCU\$1 S";
+ in "\%PFCU\$1 OK %100c";
+}
+
+fault {
+ out "!PFCU\$1 F";
+ stateRead;
+# stateRead(\$1, \$2);
+}
+
+clear {
+ out "!PFCU\$1 Z";
+ stateRead;
+# stateRead(\$1, \$2);
+}
diff --git a/ipApp/Db/XIA_pfcu_filters_settings.req b/ipApp/Db/XIA_pfcu_filters_settings.req
new file mode 100644
index 00000000..910a5a2c
--- /dev/null
+++ b/ipApp/Db/XIA_pfcu_filters_settings.req
@@ -0,0 +1,16 @@
+$(P)$(F):filter1_thick
+$(P)$(F):filter2_thick
+$(P)$(F):filter3_thick
+$(P)$(F):filter4_thick
+$(P)$(F):filter1_thick.EGU
+$(P)$(F):filter2_thick.EGU
+$(P)$(F):filter3_thick.EGU
+$(P)$(F):filter4_thick.EGU
+$(P)$(F):filter1_mat
+$(P)$(F):filter2_mat
+$(P)$(F):filter3_mat
+$(P)$(F):filter4_mat
+$(P)$(F):filter1_other
+$(P)$(F):filter2_other
+$(P)$(F):filter3_other
+$(P)$(F):filter4_other
diff --git a/ipApp/Db/uniblitz.proto b/ipApp/Db/uniblitz.proto
new file mode 100644
index 00000000..4e143f96
--- /dev/null
+++ b/ipApp/Db/uniblitz.proto
@@ -0,0 +1,38 @@
+# Protocol file for the Uniblitz shutter controllers
+# Developed and tested with the VDM1000
+
+############ SVN Repository information #############
+# $Date$
+# $Author$
+# $Revision$
+# $HeadURL$
+# $Id$
+#######################################################
+
+Terminator = LF;
+
+checkSync {
+ out "?";
+ in "%{K|J}";
+}
+
+setShutter {
+ out "%{A|@}";
+ @init { checkSync; }
+}
+
+setGate {
+ out "%{F|G}";
+}
+
+setAuxOut {
+ out "%{D|E}";
+}
+
+setTrigger {
+ out "B";
+}
+
+setReset {
+ out "C";
+}
diff --git a/ipApp/Db/uniblitz_d122.db b/ipApp/Db/uniblitz_d122.db
new file mode 100644
index 00000000..7d1eb7d4
--- /dev/null
+++ b/ipApp/Db/uniblitz_d122.db
@@ -0,0 +1,20 @@
+# Database for the Uniblitz shutter controllers
+# Developed and tested with the D-122
+
+
+
+record(bo, "$(P)$(S):Control")
+{
+ field(DTYP, "stream")
+ field(OUT, "@uniblitz.proto setShutter $(PORT)")
+ field(DESC, "Uniblitz shutter control")
+ field(ZNAM, "Close")
+ field(ONAM, "Open")
+}
+
+record(bo, "$(P)$(S):Reset")
+{
+ field(DTYP, "stream")
+ field(OUT, "@uniblitz.proto setReset $(PORT)")
+ field(DESC, "Uniblitz Reset")
+}
diff --git a/ipApp/Db/uniblitz_vcm-d1.db b/ipApp/Db/uniblitz_vcm-d1.db
new file mode 100644
index 00000000..29bd973e
--- /dev/null
+++ b/ipApp/Db/uniblitz_vcm-d1.db
@@ -0,0 +1,52 @@
+# Database for the Uniblitz shutter controllers
+# Developed and tested with the VCM-D1
+
+record(bi, "$(P)$(S):Status")
+{
+ field(DTYP, "stream")
+ field(INP, "@uniblitz.proto checkSync $(PORT)")
+ field(DESC, "Uniblitz sync status")
+ field(ZNAM, "Off")
+ field(ONAM, "On")
+}
+
+record(bo, "$(P)$(S):Control")
+{
+ field(DTYP, "stream")
+ field(OUT, "@uniblitz.proto setShutter $(PORT)")
+ field(DESC, "Uniblitz shutter control")
+ field(ZNAM, "Close")
+ field(ONAM, "Open")
+}
+
+record(bo, "$(P)$(S):Gate")
+{
+ field(DTYP, "stream")
+ field(OUT, "@uniblitz.proto setGate $(PORT)")
+ field(DESC, "Uniblitz gate control")
+ field(ZNAM, "Close")
+ field(ONAM, "Open")
+}
+
+record(bo, "$(P)$(S):AuxOut")
+{
+ field(DTYP, "stream")
+ field(OUT, "@uniblitz.proto setAuxOut $(PORT)")
+ field(DESC, "Uniblitz Aux Out Enable")
+ field(ZNAM, "Disable")
+ field(ONAM, "Enable")
+}
+
+record(bo, "$(P)$(S):Trigger")
+{
+ field(DTYP, "stream")
+ field(OUT, "@uniblitz.proto setTrigger $(PORT)")
+ field(DESC, "Uniblitz Trigger")
+}
+
+record(bo, "$(P)$(S):Reset")
+{
+ field(DTYP, "stream")
+ field(OUT, "@uniblitz.proto setReset $(PORT)")
+ field(DESC, "Uniblitz Reset")
+}
diff --git a/ipApp/iocsh/KeyenceCL3000.iocsh b/ipApp/iocsh/KeyenceCL3000.iocsh
new file mode 100644
index 00000000..8bd1a4b3
--- /dev/null
+++ b/ipApp/iocsh/KeyenceCL3000.iocsh
@@ -0,0 +1,56 @@
+# ### KeyenceCL3000.iocsh ###
+
+#- ###################################################
+#- PREFIX - IOC Prefix
+#- INSTANCE - Instance Prefix
+#- IP_ADDR - IP address of the PTC10
+#- IP_PORT - IP port number (default: 24685)
+#- PORT - Name of asyn port to be created
+#- ### Module locations shouldn't need to be passed explicitly
+#- IP - Location of IP module
+#- ASYN - Location of ASYN module
+#- MINDISP - Minimum display format (default "%+08.4f") specific
+# to device
+#- ###################################################
+
+#####################################################
+#
+# Note about MINDISP -- MINDISP is the format string needed
+# to express values in terms of the minimum display unit.
+# This format is how the CL3000 expects the scaling and
+# offset values be delivered as as well as how it delivers
+# its measurement value.
+#
+# For the default format %+08.4f, the range is +/-99.9999 mm,
+# so the minimum step is 0.1 um. Leading zeros are
+# expected when the value is below 10% of the max (e.g.
+# +/-09.9999 mm).
+#
+# If the minimum step is 10 um, the MINDISP format string
+# would be %+08.2f
+#
+######################################################
+
+
+drvAsynIPPortConfigure("$(PORT)","$(IP_ADDR):$(IP_PORT=24685)", 0, 0, 0)
+
+epicsEnvSet("STREAM_PROTOCOL_PATH","$(STREAM_PROTOCOL_PATH):$(IP)/ipApp/Db")
+
+# Only show errors
+asynSetTraceMask("$(PORT)", 0, 1)
+# Leave ascii selected so debug messages can be turned on with a single click
+asynSetTraceIOMask("$(PORT)", 0, 1)
+
+# Set end-of-string terminators
+asynOctetSetInputEos( "$(PORT)", 0, "\r")
+asynOctetSetOutputEos("$(PORT)", 0, "\r")
+
+# Keyence CL 3000 general commands
+dbLoadRecords("$(IP)/db/KeyenceCL3000_main.db","P=$(PREFIX),S=$(INSTANCE),PORT=$(PORT),ADDR=0")
+
+# Keyence CL 3000 channel commands
+dbLoadRecords("$(IP)/db/KeyenceCL3000_chan.db","P=$(PREFIX),S=$(INSTANCE),PORT=$(PORT),MINDISP=$(MINDISP="%+08.4f"),ADDR=0,CHAN=1")
+
+# Asyn record for troubleshooting
+dbLoadRecords("$(ASYN)/db/asynRecord.db","P=$(PREFIX),R=$(INSTANCE):asyn,PORT=$(PORT),ADDR=0,OMAX=0,IMAX=0")
+
diff --git a/ipApp/iocsh/Thorlabs_SC10.iocsh b/ipApp/iocsh/Thorlabs_SC10.iocsh
new file mode 100644
index 00000000..f0e51520
--- /dev/null
+++ b/ipApp/iocsh/Thorlabs_SC10.iocsh
@@ -0,0 +1,14 @@
+# ### Thorlabs_SC10.iocsh ###
+
+#- ###################################################
+#- PREFIX - IOC Prefix
+#- INSTANCE - Instance Prefix
+#- PORT - Serial port name
+#- IP - Location of IP module
+#- ###################################################
+
+# SC10 responses end with an ">"
+asynOctetSetInputEos( "$(PORT)", -1, "\r>")
+asynOctetSetOutputEos("$(PORT)", -1, "\r")
+
+dbLoadRecords("$(IP)/ipApp/Db/Thorlabs_SC10.db", "P=$(PREFIX),S=$(INSTANCE),PORT=$(PORT)")
diff --git a/ipApp/iocsh/XIA_pfcu_filters.iocsh b/ipApp/iocsh/XIA_pfcu_filters.iocsh
new file mode 100644
index 00000000..8231b348
--- /dev/null
+++ b/ipApp/iocsh/XIA_pfcu_filters.iocsh
@@ -0,0 +1,18 @@
+# ### XIA_pfcu_filters.iocsh ###
+
+#- ###################################################
+#- PREFIX - IOC Prefix
+#- INSTANCE - Instance Prefix
+#- ADDRESS - PFCU Address
+#- PORT - Port name of moxa serial server
+#- OPTICS - Location of OPTICS module
+#- ###################################################
+
+#asynOctetSetInputEos( "$(PORT)", -1, "\r")
+#asynOctetSetOutputEos("$(PORT)", -1, "\r")
+
+epicsEnvSet("STREAM_PROTOCOL_PATH","$(STREAM_PROTOCOL_PATH):$(IP)/ipApp/Db")
+dbLoadRecords("$(IP)/ipApp/Db/XIA_pfcu_filters.db", "P=$(PREFIX),F=$(FILTERNAM=pfcu0),PORT=$(PORT),ADDR=$(ADDRESS=00)")
+
+
+
diff --git a/ipApp/iocsh/uniblitz_d122.iocsh b/ipApp/iocsh/uniblitz_d122.iocsh
new file mode 100644
index 00000000..8baf0f19
--- /dev/null
+++ b/ipApp/iocsh/uniblitz_d122.iocsh
@@ -0,0 +1,32 @@
+# ### uniblitz_d122.iocsh ###
+
+#- ###################################################
+#- PREFIX - IOC Prefix
+#- INSTANCE - Instance Prefix
+#- PORT - Serial port name
+#- IP - Location of IP module
+#- ###################################################
+
+
+#---------------------------------------------------------------------------------------------------------
+# Uniblitz D122
+# Moxa port is configured for:
+# baud = 300
+# bits = 8
+# parity = None
+# stop bits = 1
+#
+# If computer is ever directly connected to Uniblitz instead of the moxa,
+# need to confgiure the serial port, In this intance drvAsynSerialPortConfigure
+# is used instead of drvAsynIPPortConfgure. With drvAsynSerialPortConfigure,
+# need to add the following :
+#! asynSetOption("$(PORT)", -1, "baud", "300")
+#! asynSetOption("$(PORT)", -1, "bits", "8")
+#! asynSetOption("$(PORT)", -1, "stop", "1")
+#! asynSetOption("$(PORT)", -1, "parity", "none")
+
+asynOctetSetInputEos( "$(PORT)", -1, "\r")
+asynOctetSetOutputEos("$(PORT)", -1, "\r")
+dbLoadRecords("$(IP)/db/uniblitz_d122.db", "P=$(PREFIX),S=$(INSTANCE),PORT=$(PORT)")
+
+#---------------------------------------------------------------------------------------------------------
diff --git a/ipApp/iocsh/uniblitz_vcm.iocsh b/ipApp/iocsh/uniblitz_vcm.iocsh
new file mode 100644
index 00000000..cf08931d
--- /dev/null
+++ b/ipApp/iocsh/uniblitz_vcm.iocsh
@@ -0,0 +1,32 @@
+# ### uniblitz_vcm.iocsh ###
+
+#- ###################################################
+#- PREFIX - IOC Prefix
+#- INSTANCE - Instance Prefix
+#- PORT - Serial port name
+#- IP - Location of IP module
+#- ###################################################
+
+
+#---------------------------------------------------------------------------------------------------------
+# Uniblitz VCM-D1
+# Moxa port is configured for:
+# baud = 9600
+# bits = 8
+# parity = None
+# stop bits = 1
+#
+# If computer is ever directly connected to Uniblitz instead of the moxa,
+# need to confgiure the serial port, In this intance drvAsynSerialPortConfigure
+# is used instead of drvAsynIPPortConfgure. With drvAsynSerialPortConfigure,
+# need to add the following :
+#! asynSetOption("$(PORT)", -1, "baud", "9600")
+#! asynSetOption("$(PORT)", -1, "bits", "8")
+#! asynSetOption("$(PORT)", -1, "stop", "1")
+#! asynSetOption("$(PORT)", -1, "parity", "none")
+
+asynOctetSetInputEos( "$(PORT)", -1, "\n")
+asynOctetSetOutputEos("$(PORT)", -1, "\n")
+dbLoadRecords("$(IP)/db/uniblitz_vcm-d1.db", "P=$(PREFIX),S=$(INSTANCE),PORT=$(PORT)")
+
+#---------------------------------------------------------------------------------------------------------
diff --git a/ipApp/op/ui/Keyence_CL3000.ui b/ipApp/op/ui/Keyence_CL3000.ui
new file mode 100644
index 00000000..937a1a11
--- /dev/null
+++ b/ipApp/op/ui/Keyence_CL3000.ui
@@ -0,0 +1,996 @@
+
+
+ MainWindow
+
+
+
+ 0
+ 0
+ 562
+ 505
+
+
+
+
+
+QWidget#centralWidget {background: rgba(187, 187, 187, 255);}
+QPushButton::menu-indicator {image: url(none.png); width: 0}
+
+caTable {
+ font: 10pt;
+ background: cornsilk;
+ alternate-background-color: wheat;
+}
+
+caLineEdit {
+ border-radius: 1px;
+ background: lightyellow;
+ color: black;
+ }
+
+caTextEntry {
+ color: rgb(127, 0, 63);
+ background-color: cornsilk;
+ selection-color: #0a214c;
+ selection-background-color: wheat;
+ border: 1px groove black;
+ border-radius: 1px;
+ padding: 1px;
+}
+
+caTextEntry:focus {
+ padding: 0px;
+ border: 2px groove darkred;
+ border-radius: 1px;
+}
+
+QPushButton {
+ border-color: #00b;
+ border-radius: 2px;
+ padding: 3px;
+ border-width: 1px;
+
+ background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
+ stop:0 rgba(224, 239, 255, 255),
+ stop:0.5 rgba(199, 215, 230, 255),
+ stop:1 rgba(184, 214, 236, 255));
+}
+QPushButton:hover {
+ background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
+ stop:0 rgba(201, 226, 255, 255),
+ stop:0.5 rgba(177, 204, 230, 255),
+ stop:1 rgba(163, 205, 236, 255));
+}
+QPushButton:pressed {
+ background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
+ stop:0 rgba(174, 219, 255, 255),
+ stop:0.5 rgba(165, 199, 230, 255),
+ stop:1 rgba(134, 188, 236, 255));
+}
+
+QPushButton:disabled {
+ background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
+ stop:0 rgba(174, 219, 255, 255),
+ stop:0.5 rgba(165, 199, 230, 255),
+ stop:1 rgba(134, 188, 236, 255));
+}
+
+caChoice {
+ background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
+ stop: 0 #E1E1E1, stop: 0.4 #DDDDDD,
+ stop: 0.5 #D8D8D8, stop: 1.0 #D3D3D3);
+}
+
+caChoice > QPushButton {
+ text-align: left;
+ padding: 1px;
+}
+
+/* when font specified, no font sizing is done any more, font: 10pt; is not bad. You could Enable this when you converted from .adl files
+caRelatedDisplay > QPushButton {
+font: 10pt;
+}
+
+caShellCommand > QPushButton {
+font: 10pt;
+}
+*/
+
+caSlider::groove:horizontal {
+border: 1px solid #bbb;
+background: lightgrey;
+height: 20px;
+border-radius: 4px;
+}
+
+caSlider::handle:horizontal {
+background: red;
+border: 1px solid #777;
+width: 13px;
+margin-top: -2px;
+margin-bottom: -2px;
+border-radius: 2px;
+}
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 721
+ 26
+
+
+
+ 0
+
+
+
+ 0
+ 53
+ 132
+
+
+
+ caFrame::Filled
+
+
+
+ 5
+
+
+ 10
+
+
+ 2
+
+
+ 0
+
+
+ 2
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ Verdana
+ 13
+ 75
+ true
+
+
+
+ Keyence CL3000 Distance Sensor - $(P)$(S):$(CHAN)
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::Height
+
+
+
+ 228
+ 228
+ 228
+
+
+
+
+ 160
+ 160
+ 164
+
+
+
+
+
+
+
+
+
+ 220
+ 400
+ 171
+ 27
+
+
+
+
+ 0
+ 0
+
+
+
+ Qt::AlignCenter
+
+
+ $(P)$(S):$(CHAN):judgement_RBV
+
+
+
+ 10
+ 0
+ 184
+
+
+
+
+ 200
+ 200
+ 200
+
+
+
+ caLineEdit::Static
+
+
+ caLineEdit::WidthAndHeight
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 100
+ 400
+ 120
+ 28
+
+
+
+ Judgement
+
+
+ Qt::AlignCenter
+
+
+
+
+
+ 59
+ 320
+ 151
+ 28
+
+
+
+ Counts
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+ 60
+ 360
+ 151
+ 28
+
+
+
+ Result
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+ 19
+ 40
+ 191
+ 28
+
+
+
+ Measurement Type
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+
+ 220
+ 320
+ 171
+ 25
+
+
+
+
+ 0
+ 0
+
+
+
+ Qt::AlignCenter
+
+
+ $(P)$(S):$(CHAN):Count_RBV
+
+
+
+ 10
+ 0
+ 184
+
+
+
+
+ 200
+ 200
+ 200
+
+
+
+ caLineEdit::Static
+
+
+ caLineEdit::WidthAndHeight
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 220
+ 360
+ 171
+ 25
+
+
+
+
+ 0
+ 0
+
+
+
+ Qt::AlignCenter
+
+
+ $(P)$(S):$(CHAN):resultInfo_RBV
+
+
+
+ 10
+ 0
+ 184
+
+
+
+
+ 200
+ 200
+ 200
+
+
+
+ caLineEdit::Static
+
+
+ caLineEdit::WidthAndHeight
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 391
+ 200
+ 141
+ 27
+
+
+
+
+ 0
+ 0
+
+
+
+ Qt::AlignCenter
+
+
+ $(P)$(S):$(CHAN):scaling_RBV
+
+
+
+ 10
+ 0
+ 184
+
+
+
+
+ 200
+ 200
+ 200
+
+
+
+ caLineEdit::Static
+
+
+ 4
+
+
+ caLineEdit::WidthAndHeight
+
+
+ caLineEdit::decimal
+
+
+
+
+
+
+
+
+ 220
+ 200
+ 171
+ 27
+
+
+
+
+ 0
+ 0
+
+
+
+ $(P)$(S):$(CHAN):scaling_set
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 115
+ 223
+ 255
+
+
+
+ caLineEdit::Static
+
+
+ 4
+
+
+ caLineEdit::Channel
+
+
+ caLineEdit::Channel
+
+
+ 1.000000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::WidthAndHeight
+
+
+ caLineEdit::decimal
+
+
+
+
+
+
+
+
+ 40
+ 200
+ 171
+ 27
+
+
+
+ Scaling
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+ 390
+ 240
+ 141
+ 27
+
+
+
+
+ 0
+ 0
+
+
+
+ Qt::AlignCenter
+
+
+ $(P)$(S):$(CHAN):offset_RBV
+
+
+
+ 10
+ 0
+ 184
+
+
+
+
+ 200
+ 200
+ 200
+
+
+
+ caLineEdit::Static
+
+
+ 4
+
+
+ caLineEdit::WidthAndHeight
+
+
+ caLineEdit::decimal
+
+
+
+
+
+
+
+
+ 40
+ 240
+ 171
+ 27
+
+
+
+ Offset
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+ 220
+ 240
+ 171
+ 27
+
+
+
+
+ 0
+ 0
+
+
+
+ $(P)$(S):$(CHAN):offset_set
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 115
+ 223
+ 255
+
+
+
+ caLineEdit::Static
+
+
+ 4
+
+
+ caLineEdit::Channel
+
+
+ caLineEdit::Channel
+
+
+ 1.000000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::WidthAndHeight
+
+
+ caLineEdit::decimal
+
+
+
+
+
+
+
+
+ 220
+ 280
+ 171
+ 27
+
+
+
+
+ 0
+ 0
+
+
+
+ Qt::AlignCenter
+
+
+ $(P)$(S):$(CHAN):measurement_RBV
+
+
+
+ 10
+ 0
+ 184
+
+
+
+
+ 200
+ 200
+ 200
+
+
+
+ caLineEdit::Static
+
+
+ caLineEdit::WidthAndHeight
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 40
+ 280
+ 171
+ 27
+
+
+
+ Measurement
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+
+ 20
+ 80
+ 191
+ 28
+
+
+
+ Measurement Rate
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+ 220
+ 160
+ 171
+ 30
+
+
+
+ $(P)$(S):$(CHAN):autoZero
+
+
+ caChoice::Static
+
+
+ caChoice::Column
+
+
+ 1
+
+
+
+
+
+ 20
+ 160
+ 191
+ 28
+
+
+
+ Auto-Zeroing
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+ 220
+ 120
+ 311
+ 30
+
+
+
+ $(P)$(S):setMode
+
+
+ caChoice::Static
+
+
+ caChoice::Column
+
+
+ 1
+
+
+
+
+
+ 20
+ 120
+ 191
+ 28
+
+
+
+ Mode
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+ 440
+ 470
+ 107
+ 29
+
+
+
+ - More
+
+
+
+ 228
+ 228
+ 228
+
+
+
+
+ 51
+ 132
+ 0
+
+
+
+ Keyence CL3000
+
+
+ Keyence_CL3000_more.ui
+
+
+ P=$(P),S=$(S),CHAN=$(CHAN)
+
+
+ caRowColMenu::Menu
+
+
+ true
+
+
+
+
+
+ 400
+ 280
+ 61
+ 27
+
+
+
+
+ 0
+ 0
+
+
+
+ Qt::AlignCenter
+
+
+ $(P)$(S):$(CHAN):measurement_RBV.EGU
+
+
+
+ 10
+ 0
+ 184
+
+
+
+
+ 200
+ 200
+ 200
+
+
+
+ caLineEdit::Static
+
+
+ caLineEdit::WidthAndHeight
+
+
+ caLineEdit::decimal
+
+
+
+
+
+
+ caMenu
+ QComboBox
+
+
+
+ caChoice
+ QWidget
+
+
+
+ caRelatedDisplay
+ QWidget
+
+
+
+ caTextEntry
+ caLineEdit
+
+
+
+ caFrame
+ QFrame
+
+ 1
+
+
+ caLabel
+ QLabel
+
+
+
+ caLineEdit
+ QLineEdit
+
+
+
+
+
+
diff --git a/ipApp/op/ui/Keyence_CL3000_more.ui b/ipApp/op/ui/Keyence_CL3000_more.ui
new file mode 100644
index 00000000..f290456b
--- /dev/null
+++ b/ipApp/op/ui/Keyence_CL3000_more.ui
@@ -0,0 +1,1243 @@
+
+
+ MainWindow
+
+
+
+ 0
+ 0
+ 562
+ 643
+
+
+
+
+
+QWidget#centralWidget {background: rgba(187, 187, 187, 255);}
+QPushButton::menu-indicator {image: url(none.png); width: 0}
+
+caTable {
+ font: 10pt;
+ background: cornsilk;
+ alternate-background-color: wheat;
+}
+
+caLineEdit {
+ border-radius: 1px;
+ background: lightyellow;
+ color: black;
+ }
+
+caTextEntry {
+ color: rgb(127, 0, 63);
+ background-color: cornsilk;
+ selection-color: #0a214c;
+ selection-background-color: wheat;
+ border: 1px groove black;
+ border-radius: 1px;
+ padding: 1px;
+}
+
+caTextEntry:focus {
+ padding: 0px;
+ border: 2px groove darkred;
+ border-radius: 1px;
+}
+
+QPushButton {
+ border-color: #00b;
+ border-radius: 2px;
+ padding: 3px;
+ border-width: 1px;
+
+ background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
+ stop:0 rgba(224, 239, 255, 255),
+ stop:0.5 rgba(199, 215, 230, 255),
+ stop:1 rgba(184, 214, 236, 255));
+}
+QPushButton:hover {
+ background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
+ stop:0 rgba(201, 226, 255, 255),
+ stop:0.5 rgba(177, 204, 230, 255),
+ stop:1 rgba(163, 205, 236, 255));
+}
+QPushButton:pressed {
+ background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
+ stop:0 rgba(174, 219, 255, 255),
+ stop:0.5 rgba(165, 199, 230, 255),
+ stop:1 rgba(134, 188, 236, 255));
+}
+
+QPushButton:disabled {
+ background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
+ stop:0 rgba(174, 219, 255, 255),
+ stop:0.5 rgba(165, 199, 230, 255),
+ stop:1 rgba(134, 188, 236, 255));
+}
+
+caChoice {
+ background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
+ stop: 0 #E1E1E1, stop: 0.4 #DDDDDD,
+ stop: 0.5 #D8D8D8, stop: 1.0 #D3D3D3);
+}
+
+caChoice > QPushButton {
+ text-align: left;
+ padding: 1px;
+}
+
+/* when font specified, no font sizing is done any more, font: 10pt; is not bad. You could Enable this when you converted from .adl files
+caRelatedDisplay > QPushButton {
+font: 10pt;
+}
+
+caShellCommand > QPushButton {
+font: 10pt;
+}
+*/
+
+caSlider::groove:horizontal {
+border: 1px solid #bbb;
+background: lightgrey;
+height: 20px;
+border-radius: 4px;
+}
+
+caSlider::handle:horizontal {
+background: red;
+border: 1px solid #777;
+width: 13px;
+margin-top: -2px;
+margin-bottom: -2px;
+border-radius: 2px;
+}
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 721
+ 26
+
+
+
+ 0
+
+
+
+ 0
+ 53
+ 132
+
+
+
+ caFrame::Filled
+
+
+
+ 5
+
+
+ 10
+
+
+ 2
+
+
+ 0
+
+
+ 2
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ Verdana
+ 13
+ 75
+ true
+
+
+
+ Keyence CL3000 Distance Sensor - $(P)$(S):$(CHAN)
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::Height
+
+
+
+ 228
+ 228
+ 228
+
+
+
+
+ 160
+ 160
+ 164
+
+
+
+
+
+
+
+
+
+ 220
+ 400
+ 171
+ 27
+
+
+
+
+ 0
+ 0
+
+
+
+ Qt::AlignCenter
+
+
+ $(P)$(S):$(CHAN):judgement_RBV
+
+
+
+ 10
+ 0
+ 184
+
+
+
+
+ 200
+ 200
+ 200
+
+
+
+ caLineEdit::Static
+
+
+ caLineEdit::WidthAndHeight
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 100
+ 400
+ 120
+ 28
+
+
+
+ Judgement
+
+
+ Qt::AlignCenter
+
+
+
+
+
+ 59
+ 320
+ 151
+ 28
+
+
+
+ Counts
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+ 60
+ 360
+ 151
+ 28
+
+
+
+ Result
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+ 19
+ 40
+ 191
+ 28
+
+
+
+ Measurement Type
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+
+ 220
+ 320
+ 171
+ 25
+
+
+
+
+ 0
+ 0
+
+
+
+ Qt::AlignCenter
+
+
+ $(P)$(S):$(CHAN):Count_RBV
+
+
+
+ 10
+ 0
+ 184
+
+
+
+
+ 200
+ 200
+ 200
+
+
+
+ caLineEdit::Static
+
+
+ caLineEdit::WidthAndHeight
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 220
+ 360
+ 171
+ 25
+
+
+
+
+ 0
+ 0
+
+
+
+ Qt::AlignCenter
+
+
+ $(P)$(S):$(CHAN):resultInfo_RBV
+
+
+
+ 10
+ 0
+ 184
+
+
+
+
+ 200
+ 200
+ 200
+
+
+
+ caLineEdit::Static
+
+
+ caLineEdit::WidthAndHeight
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 391
+ 200
+ 141
+ 27
+
+
+
+
+ 0
+ 0
+
+
+
+ Qt::AlignCenter
+
+
+ $(P)$(S):$(CHAN):scaling_RBV
+
+
+
+ 10
+ 0
+ 184
+
+
+
+
+ 200
+ 200
+ 200
+
+
+
+ caLineEdit::Static
+
+
+ 4
+
+
+ caLineEdit::WidthAndHeight
+
+
+ caLineEdit::decimal
+
+
+
+
+
+
+
+
+ 220
+ 200
+ 171
+ 27
+
+
+
+
+ 0
+ 0
+
+
+
+ $(P)$(S):$(CHAN):scaling_set
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 115
+ 223
+ 255
+
+
+
+ caLineEdit::Static
+
+
+ 4
+
+
+ caLineEdit::Channel
+
+
+ caLineEdit::Channel
+
+
+ 1.000000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::WidthAndHeight
+
+
+ caLineEdit::decimal
+
+
+
+
+
+
+
+
+ 40
+ 200
+ 171
+ 27
+
+
+
+ Scaling
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+ 390
+ 240
+ 141
+ 27
+
+
+
+
+ 0
+ 0
+
+
+
+ Qt::AlignCenter
+
+
+ $(P)$(S):$(CHAN):offset_RBV
+
+
+
+ 10
+ 0
+ 184
+
+
+
+
+ 200
+ 200
+ 200
+
+
+
+ caLineEdit::Static
+
+
+ 4
+
+
+ caLineEdit::WidthAndHeight
+
+
+ caLineEdit::decimal
+
+
+
+
+
+
+
+
+ 40
+ 240
+ 171
+ 27
+
+
+
+ Offset
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+ 220
+ 240
+ 171
+ 27
+
+
+
+
+ 0
+ 0
+
+
+
+ $(P)$(S):$(CHAN):offset_set
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 115
+ 223
+ 255
+
+
+
+ caLineEdit::Static
+
+
+ 4
+
+
+ caLineEdit::Channel
+
+
+ caLineEdit::Channel
+
+
+ 1.000000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::WidthAndHeight
+
+
+ caLineEdit::decimal
+
+
+
+
+
+
+
+
+ 220
+ 280
+ 171
+ 27
+
+
+
+
+ 0
+ 0
+
+
+
+ Qt::AlignCenter
+
+
+ $(P)$(S):$(CHAN):measurement_RBV
+
+
+
+ 10
+ 0
+ 184
+
+
+
+
+ 200
+ 200
+ 200
+
+
+
+ caLineEdit::Static
+
+
+ caLineEdit::WidthAndHeight
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 40
+ 280
+ 171
+ 27
+
+
+
+ Measurement
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+ 30
+ 470
+ 181
+ 27
+
+
+
+ Measurement String
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+ 220
+ 470
+ 321
+ 27
+
+
+
+
+ 0
+ 0
+
+
+
+ Qt::AlignCenter
+
+
+ $(P)$(S):$(CHAN):measString
+
+
+
+ 10
+ 0
+ 184
+
+
+
+
+ 200
+ 200
+ 200
+
+
+
+ caLineEdit::Static
+
+
+ caLineEdit::WidthAndHeight
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 30
+ 510
+ 181
+ 27
+
+
+
+ Error String
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+ 220
+ 510
+ 321
+ 27
+
+
+
+
+ 0
+ 0
+
+
+
+ Qt::AlignCenter
+
+
+ $(P)$(S):$(CHAN):errorString
+
+
+
+ 10
+ 0
+ 184
+
+
+
+
+ 200
+ 200
+ 200
+
+
+
+ caLineEdit::Static
+
+
+ caLineEdit::WidthAndHeight
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 17
+ 440
+ 521
+ 20
+
+
+
+ false
+
+
+ QFrame::Plain
+
+
+ 2
+
+
+ 2
+
+
+ Qt::Horizontal
+
+
+
+
+
+
+ 20
+ 80
+ 191
+ 28
+
+
+
+ Measurement Rate
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+ true
+
+
+
+ 30
+ 570
+ 191
+ 27
+
+
+
+
+ Liberation Mono
+
+
+
+ - Calcs
+
+
+
+ 228
+ 228
+ 228
+
+
+
+
+ 53
+ 132
+ 0
+
+
+
+ Parse Mask Calc;Distribution Mask Calc;String Parser 1;String Parser 2;String Parser 3;String Parser 4;Offset String;Scaling String
+
+
+ yyArrayCalc_full.ui;yyArrayCalc_full.ui;yysCalcoutRecord_full.ui;yysCalcoutRecord_full.ui;yysCalcoutRecord_full.ui;yysCalcoutRecord_full.ui;yysCalcoutRecord_full.ui;yysCalcoutRecord_full.ui
+
+
+ P=$(P)$(S):$(CHAN):,C=parseMask;P=$(P)$(S):$(CHAN):,C=distMask;P=$(P)$(S):$(CHAN):,C=parseMeasStr1;P=$(P)$(S):$(CHAN):,C=parseMeasStr2;P=$(P)$(S):$(CHAN):,C=parseMeasStr3;P=$(P)$(S):$(CHAN):,C=parseMeasStr4;P=$(P)$(S):$(CHAN):,C=offset_string;P=$(P)$(S):$(CHAN):,C=scaling_string
+
+
+ caRowColMenu::Menu
+
+
+ false;false;false;false;false;false;false;false;false
+
+
+
+
+ true
+
+
+
+ 240
+ 570
+ 161
+ 27
+
+
+
+
+ Liberation Mono
+
+
+
+ - Sequences
+
+
+
+ 228
+ 228
+ 228
+
+
+
+
+ 53
+ 132
+ 0
+
+
+
+ String Parser;Parsed String Distribution
+
+
+ yySeq_full.ui;yySseq_full.ui
+
+
+ P=$(P)$(S):$(CHAN):,S=parseSeq;P=$(P)$(S):$(CHAN):,S=distSeq
+
+
+ caRowColMenu::Menu
+
+
+ false;false;false;false;false;false;false;false;false
+
+
+
+
+
+ 220
+ 160
+ 171
+ 30
+
+
+
+ $(P)$(S):$(CHAN):autoZero
+
+
+ caChoice::Static
+
+
+ caChoice::Column
+
+
+ 1
+
+
+
+
+
+ 20
+ 160
+ 191
+ 28
+
+
+
+ Auto-Zeroing
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+ 220
+ 120
+ 311
+ 30
+
+
+
+ $(P)$(S):setMode
+
+
+ caChoice::Static
+
+
+ caChoice::Column
+
+
+ 1
+
+
+
+
+
+ 20
+ 120
+ 191
+ 28
+
+
+
+ Mode
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+ 430
+ 570
+ 107
+ 29
+
+
+
+ - Less
+
+
+
+ 228
+ 228
+ 228
+
+
+
+
+ 51
+ 132
+ 0
+
+
+
+ Keyence CL3000
+
+
+ Keyence_CL3000.ui
+
+
+ P=$(P),S=$(S),CHAN=$(CHAN)
+
+
+ caRowColMenu::Menu
+
+
+ true
+
+
+
+
+
+ 400
+ 280
+ 61
+ 27
+
+
+
+
+ 0
+ 0
+
+
+
+ Qt::AlignCenter
+
+
+ $(P)$(S):$(CHAN):measurement_RBV.EGU
+
+
+
+ 10
+ 0
+ 184
+
+
+
+
+ 200
+ 200
+ 200
+
+
+
+ caLineEdit::Static
+
+
+ caLineEdit::WidthAndHeight
+
+
+ caLineEdit::decimal
+
+
+
+
+
+
+ caMenu
+ QComboBox
+
+
+
+ caChoice
+ QWidget
+
+
+
+ caRelatedDisplay
+ QWidget
+
+
+
+ caTextEntry
+ caLineEdit
+
+
+
+ caFrame
+ QFrame
+
+ 1
+
+
+ caLabel
+ QLabel
+
+
+
+ caLineEdit
+ QLineEdit
+
+
+
+
+
+
diff --git a/ipApp/op/ui/Thorlabs_SC10.ui b/ipApp/op/ui/Thorlabs_SC10.ui
new file mode 100644
index 00000000..126eeaf1
--- /dev/null
+++ b/ipApp/op/ui/Thorlabs_SC10.ui
@@ -0,0 +1,1328 @@
+
+
+ MainWindow
+
+
+
+ 0
+ 0
+ 721
+ 504
+
+
+
+
+
+QWidget#centralWidget {background: rgba(187, 187, 187, 255);}
+QPushButton::menu-indicator {image: url(none.png); width: 0}
+
+caTable {
+ font: 10pt;
+ background: cornsilk;
+ alternate-background-color: wheat;
+}
+
+caLineEdit {
+ border-radius: 1px;
+ background: lightyellow;
+ color: black;
+ }
+
+caTextEntry {
+ color: rgb(127, 0, 63);
+ background-color: cornsilk;
+ selection-color: #0a214c;
+ selection-background-color: wheat;
+ border: 1px groove black;
+ border-radius: 1px;
+ padding: 1px;
+}
+
+caTextEntry:focus {
+ padding: 0px;
+ border: 2px groove darkred;
+ border-radius: 1px;
+}
+
+QPushButton {
+ border-color: #00b;
+ border-radius: 2px;
+ padding: 3px;
+ border-width: 1px;
+
+ background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
+ stop:0 rgba(224, 239, 255, 255),
+ stop:0.5 rgba(199, 215, 230, 255),
+ stop:1 rgba(184, 214, 236, 255));
+}
+QPushButton:hover {
+ background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
+ stop:0 rgba(201, 226, 255, 255),
+ stop:0.5 rgba(177, 204, 230, 255),
+ stop:1 rgba(163, 205, 236, 255));
+}
+QPushButton:pressed {
+ background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
+ stop:0 rgba(174, 219, 255, 255),
+ stop:0.5 rgba(165, 199, 230, 255),
+ stop:1 rgba(134, 188, 236, 255));
+}
+
+QPushButton:disabled {
+ background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
+ stop:0 rgba(174, 219, 255, 255),
+ stop:0.5 rgba(165, 199, 230, 255),
+ stop:1 rgba(134, 188, 236, 255));
+}
+
+caChoice {
+ background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
+ stop: 0 #E1E1E1, stop: 0.4 #DDDDDD,
+ stop: 0.5 #D8D8D8, stop: 1.0 #D3D3D3);
+}
+
+caChoice > QPushButton {
+ text-align: left;
+ padding: 1px;
+}
+
+/* when font specified, no font sizing is done any more, font: 10pt; is not bad. You could Enable this when you converted from .adl files
+caRelatedDisplay > QPushButton {
+font: 10pt;
+}
+
+caShellCommand > QPushButton {
+font: 10pt;
+}
+*/
+
+caSlider::groove:horizontal {
+border: 1px solid #bbb;
+background: lightgrey;
+height: 20px;
+border-radius: 4px;
+}
+
+caSlider::handle:horizontal {
+background: red;
+border: 1px solid #777;
+width: 13px;
+margin-top: -2px;
+margin-bottom: -2px;
+border-radius: 2px;
+}
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 721
+ 26
+
+
+
+ 0
+
+
+
+ 0
+ 53
+ 132
+
+
+
+ caFrame::Filled
+
+
+
+ 5
+
+
+ 10
+
+
+ 2
+
+
+ 0
+
+
+ 2
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ Verdana
+ 13
+ 75
+ true
+
+
+
+ Thorlabs SC10 Shutter Controller - $(P)$(S)
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::Height
+
+
+
+ 228
+ 228
+ 228
+
+
+
+
+ 160
+ 160
+ 164
+
+
+
+
+
+
+
+
+
+ 90
+ 40
+ 120
+ 28
+
+
+
+ Enable
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+ 40
+ 85
+ 171
+ 28
+
+
+
+ Trigger Mode
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+ 220
+ 85
+ 231
+ 31
+
+
+
+ $(P)$(S):TriggerMode
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 115
+ 223
+ 255
+
+
+
+ caChoice::Static
+
+
+ caChoice::Column
+
+
+ 1
+
+
+
+
+
+ 9
+ 130
+ 201
+ 28
+
+
+
+ Ext Trigger Out Mode
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+ 220
+ 130
+ 231
+ 31
+
+
+
+ $(P)$(S):ExtTriggerOutMode
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 115
+ 223
+ 255
+
+
+
+ caChoice::Static
+
+
+ caChoice::Column
+
+
+ 1
+
+
+
+
+
+ 220
+ 460
+ 341
+ 27
+
+
+
+
+ 0
+ 0
+
+
+
+ Qt::AlignCenter
+
+
+ $(P)$(S):ID
+
+
+
+ 10
+ 0
+ 184
+
+
+
+
+ 200
+ 200
+ 200
+
+
+
+ caLineEdit::Static
+
+
+ caLineEdit::WidthAndHeight
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 100
+ 460
+ 120
+ 28
+
+
+
+ Unit ID:
+
+
+ Qt::AlignCenter
+
+
+
+
+
+ 60
+ 340
+ 151
+ 28
+
+
+
+ RBV Update Rate
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+ 59
+ 380
+ 151
+ 28
+
+
+
+ Open/Closed?
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+ 60
+ 410
+ 151
+ 28
+
+
+
+ Interlocks?
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+ 59
+ 180
+ 151
+ 28
+
+
+
+ Shutter Mode
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+
+ 350
+ 180
+ 161
+ 27
+
+
+
+
+ 0
+ 0
+
+
+
+ Qt::AlignCenter
+
+
+ $(P)$(S):Mode_RBV
+
+
+
+ 10
+ 0
+ 184
+
+
+
+
+ 200
+ 200
+ 200
+
+
+
+ caLineEdit::Static
+
+
+ caLineEdit::WidthAndHeight
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 450
+ 40
+ 161
+ 27
+
+
+
+
+ 0
+ 0
+
+
+
+ Qt::AlignCenter
+
+
+ $(P)$(S):Enable_RBV
+
+
+
+ 10
+ 0
+ 184
+
+
+
+
+ 200
+ 200
+ 200
+
+
+
+ caLineEdit::Static
+
+
+ caLineEdit::WidthAndHeight
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 450
+ 85
+ 161
+ 27
+
+
+
+
+ 0
+ 0
+
+
+
+ Qt::AlignCenter
+
+
+ $(P)$(S):TriggerMode_RBV
+
+
+
+ 10
+ 0
+ 184
+
+
+
+
+ 200
+ 200
+ 200
+
+
+
+ caLineEdit::Static
+
+
+ caLineEdit::WidthAndHeight
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 450
+ 130
+ 161
+ 27
+
+
+
+
+ 0
+ 0
+
+
+
+ Qt::AlignCenter
+
+
+ $(P)$(S):ExtTriggerOutMode_RBV
+
+
+
+ 10
+ 0
+ 184
+
+
+
+
+ 200
+ 200
+ 200
+
+
+
+ caLineEdit::Static
+
+
+ caLineEdit::WidthAndHeight
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 220
+ 380
+ 161
+ 25
+
+
+
+
+ 0
+ 0
+
+
+
+ Qt::AlignCenter
+
+
+ $(P)$(S):ClosedStatus_RBV
+
+
+
+ 10
+ 0
+ 184
+
+
+
+
+ 200
+ 200
+ 200
+
+
+
+ caLineEdit::Static
+
+
+ caLineEdit::WidthAndHeight
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 220
+ 410
+ 161
+ 25
+
+
+
+
+ 0
+ 0
+
+
+
+ Qt::AlignCenter
+
+
+ $(P)$(S):InterlockStatus_RBV
+
+
+
+ 10
+ 0
+ 184
+
+
+
+
+ 200
+ 200
+ 200
+
+
+
+ caLineEdit::Static
+
+
+ caLineEdit::WidthAndHeight
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 590
+ 220
+ 120
+ 30
+
+
+
+ SAVE PROGRAM
+
+
+ $(P)$(S):SaveProg.PROC
+
+
+ SAVE PROGRAM
+
+
+
+ 115
+ 223
+ 255
+
+
+
+ 1
+
+
+
+
+
+ 590
+ 250
+ 120
+ 30
+
+
+
+ RESTORE PROGRAM
+
+
+ $(P)$(S):RestoreProg.PROC
+
+
+ RESTORE PROGRAM
+
+
+
+ 115
+ 223
+ 255
+
+
+
+ 1
+
+
+
+
+
+ 391
+ 220
+ 141
+ 27
+
+
+
+
+ 0
+ 0
+
+
+
+ Qt::AlignCenter
+
+
+ $(P)$(S):Reps_RBV
+
+
+
+ 10
+ 0
+ 184
+
+
+
+
+ 200
+ 200
+ 200
+
+
+
+ caLineEdit::Static
+
+
+ caLineEdit::WidthAndHeight
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 220
+ 220
+ 171
+ 27
+
+
+
+
+ 0
+ 0
+
+
+
+ $(P)$(S):Reps
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 115
+ 223
+ 255
+
+
+
+ caLineEdit::Static
+
+
+ caLineEdit::Channel
+
+
+ caLineEdit::Channel
+
+
+ 1.000000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::WidthAndHeight
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 40
+ 220
+ 171
+ 27
+
+
+
+ Repetitions
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+ 390
+ 260
+ 141
+ 27
+
+
+
+
+ 0
+ 0
+
+
+
+ Qt::AlignCenter
+
+
+ $(P)$(S):OpenTime_RBV
+
+
+
+ 10
+ 0
+ 184
+
+
+
+
+ 200
+ 200
+ 200
+
+
+
+ caLineEdit::Static
+
+
+ caLineEdit::WidthAndHeight
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 40
+ 260
+ 171
+ 27
+
+
+
+ Open Time (ms)
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+ 220
+ 260
+ 171
+ 27
+
+
+
+
+ 0
+ 0
+
+
+
+ $(P)$(S):OpenTime
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 115
+ 223
+ 255
+
+
+
+ caLineEdit::Static
+
+
+ caLineEdit::Channel
+
+
+ caLineEdit::Channel
+
+
+ 1.000000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::WidthAndHeight
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 391
+ 300
+ 141
+ 27
+
+
+
+
+ 0
+ 0
+
+
+
+ Qt::AlignCenter
+
+
+ $(P)$(S):ShutTime_RBV
+
+
+
+ 10
+ 0
+ 184
+
+
+
+
+ 200
+ 200
+ 200
+
+
+
+ caLineEdit::Static
+
+
+ caLineEdit::WidthAndHeight
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 40
+ 300
+ 171
+ 27
+
+
+
+ Shut Time (ms)
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+ 220
+ 300
+ 171
+ 27
+
+
+
+
+ 0
+ 0
+
+
+
+ $(P)$(S):ShutTime
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 115
+ 223
+ 255
+
+
+
+ caLineEdit::Static
+
+
+ caLineEdit::Channel
+
+
+ caLineEdit::Channel
+
+
+ 1.000000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::WidthAndHeight
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 230
+ 40
+ 101
+ 31
+
+
+
+ caFrame::IfZero
+
+
+ A
+
+
+ $(P)$(S):Enable
+
+
+
+
+ 0
+ 0
+ 101
+ 31
+
+
+
+ $(P)$(S):Enable
+
+
+ Enable
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 115
+ 223
+ 255
+
+
+
+ 1
+
+
+
+
+
+
+ 340
+ 40
+ 101
+ 31
+
+
+
+ caFrame::IfNotZero
+
+
+ A
+
+
+ $(P)$(S):Enable
+
+
+
+
+ 0
+ 0
+ 101
+ 31
+
+
+
+ Disable
+
+
+ $(P)$(S):Enable
+
+
+ Enable
+
+
+
+ 228
+ 228
+ 30
+
+
+
+
+ 228
+ 30
+ 30
+
+
+
+ 0
+
+
+
+
+
+
+
+ caMenu
+ QComboBox
+
+
+
+ caChoice
+ QWidget
+
+
+
+ caTextEntry
+ caLineEdit
+
+
+
+ caMessageButton
+ QPushButton
+
+
+
+ caFrame
+ QFrame
+
+ 1
+
+
+ caLabel
+ QLabel
+
+
+
+ caLineEdit
+ QLineEdit
+
+
+
+
+
+
diff --git a/ipApp/op/ui/XIA_pfcu_filters_base.ui b/ipApp/op/ui/XIA_pfcu_filters_base.ui
new file mode 100644
index 00000000..1a998c0a
--- /dev/null
+++ b/ipApp/op/ui/XIA_pfcu_filters_base.ui
@@ -0,0 +1,294 @@
+
+
+ Form
+
+
+
+ 0
+ 0
+ 736
+ 36
+
+
+
+ Form
+
+
+
+
+ 0
+ 0
+ 731
+ 31
+
+
+
+
+ 5
+
+
+ 2
+
+
+ 2
+
+ -
+
+
+ $(N)
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ $(P)$(F):filter$(N)_thick
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 115
+ 223
+ 255
+
+
+
+ caLineEdit::Static
+
+
+ caLineEdit::Channel
+
+
+ caLineEdit::Channel
+
+
+ 1.000000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::WidthAndHeight
+
+
+ caLineEdit::decimal
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Qt::AlignCenter
+
+
+ $(P)$(F):filter$(N)_thick.EGU
+
+
+
+ 10
+ 0
+ 184
+
+
+
+
+ 200
+ 200
+ 200
+
+
+
+ caLineEdit::Static
+
+
+ caLineEdit::WidthAndHeight
+
+
+ caLineEdit::decimal
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ $(P)$(F):filter$(N)_other
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 115
+ 223
+ 255
+
+
+
+ caLineEdit::Static
+
+
+ caLineEdit::Channel
+
+
+ caLineEdit::Channel
+
+
+ 1.000000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::WidthAndHeight
+
+
+ caLineEdit::decimal
+
+
+
+ -
+
+
+ $(P)$(F):filter$(N)
+
+
+
+ 115
+ 223
+ 255
+
+
+
+ caChoice::Static
+
+
+ caChoice::Column
+
+
+ 0
+
+
+ 1
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Qt::AlignCenter
+
+
+ $(P)$(F):filter$(N)_RBV
+
+
+
+ 10
+ 0
+ 179
+
+
+
+
+ 200
+ 200
+ 200
+
+
+
+ caLineEdit::Static
+
+
+ caLineEdit::WidthAndHeight
+
+
+ caLineEdit::decimal
+
+
+
+
+
+
+
+
+ caMenu
+ QComboBox
+
+
+
+ caChoice
+ QWidget
+
+
+
+ caTextEntry
+ caLineEdit
+
+
+
+ caLabel
+ QLabel
+
+
+
+ caLineEdit
+ QLineEdit
+
+
+
+
+
+
diff --git a/ipApp/op/ui/XIA_pfcu_filters_less.ui b/ipApp/op/ui/XIA_pfcu_filters_less.ui
new file mode 100644
index 00000000..129f1961
--- /dev/null
+++ b/ipApp/op/ui/XIA_pfcu_filters_less.ui
@@ -0,0 +1,405 @@
+
+
+ MainWindow
+
+
+
+ 0
+ 0
+ 362
+ 279
+
+
+
+ MainWindow
+
+
+
+
+
+ 0
+ 0
+ 361
+ 31
+
+
+
+
+ 0
+ 0
+
+
+
+ 0
+
+
+
+ 0
+ 53
+ 132
+
+
+
+ caFrame::Filled
+
+
+
+ 5
+
+
+ 10
+
+
+ 2
+
+
+ 0
+
+
+ 2
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ Verdana
+ 16
+ 75
+ true
+
+
+
+ XIA PFCU - $(P)$(F)
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::Height
+
+
+
+ 228
+ 228
+ 228
+
+
+
+
+ 160
+ 160
+ 164
+
+
+
+
+
+
+
+
+
+ 230
+ 220
+ 121
+ 31
+
+
+
+ -More
+
+
+
+ 255
+ 255
+ 255
+
+
+
+
+ 40
+ 147
+ 21
+
+
+
+ Less info
+
+
+ XIA_pfcu_filters_main.ui
+
+
+ P=$(P),F=$(F);
+
+
+ caRowColMenu::Menu
+
+
+ true
+
+
+
+
+
+ 100
+ 40
+ 161
+ 171
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 15
+
+
+
+ Simple Control
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
-
+
+
+ 1
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ 2
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ 3
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ 4
+
+
+ Qt::AlignCenter
+
+
+
+
+
+ -
+
+
-
+
+
+ $(P)$(F):filter1_RBV
+
+
+
+ 0
+ 255
+ 0
+
+
+
+
+ 255
+ 0
+ 0
+
+
+
+
+ -
+
+
+ $(P)$(F):filter2_RBV
+
+
+
+ 0
+ 255
+ 0
+
+
+
+
+ 255
+ 0
+ 0
+
+
+
+
+ -
+
+
+ $(P)$(F):filter3_RBV
+
+
+
+ 0
+ 255
+ 0
+
+
+
+
+ 255
+ 0
+ 0
+
+
+
+
+ -
+
+
+ $(P)$(F):filter4_RBV
+
+
+
+ 0
+ 255
+ 0
+
+
+
+
+ 255
+ 0
+ 0
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ $(P)$(F):config_RBV
+
+
+
+ 10
+ 0
+ 179
+
+
+
+
+ 200
+ 200
+ 200
+
+
+
+ caLineEdit::Static
+
+
+ caLineEdit::WidthAndHeight
+
+
+ caLineEdit::decimal
+
+
+
+
+
+
+
+
+
+
+ caMenu
+ QComboBox
+
+
+
+ caRelatedDisplay
+ QWidget
+
+
+
+ caFrame
+ QFrame
+
+ 1
+
+
+ caLabel
+ QLabel
+
+
+
+ caLed
+ QWidget
+
+
+
+ caLineEdit
+ QLineEdit
+
+
+
+
+
+
diff --git a/ipApp/op/ui/XIA_pfcu_filters_main.ui b/ipApp/op/ui/XIA_pfcu_filters_main.ui
new file mode 100644
index 00000000..87873478
--- /dev/null
+++ b/ipApp/op/ui/XIA_pfcu_filters_main.ui
@@ -0,0 +1,588 @@
+
+
+ MainWindow
+
+
+
+ 0
+ 0
+ 745
+ 487
+
+
+
+ MainWindow
+
+
+
+
+
+ 0
+ 0
+ 741
+ 31
+
+
+
+
+ 0
+ 0
+
+
+
+ 0
+
+
+
+ 0
+ 53
+ 132
+
+
+
+ caFrame::Filled
+
+
+
+ 5
+
+
+ 10
+
+
+ 2
+
+
+ 0
+
+
+ 2
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ Verdana
+ 16
+ 75
+ true
+
+
+
+ $(P)$(F) XIA PFCU filter set
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::Height
+
+
+
+ 228
+ 228
+ 228
+
+
+
+
+ 160
+ 160
+ 164
+
+
+
+
+
+
+
+
+
+ 0
+ 70
+ 741
+ 191
+
+
+
+ P=$(P),F=$(F),N=1;P=$(P),F=$(F),N=2;P=$(P),F=$(F),N=3;P=$(P),F=$(F),N=4
+
+
+ XIA_pfcu_filters_base.ui
+
+
+ 4
+
+
+
+
+
+ 310
+ 270
+ 161
+ 191
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 15
+
+
+
+ Simple Control
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
-
+
+
+ 1
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ 2
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ 3
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ 4
+
+
+ Qt::AlignCenter
+
+
+
+
+
+ -
+
+
-
+
+
+ $(P)$(F):filter1_RBV
+
+
+
+ 0
+ 255
+ 0
+
+
+
+
+ 255
+ 0
+ 0
+
+
+
+
+ -
+
+
+ $(P)$(F):filter2_RBV
+
+
+
+ 0
+ 255
+ 0
+
+
+
+
+ 255
+ 0
+ 0
+
+
+
+
+ -
+
+
+ $(P)$(F):filter3_RBV
+
+
+
+ 0
+ 255
+ 0
+
+
+
+
+ 255
+ 0
+ 0
+
+
+
+
+ -
+
+
+ $(P)$(F):filter4_RBV
+
+
+
+ 0
+ 255
+ 0
+
+
+
+
+ 255
+ 0
+ 0
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ $(P)$(F):config_RBV
+
+
+
+ 10
+ 0
+ 179
+
+
+
+
+ 200
+ 200
+ 200
+
+
+
+ caLineEdit::Static
+
+
+ caLineEdit::WidthAndHeight
+
+
+ caLineEdit::decimal
+
+
+
+
+
+
+
+
+ 620
+ 420
+ 121
+ 31
+
+
+
+ -Less
+
+
+
+ 255
+ 255
+ 255
+
+
+
+
+ 40
+ 147
+ 21
+
+
+
+ Less info
+
+
+ XIA_pfcu_filters_less.ui
+
+
+ P=$(P),F=$(F);
+
+
+ caRowColMenu::Menu
+
+
+ true
+
+
+
+
+
+ 0
+ 40
+ 731
+ 31
+
+
+
+
+ 5
+
+
+ 2
+
+
+ 2
+
+ -
+
+
+ Filter #
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ Material
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ Thickness
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ Notes
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ Control
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ Status
+
+
+ Qt::AlignCenter
+
+
+
+
+
+
+
+
+ 10
+ 400
+ 127
+ 25
+
+
+
+ -Calcs
+
+
+
+ 228
+ 228
+ 228
+
+
+
+
+ 53
+ 132
+ 0
+
+
+
+ Mode Calc;Config Transform;Config Calc;Read Config;Clear Fault;Read Fault
+
+
+ yyCalcoutRecord_full.ui;yyTransform_full.ui;yyCalcoutRecord_full.ui;yyCalcoutRecord_full.ui;yyCalcoutRecord_full.ui;yyCalcoutRecord_full.ui
+
+
+ P=$(P)$(F):, C=calcMode;P=$(P)$(F):, T=configTransform;P=$(P)$(F):, C=calcConfig;P=$(P)$(F):, C=readConfig;P=$(P)$(F):, C=clearFault;P=$(P)$(F):, C=readFault
+
+
+ caRowColMenu::Menu
+
+
+
+
+
+ 10
+ 430
+ 127
+ 25
+
+
+
+ -String Calcs
+
+
+
+ 228
+ 228
+ 228
+
+
+
+
+ 53
+ 132
+ 0
+
+
+
+ Mode RBV calc;Config RBV calc;Control Mode calc;Control RBV calc
+
+
+ yysCalcoutRecord_full.ui;yysCalcoutRecord_full.ui;yysCalcoutRecord_full.ui;yysCalcoutRecord_full.ui
+
+
+ P=$(P)$(F):, C=calcModeRBV;P=$(P)$(F):, C=calcConfigRBV;P=$(P)$(F):, C=calcControlMode;P=$(P)$(F):, C=calcControlRBV
+
+
+ caRowColMenu::Menu
+
+
+
+
+
+
+
+ caMenu
+ QComboBox
+
+
+
+ caRelatedDisplay
+ QWidget
+
+
+
+ caFrame
+ QFrame
+
+ 1
+
+
+ caLabel
+ QLabel
+
+
+
+ caInclude
+ QWidget
+
+
+
+ caLed
+ QWidget
+
+
+
+ caLineEdit
+ QLineEdit
+
+
+
+
+
+
diff --git a/ipApp/op/ui/uniblitz_d122.ui b/ipApp/op/ui/uniblitz_d122.ui
new file mode 100644
index 00000000..20a687a1
--- /dev/null
+++ b/ipApp/op/ui/uniblitz_d122.ui
@@ -0,0 +1,300 @@
+
+
+ MainWindow
+
+
+
+ 0
+ 0
+ 364
+ 130
+
+
+
+
+
+QWidget#centralWidget {background: rgba(187, 187, 187, 255);}
+QPushButton::menu-indicator {image: url(none.png); width: 0}
+
+caTable {
+ font: 10pt;
+ background: cornsilk;
+ alternate-background-color: wheat;
+}
+
+caLineEdit {
+ border-radius: 1px;
+ background: lightyellow;
+ color: black;
+ }
+
+caTextEntry {
+ color: rgb(127, 0, 63);
+ background-color: cornsilk;
+ selection-color: #0a214c;
+ selection-background-color: wheat;
+ border: 1px groove black;
+ border-radius: 1px;
+ padding: 1px;
+}
+
+caTextEntry:focus {
+ padding: 0px;
+ border: 2px groove darkred;
+ border-radius: 1px;
+}
+
+QPushButton {
+ border-color: #00b;
+ border-radius: 2px;
+ padding: 3px;
+ border-width: 1px;
+
+ background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
+ stop:0 rgba(224, 239, 255, 255),
+ stop:0.5 rgba(199, 215, 230, 255),
+ stop:1 rgba(184, 214, 236, 255));
+}
+QPushButton:hover {
+ background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
+ stop:0 rgba(201, 226, 255, 255),
+ stop:0.5 rgba(177, 204, 230, 255),
+ stop:1 rgba(163, 205, 236, 255));
+}
+QPushButton:pressed {
+ background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
+ stop:0 rgba(174, 219, 255, 255),
+ stop:0.5 rgba(165, 199, 230, 255),
+ stop:1 rgba(134, 188, 236, 255));
+}
+
+QPushButton:disabled {
+ background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
+ stop:0 rgba(174, 219, 255, 255),
+ stop:0.5 rgba(165, 199, 230, 255),
+ stop:1 rgba(134, 188, 236, 255));
+}
+
+caChoice {
+ background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
+ stop: 0 #E1E1E1, stop: 0.4 #DDDDDD,
+ stop: 0.5 #D8D8D8, stop: 1.0 #D3D3D3);
+}
+
+caChoice > QPushButton {
+ text-align: left;
+ padding: 1px;
+}
+
+/* when font specified, no font sizing is done any more, font: 10pt; is not bad. You could Enable this when you converted from .adl files
+caRelatedDisplay > QPushButton {
+font: 10pt;
+}
+
+caShellCommand > QPushButton {
+font: 10pt;
+}
+*/
+
+caSlider::groove:horizontal {
+border: 1px solid #bbb;
+background: lightgrey;
+height: 20px;
+border-radius: 4px;
+}
+
+caSlider::handle:horizontal {
+background: red;
+border: 1px solid #777;
+width: 13px;
+margin-top: -2px;
+margin-bottom: -2px;
+border-radius: 2px;
+}
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 361
+ 26
+
+
+
+ 0
+
+
+
+ 0
+ 53
+ 132
+
+
+
+ caFrame::Filled
+
+
+
+ 5
+
+
+ 10
+
+
+ 2
+
+
+ 0
+
+
+ 2
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ Verdana
+ 13
+ 75
+ true
+
+
+
+ Uniblitz D122 - $(P)$(S)
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::Height
+
+
+
+ 228
+ 228
+ 228
+
+
+
+
+ 160
+ 160
+ 164
+
+
+
+
+
+
+
+
+
+ 20
+ 60
+ 117
+ 46
+
+
+
+ $(P)$(S):Control
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 115
+ 223
+ 255
+
+
+
+ caChoice::Static
+
+
+ 1
+
+
+
+
+
+ 20
+ 30
+ 90
+ 28
+
+
+
+ Shutter
+
+
+
+
+
+ 210
+ 60
+ 111
+ 31
+
+
+
+ Reset
+
+
+ $(P)$(S):Reset.PROC
+
+
+
+ 115
+ 223
+ 255
+
+
+
+ 1
+
+
+
+
+
+
+ caChoice
+ QWidget
+
+
+
+ caMessageButton
+ QPushButton
+
+
+
+ caFrame
+ QFrame
+
+ 1
+
+
+ caLabel
+ QLabel
+
+
+
+
+
+
diff --git a/ipApp/op/ui/uniblitz_vcm-d1.ui b/ipApp/op/ui/uniblitz_vcm-d1.ui
new file mode 100644
index 00000000..f2eb5daf
--- /dev/null
+++ b/ipApp/op/ui/uniblitz_vcm-d1.ui
@@ -0,0 +1,518 @@
+
+
+ MainWindow
+
+
+
+ 0
+ 0
+ 402
+ 323
+
+
+
+
+
+QWidget#centralWidget {background: rgba(187, 187, 187, 255);}
+QPushButton::menu-indicator {image: url(none.png); width: 0}
+
+caTable {
+ font: 10pt;
+ background: cornsilk;
+ alternate-background-color: wheat;
+}
+
+caLineEdit {
+ border-radius: 1px;
+ background: lightyellow;
+ color: black;
+ }
+
+caTextEntry {
+ color: rgb(127, 0, 63);
+ background-color: cornsilk;
+ selection-color: #0a214c;
+ selection-background-color: wheat;
+ border: 1px groove black;
+ border-radius: 1px;
+ padding: 1px;
+}
+
+caTextEntry:focus {
+ padding: 0px;
+ border: 2px groove darkred;
+ border-radius: 1px;
+}
+
+QPushButton {
+ border-color: #00b;
+ border-radius: 2px;
+ padding: 3px;
+ border-width: 1px;
+
+ background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
+ stop:0 rgba(224, 239, 255, 255),
+ stop:0.5 rgba(199, 215, 230, 255),
+ stop:1 rgba(184, 214, 236, 255));
+}
+QPushButton:hover {
+ background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
+ stop:0 rgba(201, 226, 255, 255),
+ stop:0.5 rgba(177, 204, 230, 255),
+ stop:1 rgba(163, 205, 236, 255));
+}
+QPushButton:pressed {
+ background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
+ stop:0 rgba(174, 219, 255, 255),
+ stop:0.5 rgba(165, 199, 230, 255),
+ stop:1 rgba(134, 188, 236, 255));
+}
+
+QPushButton:disabled {
+ background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
+ stop:0 rgba(174, 219, 255, 255),
+ stop:0.5 rgba(165, 199, 230, 255),
+ stop:1 rgba(134, 188, 236, 255));
+}
+
+caChoice {
+ background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
+ stop: 0 #E1E1E1, stop: 0.4 #DDDDDD,
+ stop: 0.5 #D8D8D8, stop: 1.0 #D3D3D3);
+}
+
+caChoice > QPushButton {
+ text-align: left;
+ padding: 1px;
+}
+
+/* when font specified, no font sizing is done any more, font: 10pt; is not bad. You could Enable this when you converted from .adl files
+caRelatedDisplay > QPushButton {
+font: 10pt;
+}
+
+caShellCommand > QPushButton {
+font: 10pt;
+}
+*/
+
+caSlider::groove:horizontal {
+border: 1px solid #bbb;
+background: lightgrey;
+height: 20px;
+border-radius: 4px;
+}
+
+caSlider::handle:horizontal {
+background: red;
+border: 1px solid #777;
+width: 13px;
+margin-top: -2px;
+margin-bottom: -2px;
+border-radius: 2px;
+}
+
+
+
+
+
+
+
+
+
+ 275
+ 48
+ 111
+ 31
+
+
+
+ Qt::AlignAbsolute|Qt::AlignCenter|Qt::AlignHCenter|Qt::AlignVCenter
+
+
+ $(P)$(S):Status
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 187
+ 187
+ 187
+
+
+
+ caLineEdit::Static
+
+
+ caLineEdit::Channel
+
+
+ caLineEdit::Channel
+
+
+ 1.000000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::WidthAndHeight
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 20
+ 60
+ 120
+ 46
+
+
+
+ $(P)$(S):Control
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 115
+ 223
+ 255
+
+
+
+ caChoice::Static
+
+
+ 1
+
+
+
+
+
+
+ 0
+ 0
+ 401
+ 26
+
+
+
+ 0
+
+
+
+ 0
+ 53
+ 132
+
+
+
+ caFrame::Filled
+
+
+
+ 5
+
+
+ 10
+
+
+ 2
+
+
+ 0
+
+
+ 2
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ Verdana
+ 13
+ 75
+ true
+
+
+
+ Uniblitz VCM-D1 - $(P)$(S)
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::Height
+
+
+
+ 228
+ 228
+ 228
+
+
+
+
+ 160
+ 160
+ 164
+
+
+
+
+
+
+
+
+
+ 20
+ 30
+ 120
+ 28
+
+
+
+ Shutter
+
+
+ Qt::AlignCenter
+
+
+
+
+
+ 270
+ 160
+ 111
+ 31
+
+
+
+ Reset
+
+
+ $(P)$(S):Reset.PROC
+
+
+
+ 115
+ 223
+ 255
+
+
+
+ 1
+
+
+
+
+
+ 270
+ 130
+ 111
+ 31
+
+
+
+ Trigger
+
+
+ $(P)$(S):Trigger.PROC
+
+
+
+ 115
+ 223
+ 255
+
+
+
+ 1
+
+
+
+
+
+ 20
+ 120
+ 120
+ 28
+
+
+
+ Gate
+
+
+ Qt::AlignCenter
+
+
+
+
+
+ 20
+ 150
+ 120
+ 46
+
+
+
+ $(P)$(S):Gate
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 115
+ 223
+ 255
+
+
+
+ caChoice::Static
+
+
+ 1
+
+
+
+
+
+ 20
+ 210
+ 120
+ 28
+
+
+
+ Aux Out
+
+
+ Qt::AlignCenter
+
+
+
+
+
+ 20
+ 240
+ 120
+ 46
+
+
+
+ $(P)$(S):AuxOut
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 115
+ 223
+ 255
+
+
+
+ caChoice::Static
+
+
+ 1
+
+
+
+
+
+
+ caMenu
+ QComboBox
+
+
+
+ caChoice
+ QWidget
+
+
+
+ caMessageButton
+ QPushButton
+
+
+
+ caFrame
+ QFrame
+
+ 1
+
+
+ caLabel
+ QLabel
+
+
+
+ caLineEdit
+ QLineEdit
+
+
+
+
+
+