#=================================================================#
# Template file: NDColorConvert.template
# Database for the ColorConvert plugin
# Mark Rivers
# December 23, 2008

#=================================================================#
# Template file: NDPluginBase.template
# Database for NDPluginBase, i.e. records common to all plugins
# Mark Rivers
# April 25, 2008

#=================================================================#
# Template file: NDArrayBase.template
# Database for area detector control using asyn driver and standard asyn device support
# Mark Rivers
# March 9, 2008

###################################################################
#  This record contains the version of ADCore                     #
###################################################################

record(stringin, "$(CAM):CC1:ADCoreVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))ADCORE_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the version of the driver or plugin       #
###################################################################

record(stringin, "$(CAM):CC1:DriverVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))DRIVER_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the asyn port name of this detector       #
###################################################################

record(stringin, "$(CAM):CC1:PortName_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))PORT_NAME_SELF")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records contain basic information about the detector     # 
###################################################################

record(stringin, "$(CAM):CC1:Manufacturer_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))MANUFACTURER")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):CC1:Model_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))MODEL")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):CC1:SerialNumber_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))SERIAL_NUMBER")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):CC1:SDKVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))SDK_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):CC1:FirmwareVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))FIRMWARE_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control acquisition start and stop               #
###################################################################

record(bo, "$(CAM):CC1:Acquire") {
   field(DTYP, "asynInt32")
   field(OUT, "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))ACQUIRE")
   field(ZNAM, "Done")
   field(ONAM, "Acquire")
   field(VAL,  "0")
   field(FLNK, "$(CAM):CC1:SetAcquireBusy")
   info(asyn:READBACK, "1")
}

record(bi, "$(CAM):CC1:Acquire_RBV") {
   field(DTYP, "asynInt32")
   field(INP, "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))ACQUIRE")
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):CC1:SetAcquireBusy")
{
    field(INPA, "$(CAM):CC1:Acquire NPP")
    field(CALC, "A")
    field(OOPT, "Transition To Non-zero")
    field(OUT,  "$(CAM):CC1:AcquireBusy PP")
}

record(busy, "$(CAM):CC1:AcquireBusy") {
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(VAL,  "0")
}

record(bi, "$(CAM):CC1:AcquireBusyCB") {
   field(DTYP, "asynInt32")
   field(INP, "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))ACQUIRE_BUSY")
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):CC1:ClearAcquireBusy") {
    field(INPA, "$(CAM):CC1:AcquireBusyCB CP")
    field(CALC, "A")
    field(OOPT, "Transition To Zero")
    field(OUT,  "$(CAM):CC1:AcquireBusy PP")
}

record(bo, "$(CAM):CC1:WaitForPlugins") {
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT, "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))WAIT_FOR_PLUGINS")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(VAL,  "0")
}

###################################################################
#  These records are the array size and data type                 #
###################################################################
# The number of dimensions
record(longout, "$(CAM):CC1:NDimensions")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))ARRAY_NDIMENSIONS")
}

record(longin, "$(CAM):CC1:NDimensions_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))ARRAY_NDIMENSIONS")
    field(SCAN, "I/O Intr")
}

# The array dimensions waveform records
record(waveform, "$(CAM):CC1:Dimensions")
{
    field(DTYP, "asynInt32ArrayOut")
    field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))ARRAY_DIMENSIONS")
    field(FTVL, "LONG")
    field(NELM, "10")
    field(FLNK, "$(CAM):CC1:Dim0SA")
}

record(subArray, "$(CAM):CC1:Dim0SA")
{
    field(INP,  "$(CAM):CC1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "0")
    field(FLNK, "$(CAM):CC1:ArraySize0")
}

record(longin, "$(CAM):CC1:ArraySize0")
{
    field(INP,  "$(CAM):CC1:Dim0SA")
    field(FLNK, "$(CAM):CC1:Dim1SA")
}

record(subArray, "$(CAM):CC1:Dim1SA")
{
    field(INP,  "$(CAM):CC1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "1")
    field(FLNK, "$(CAM):CC1:ArraySize1")
}

record(longin, "$(CAM):CC1:ArraySize1")
{
    field(INP,  "$(CAM):CC1:Dim1SA")
    field(FLNK, "$(CAM):CC1:Dim2SA")
}

record(subArray, "$(CAM):CC1:Dim2SA")
{
    field(INP,  "$(CAM):CC1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "2")
    field(FLNK, "$(CAM):CC1:ArraySize2")
}

record(longin, "$(CAM):CC1:ArraySize2")
{
    field(INP,  "$(CAM):CC1:Dim2SA")
    field(FLNK, "$(CAM):CC1:Dim3SA")
}

record(subArray, "$(CAM):CC1:Dim3SA")
{
    field(INP,  "$(CAM):CC1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "3")
    field(FLNK, "$(CAM):CC1:ArraySize3")
}

record(longin, "$(CAM):CC1:ArraySize3")
{
    field(INP,  "$(CAM):CC1:Dim3SA")
    field(FLNK, "$(CAM):CC1:Dim4SA")
}

record(subArray, "$(CAM):CC1:Dim4SA")
{
    field(INP,  "$(CAM):CC1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "4")
    field(FLNK, "$(CAM):CC1:ArraySize4")
}

record(longin, "$(CAM):CC1:ArraySize4")
{
    field(INP,  "$(CAM):CC1:Dim4SA")
    field(FLNK, "$(CAM):CC1:Dim5SA")
}

record(subArray, "$(CAM):CC1:Dim5SA")
{
    field(INP,  "$(CAM):CC1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "5")
    field(FLNK, "$(CAM):CC1:ArraySize5")
}

record(longin, "$(CAM):CC1:ArraySize5")
{
    field(INP,  "$(CAM):CC1:Dim5SA")
    field(FLNK, "$(CAM):CC1:Dim6SA")
}

record(subArray, "$(CAM):CC1:Dim6SA")
{
    field(INP,  "$(CAM):CC1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "6")
    field(FLNK, "$(CAM):CC1:ArraySize6")
}

record(longin, "$(CAM):CC1:ArraySize6")
{
    field(INP,  "$(CAM):CC1:Dim6SA")
    field(FLNK, "$(CAM):CC1:Dim7SA")
}

record(subArray, "$(CAM):CC1:Dim7SA")
{
    field(INP,  "$(CAM):CC1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "7")
    field(FLNK, "$(CAM):CC1:ArraySize7")
}

record(longin, "$(CAM):CC1:ArraySize7")
{
    field(INP,  "$(CAM):CC1:Dim7SA")
    field(FLNK, "$(CAM):CC1:Dim8SA")
}

record(subArray, "$(CAM):CC1:Dim8SA")
{
    field(INP,  "$(CAM):CC1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "8")
    field(FLNK, "$(CAM):CC1:ArraySize8")
}

record(longin, "$(CAM):CC1:ArraySize8")
{
    field(INP,  "$(CAM):CC1:Dim8SA")
    field(FLNK, "$(CAM):CC1:Dim9SA")
}

record(subArray, "$(CAM):CC1:Dim9SA")
{
    field(INP,  "$(CAM):CC1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "9")
    field(FLNK, "$(CAM):CC1:ArraySize9")
}

record(longin, "$(CAM):CC1:ArraySize9")
{
    field(INP,  "$(CAM):CC1:Dim9SA")
}


record(waveform, "$(CAM):CC1:Dimensions_RBV")
{
    field(DTYP, "asynInt32ArrayIn")
    field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))ARRAY_DIMENSIONS")
    field(FTVL, "LONG")
    field(NELM, "10")
    field(FLNK, "$(CAM):CC1:Dim0SA_RBV")
    field(SCAN, "I/O Intr")
}

record(subArray, "$(CAM):CC1:Dim0SA_RBV")
{
    field(INP,  "$(CAM):CC1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "0")
    field(FLNK, "$(CAM):CC1:ArraySize0_RBV")
}

record(longin, "$(CAM):CC1:ArraySize0_RBV")
{
    field(INP,  "$(CAM):CC1:Dim0SA_RBV")
    field(FLNK, "$(CAM):CC1:Dim1SA_RBV")
}

record(subArray, "$(CAM):CC1:Dim1SA_RBV")
{
    field(INP,  "$(CAM):CC1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "1")
    field(FLNK, "$(CAM):CC1:ArraySize1_RBV")
}

record(longin, "$(CAM):CC1:ArraySize1_RBV")
{
    field(INP,  "$(CAM):CC1:Dim1SA_RBV")
    field(FLNK, "$(CAM):CC1:Dim2SA_RBV")
}

record(subArray, "$(CAM):CC1:Dim2SA_RBV")
{
    field(INP,  "$(CAM):CC1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "2")
    field(FLNK, "$(CAM):CC1:ArraySize2_RBV")
}

record(longin, "$(CAM):CC1:ArraySize2_RBV")
{
    field(INP,  "$(CAM):CC1:Dim2SA_RBV")
    field(FLNK, "$(CAM):CC1:Dim3SA_RBV")
}

record(subArray, "$(CAM):CC1:Dim3SA_RBV")
{
    field(INP,  "$(CAM):CC1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "3")
    field(FLNK, "$(CAM):CC1:ArraySize3_RBV")
}

record(longin, "$(CAM):CC1:ArraySize3_RBV")
{
    field(INP,  "$(CAM):CC1:Dim3SA_RBV")
    field(FLNK, "$(CAM):CC1:Dim4SA_RBV")
}

record(subArray, "$(CAM):CC1:Dim4SA_RBV")
{
    field(INP,  "$(CAM):CC1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "4")
    field(FLNK, "$(CAM):CC1:ArraySize4_RBV")
}

record(longin, "$(CAM):CC1:ArraySize4_RBV")
{
    field(INP,  "$(CAM):CC1:Dim4SA_RBV")
    field(FLNK, "$(CAM):CC1:Dim5SA_RBV")
}

record(subArray, "$(CAM):CC1:Dim5SA_RBV")
{
    field(INP,  "$(CAM):CC1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "5")
    field(FLNK, "$(CAM):CC1:ArraySize5_RBV")
}

record(longin, "$(CAM):CC1:ArraySize5_RBV")
{
    field(INP,  "$(CAM):CC1:Dim5SA_RBV")
    field(FLNK, "$(CAM):CC1:Dim6SA_RBV")
}

record(subArray, "$(CAM):CC1:Dim6SA_RBV")
{
    field(INP,  "$(CAM):CC1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "6")
    field(FLNK, "$(CAM):CC1:ArraySize6_RBV")
}

record(longin, "$(CAM):CC1:ArraySize6_RBV")
{
    field(INP,  "$(CAM):CC1:Dim6SA_RBV")
    field(FLNK, "$(CAM):CC1:Dim7SA_RBV")
}

record(subArray, "$(CAM):CC1:Dim7SA_RBV")
{
    field(INP,  "$(CAM):CC1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "7")
    field(FLNK, "$(CAM):CC1:ArraySize7_RBV")
}

record(longin, "$(CAM):CC1:ArraySize7_RBV")
{
    field(INP,  "$(CAM):CC1:Dim7SA_RBV")
    field(FLNK, "$(CAM):CC1:Dim8SA_RBV")
}

record(subArray, "$(CAM):CC1:Dim8SA_RBV")
{
    field(INP,  "$(CAM):CC1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "8")
    field(FLNK, "$(CAM):CC1:ArraySize8_RBV")
}

record(longin, "$(CAM):CC1:ArraySize8_RBV")
{
    field(INP,  "$(CAM):CC1:Dim8SA_RBV")
    field(FLNK, "$(CAM):CC1:Dim9SA_RBV")
}

record(subArray, "$(CAM):CC1:Dim9SA_RBV")
{
    field(INP,  "$(CAM):CC1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "9")
    field(FLNK, "$(CAM):CC1:ArraySize9_RBV")
}

record(longin, "$(CAM):CC1:ArraySize9_RBV")
{
    field(INP,  "$(CAM):CC1:Dim9SA_RBV")
}


record(mbbi, "$(CAM):CC1:BayerPattern_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))BAYER_PATTERN")
   field(ZRST, "RGGB")
   field(ZRVL, "0")
   field(ONST, "GBRG")
   field(ONVL, "1")
   field(TWST, "GRBG")
   field(TWVL, "2")
   field(THST, "BGGR")
   field(THVL, "3")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):CC1:ArraySizeX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_X")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):CC1:ArraySizeY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_Y")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):CC1:ArraySizeZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_Z")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):CC1:ArraySize_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records have information on the compression              # 
###################################################################
record(stringin, "$(CAM):CC1:Codec_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))CODEC")
   field(VAL,  "")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):CC1:CompressedSize_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))COMPRESSED_SIZE")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the data type                            # 
###################################################################

record(mbbo, "$(CAM):CC1:DataType")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))DATA_TYPE")
   field(ZRST, "Int8")
   field(ZRVL, "0")
   field(ONST, "UInt8")
   field(ONVL, "1")
   field(TWST, "Int16")
   field(TWVL, "2")
   field(THST, "UInt16")
   field(THVL, "3")
   field(FRST, "Int32")
   field(FRVL, "4")
   field(FVST, "UInt32")
   field(FVVL, "5")
   field(SXST, "Int64")
   field(SXVL, "6")
   field(SVST, "UInt64")
   field(SVVL, "7")
   field(EIST, "Float32")
   field(EIVL, "8")
   field(NIST, "Float64")
   field(NIVL, "9")
   field(VAL,  "0")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):CC1:DataType_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))DATA_TYPE")
   field(ZRST, "Int8")
   field(ZRVL, "0")
   field(ONST, "UInt8")
   field(ONVL, "1")
   field(TWST, "Int16")
   field(TWVL, "2")
   field(THST, "UInt16")
   field(THVL, "3")
   field(FRST, "Int32")
   field(FRVL, "4")
   field(FVST, "UInt32")
   field(FVVL, "5")
   field(SXST, "Int64")
   field(SXVL, "6")
   field(SVST, "UInt64")
   field(SVVL, "7")
   field(EIST, "Float32")
   field(EIVL, "8")
   field(NIST, "Float64")
   field(NIVL, "9")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):CC1:BitsPerPixel_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))BITS_PER_PIXEL")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the color mode                           #
#  These choices must agree with NDColorMode_t in NDArray.h       # 
###################################################################

record(mbbo, "$(CAM):CC1:ColorMode")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))COLOR_MODE")
   field(ZRST, "Mono")
   field(ZRVL, "0")
   field(ONST, "Bayer")
   field(ONVL, "1")
   field(TWST, "RGB1")
   field(TWVL, "2")
   field(THST, "RGB2")
   field(THVL, "3")
   field(FRST, "RGB3")
   field(FRVL, "4")
   field(FVST, "YUV444")
   field(FVVL, "5")
   field(SXST, "YUV422")
   field(SXVL, "6")
   field(SVST, "YUV421")
   field(SVVL, "7")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):CC1:ColorMode_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))COLOR_MODE")
   field(ZRST, "Mono")
   field(ZRVL, "0")
   field(ONST, "Bayer")
   field(ONVL, "1")
   field(TWST, "RGB1")
   field(TWVL, "2")
   field(THST, "RGB2")
   field(THVL, "3")
   field(FRST, "RGB3")
   field(FRVL, "4")
   field(FVST, "YUV444")
   field(FVVL, "5")
   field(SXST, "YUV422")
   field(SXVL, "6")
   field(SVST, "YUV421")
   field(SVVL, "7")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records are the uniqueId and time stamps of the array     #
###################################################################
record(longin, "$(CAM):CC1:UniqueId_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))UNIQUE_ID")
    field(SCAN, "I/O Intr")
}

record(ai, "$(CAM):CC1:TimeStamp_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))TIME_STAMP")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):CC1:EpicsTSSec_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))EPICS_TS_SEC")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):CC1:EpicsTSNsec_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))EPICS_TS_NSEC")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records provide statistics on array callbacks and        #
#  array callback rates                                           # 
###################################################################
record(longout, "$(CAM):CC1:ArrayCounter")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))ARRAY_COUNTER")
}

record(longin, "$(CAM):CC1:ArrayCounter_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))ARRAY_COUNTER")
    field(SCAN, "I/O Intr")
    field(TSE,  "-2")
    field(LOW,  "0" )
    field(LSV,  "MINOR" )
    info(autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV TSE")
}

# Updated rate calculation to use a smoothing factor w/ guard against negative values
# 0 rate sets alarm state to MINOR
record(calc, "$(CAM):CC1:ArrayRate_RBV")
{
    field(INPA, "$(CAM):CC1:ArrayRate_RBV.LB NPP NMS")   # Previous counter (Last B value)
    field(INPB, "$(CAM):CC1:ArrayCounter_RBV NPP NMS")   # Current counter value
    field(INPC, "1.0")                                # Delta time in seconds
    field(INPD, "$(CAM):CC1:ArrayRate_RBV.VAL NPP NMS")  # Previous rate
    field(INPE, "0.0")                 # Smoothing factor
    field(CALC, "(D*E)/C+MAX(0,B-A)*(1-E)/C")
    field(PREC, "2" )
    field(EGU,  "Hz" )
    field(SCAN, "1 second")
    field(LOW,  "0")
    field(LSV,  "MINOR")
    field(ADEL, "0.1")
    info(autosaveFields, "ADEL DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV MDEL PREC C E SCAN EGU")
}

###################################################################
#  These records control NDArray callacks                         # 
###################################################################
record(bo, "$(CAM):CC1:ArrayCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))ARRAY_CALLBACKS")
    field(ZNAM, "Disable")
    field(ZSV,  "MINOR")
    field(ONAM, "Enable")
    field(OSV,  "NO_ALARM")
    field(VAL, "1")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):CC1:ArrayCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))ARRAY_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ZSV,  "MINOR")
    field(ONAM, "Enabled")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains macro definitions for the attributes      # 
###################################################################

record(waveform, "$(CAM):CC1:NDAttributesMacros")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_MACROS")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

###################################################################
#  This record is the name of a file defining attributes          # 
###################################################################

record(waveform, "$(CAM):CC1:NDAttributesFile")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_FILE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

###################################################################
#  This record defines the status of reading attributes file      # 
###################################################################

record(mbbi, "$(CAM):CC1:NDAttributesStatus")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_STATUS")
    field(ZRVL, "0")
    field(ZRST, "Attributes file OK")
    field(ZRSV, "NO_ALARM")
    field(ONVL, "1")
    field(ONST, "File not found")
    field(ONSV, "MINOR")
    field(TWVL, "2")
    field(TWST, "XML syntax error")
    field(TWSV, "MAJOR")
    field(THVL, "3")
    field(THST, "Macro substitution error")
    field(THSV, "MAJOR")
    field(SCAN, "I/O Intr")
}

###################################################################
#  Status of NDArrayPool - number of buffers, memory used etc.    # 
###################################################################

record(ai, "$(CAM):CC1:PoolMaxMem")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))POOL_MAX_MEMORY")
   field(PREC, "1")
   field(EGU,  "MB")
   field(SCAN, "Passive")
   field(PINI, "YES")
}

record(ai, "$(CAM):CC1:PoolUsedMem")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))POOL_USED_MEMORY")
   field(PREC, "1")
   field(EGU,  "MB")
   field(SCAN, "1 second")
   field(FLNK, "$(CAM):CC1:PoolAllocBuffers")
   info(autosaveFields, "SCAN")
}

record(longin, "$(CAM):CC1:PoolAllocBuffers")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))POOL_ALLOC_BUFFERS")
   field(FLNK, "$(CAM):CC1:PoolFreeBuffers")
}

record(longin, "$(CAM):CC1:PoolFreeBuffers")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))POOL_FREE_BUFFERS")
   field(FLNK, "$(CAM):CC1:PoolUsedBuffers")
}

record(calc, "$(CAM):CC1:PoolUsedBuffers")
{
    field(INPA, "$(CAM):CC1:PoolAllocBuffers NPP MS")
    field(INPB, "$(CAM):CC1:PoolFreeBuffers NPP MS")
    field(CALC, "A-B")
}

record(bo, "$(CAM):CC1:EmptyFreeList")
{
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))POOL_EMPTY_FREELIST")
}

record(longin, "$(CAM):CC1:NumQueuedArrays")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))NUM_QUEUED_ARRAYS")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the type of plugin                        #
###################################################################

record(stringin, "$(CAM):CC1:PluginType_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))PLUGIN_TYPE")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the connection of the server to          #
#  an NDArray driver port and address                             #
###################################################################
# Array port name
record(stringout, "$(CAM):CC1:NDArrayPort")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(OUT,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))NDARRAY_PORT")
    field(VAL,  "$(CAM_PORT)")
    info(autosaveFields, "DESC VAL")
}

record(stringin, "$(CAM):CC1:NDArrayPort_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))NDARRAY_PORT")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):CC1:NDArrayAddress")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))NDARRAY_ADDR")
    field(VAL,  "$(NDARRAY_ADDR=0)")
    info(autosaveFields, "DESC VAL")
}

record(longin, "$(CAM):CC1:NDArrayAddress_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))NDARRAY_ADDR")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control whether callbacks are enabled and        #
#  minimum time between callbacks                                 #
###################################################################
record(bo, "$(CAM):CC1:EnableCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))ENABLE_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    field(VAL,  "0")
    info(autosaveFields, "DESC VAL")
}

record(bi, "$(CAM):CC1:EnableCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))ENABLE_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    field(ZSV,  "MINOR")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):CC1:MinCallbackTime")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))MIN_CALLBACK_TIME")
    field(EGU,  "s")
    field(PREC, "3")
    field(VAL,  "0.0")
    field(DRVL, "0")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):CC1:MinCallbackTime_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))MIN_CALLBACK_TIME")
    field(EGU,  "s")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):CC1:MaxArrayRate")
{
    field(DTYP, "Soft Channel")
    field(OUT,  "$(CAM):CC1:MaxArrayRate_COUT PP")
    field(EGU,  "Hz")
    field(PREC, "3")
    field(VAL,  "0.0")
    info(autosaveFields, "VAL")
}

record(calcout, "$(CAM):CC1:MaxArrayRate_COUT")
{
    field(INPA, "$(CAM):CC1:MaxArrayRate")
    field(CALC, "A=0?0:1.0/A")
    field(OUT,  "$(CAM):CC1:MinCallbackTime PP")
}

record(calc, "$(CAM):CC1:MaxArrayRate_RBV")
{
    field(INPA, "$(CAM):CC1:MinCallbackTime_RBV CP")
    field(CALC, "A=0?0:1.0/A")
    field(EGU,  "Hz")
    field(PREC, "3")
    field(SCAN, "Passive")
}

record(ao, "$(CAM):CC1:MaxByteRate")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))MAX_BYTE_RATE")
    field(EGU,  "s")
    field(PREC, "3")
    field(VAL,  "0.0")
    field(DRVL, "0")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):CC1:MaxByteRate_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))MAX_BYTE_RATE")
    field(EGU,  "s")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the last execution time of the plugin     #
###################################################################
record(ai, "$(CAM):CC1:ExecutionTime_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))EXECUTION_TIME")
    field(EGU,  "ms")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record requests that the plugin execute again with the    #
#  same NDArray                                                   #
###################################################################
record(bo, "$(CAM):CC1:ProcessPlugin")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))PROCESS_PLUGIN")
    field(VAL,  "1")
}

###################################################################
#  These records control whether callbacks block or not           #
###################################################################
record(bo, "$(CAM):CC1:BlockingCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))BLOCKING_CALLBACKS")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(VAL,  "0")
    info(autosaveFields, "DESC ZSV OSV VAL")
}

record(bi, "$(CAM):CC1:BlockingCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))BLOCKING_CALLBACKS")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(ZSV,  "NO_ALARM")
    field(OSV,  "MINOR")
    field(SCAN, "I/O Intr")
    info( autosaveFields, "DESC ZSV OSV" )
}


record(longout, "$(CAM):CC1:DroppedArrays")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))DROPPED_ARRAYS")
    field(VAL,  "0")
    info( autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV EGU" )
}

record(longin, "$(CAM):CC1:DroppedArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))DROPPED_ARRAYS")
    field(SCAN, "I/O Intr")
    field(HIGH, "1")
    field(HSV,  "MINOR")
    info( autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV EGU" )
}

record(longout, "$(CAM):CC1:QueueSize")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))QUEUE_SIZE")
    field(PINI, "YES")
    info( autosaveFields, "DESC EGU" )
}

record(longin, "$(CAM):CC1:QueueSize_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))QUEUE_SIZE")
    field(FLNK, "$(CAM):CC1:QueueFreeLow")
    field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):CC1:QueueFreeLow") {
    field(CALC, "A*0.25")
    field(INPA, "$(CAM):CC1:QueueSize")
    field(OUT,  "$(CAM):CC1:QueueFree.LOW")
    field(FLNK, "$(CAM):CC1:QueueUseHIGH")
}

# Set a HIGH warning level for the input queue fill level to 75%
# of the full size of the queue
record(calcout, "$(CAM):CC1:QueueUseHIGH") {
   field(CALC, "A*0.75")
   field(INPA, "$(CAM):CC1:QueueSize")
   field(OUT,  "$(CAM):CC1:QueueUse.HIGH")
   field(FLNK, "$(CAM):CC1:QueueUseHIHI")
}

# Set a HIHI level for the input queue fill level to indicate an error
# (MAJOR alarm)  when it fills up to the full size of the queue (frames start dropping)
record(calcout, "$(CAM):CC1:QueueUseHIHI") {
   field(CALC, "A*1.0")
   field(INPA, "$(CAM):CC1:QueueSize")
   field(OUT,  "$(CAM):CC1:QueueUse.HIHI")
}

record(longin, "$(CAM):CC1:QueueFree")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))QUEUE_FREE")
    field(LLSV, "MAJOR")
    field(LSV,  "MINOR")
    field(LOLO, "0")
    field(HYST, "1")
    field(SCAN, "I/O Intr")
}

# Display the fill level on the plugins input queue
record(calc, "$(CAM):CC1:QueueUse") {
    field(CALC, "A-B")
    field(INPA, "$(CAM):CC1:QueueSize")
    field(INPB, "$(CAM):CC1:QueueFree CP")
    field(SCAN, "Passive")
    field(HHSV, "MAJOR")
    field(HSV,  "MINOR")
    field(HYST, "1")
}

record(longout, "$(CAM):CC1:NumThreads")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))NUM_THREADS")
    field(VAL,  "1")
    field(PINI, "YES")
    info(autosaveFields, "DESC VAL")
}

record(longin, "$(CAM):CC1:NumThreads_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))NUM_THREADS")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):CC1:MaxThreads_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))MAX_THREADS")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control output array sorting                     #
###################################################################
record(mbbo, "$(CAM):CC1:SortMode") {
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))SORT_MODE")
    field(ZRVL, "0")
    field(ZRST, "Unsorted")
    field(ONVL, "1")
    field(ONST, "Sorted")
}

record(mbbi, "$(CAM):CC1:SortMode_RBV") {
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))SORT_MODE")
    field(ZRVL, "0")
    field(ZRST, "Unsorted")
    field(ONVL, "1")
    field(ONST, "Sorted")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):CC1:SortTime") {
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))SORT_TIME")
    field(PREC, "3")
    field(VAL, "0.1")
}

record(ai, "$(CAM):CC1:SortTime_RBV") {
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))SORT_TIME")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):CC1:SortSize")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))SORT_SIZE")
    field(VAL,  "20")
    field(PINI, "YES")
}

record(longin, "$(CAM):CC1:SortSize_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))SORT_SIZE")
    field(FLNK, "$(CAM):CC1:SortFreeLow")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):CC1:SortFree") {
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))SORT_FREE")
    field(LLSV, "MAJOR")
    field(LSV,  "MINOR")
    field(LOLO, "0")
    field(HYST, "1")
    field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):CC1:SortFreeLow") {
    field(CALC, "A*0.25")
    field(INPA, "$(CAM):CC1:SortSize")
    field(OUT,  "$(CAM):CC1:SortFree.LOW")
}

record(longout, "$(CAM):CC1:DroppedOutputArrays")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))DROPPED_OUTPUT_ARRAYS")
    field(VAL,  "0")
}

record(longin, "$(CAM):CC1:DroppedOutputArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))DROPPED_OUTPUT_ARRAYS")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):CC1:DisorderedArrays")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))DISORDERED_ARRAYS")
    field(PINI, "YES")
}

record(longin, "$(CAM):CC1:DisorderedArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))DISORDERED_ARRAYS")
    field(SCAN, "I/O Intr")
}



###################################################################
#  The asynRecord is used for mainly for trace mask               # 
###################################################################
 
# Set ASYN_TRACEIO_HEX bit by default
record(asyn,"$(CAM):CC1:AsynIO")
{
    field(PORT, "CC1")
    field(TIB2,"1")
    info("ADType", "ADPlugin")
}


###################################################################
#  These records control the color mode                           #
#  These choices must agree with NDColorMode_t in NDArray.h       # 
###################################################################

record(mbbo, "$(CAM):CC1:ColorModeOut")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))COLOR_MODE_OUT")
   field(ZRST, "Mono")
   field(ZRVL, "0")
   field(ONST, "Bayer")
   field(ONVL, "1")
   field(TWST, "RGB1")
   field(TWVL, "2")
   field(THST, "RGB2")
   field(THVL, "3")
   field(FRST, "RGB3")
   field(FRVL, "4")
   field(FVST, "YUV444")
   field(FVVL, "5")
   field(SXST, "YUV422")
   field(SXVL, "6")
   field(SVST, "YUV421")
   field(SVVL, "7")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):CC1:ColorModeOut_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))COLOR_MODE_OUT")
   field(ZRST, "Mono")
   field(ZRVL, "0")
   field(ONST, "Bayer")
   field(ONVL, "1")
   field(TWST, "RGB1")
   field(TWVL, "2")
   field(THST, "RGB2")
   field(THVL, "3")
   field(FRST, "RGB3")
   field(FRVL, "4")
   field(FVST, "YUV444")
   field(FVVL, "5")
   field(SXST, "YUV422")
   field(SXVL, "6")
   field(SVST, "YUV421")
   field(SVVL, "7")
   field(SCAN, "I/O Intr")
}

record(mbbo, "$(CAM):CC1:FalseColor")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))FALSE_COLOR")
   field(ZRST, "None")
   field(ZRVL, "0")
   field(ONST, "Rainbow")
   field(ONVL, "1")
   field(TWST, "Iron")
   field(TWVL, "2")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):CC1:FalseColor_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(CC1,$(ADDR=0),$(TIMEOUT=1))FALSE_COLOR")
   field(ZRST, "None")
   field(ZRVL, "0")
   field(ONST, "Rainbow")
   field(ONVL, "1")
   field(TWST, "Iron")
   field(TWVL, "2")
   field(SCAN, "I/O Intr")
}
#=================================================================#
# Template file: NDColorConvert.template
# Database for the ColorConvert plugin
# Mark Rivers
# December 23, 2008

#=================================================================#
# Template file: NDPluginBase.template
# Database for NDPluginBase, i.e. records common to all plugins
# Mark Rivers
# April 25, 2008

#=================================================================#
# Template file: NDArrayBase.template
# Database for area detector control using asyn driver and standard asyn device support
# Mark Rivers
# March 9, 2008

###################################################################
#  This record contains the version of ADCore                     #
###################################################################

record(stringin, "$(CAM):CC2:ADCoreVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))ADCORE_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the version of the driver or plugin       #
###################################################################

record(stringin, "$(CAM):CC2:DriverVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))DRIVER_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the asyn port name of this detector       #
###################################################################

record(stringin, "$(CAM):CC2:PortName_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))PORT_NAME_SELF")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records contain basic information about the detector     # 
###################################################################

record(stringin, "$(CAM):CC2:Manufacturer_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))MANUFACTURER")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):CC2:Model_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))MODEL")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):CC2:SerialNumber_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))SERIAL_NUMBER")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):CC2:SDKVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))SDK_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):CC2:FirmwareVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))FIRMWARE_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control acquisition start and stop               #
###################################################################

record(bo, "$(CAM):CC2:Acquire") {
   field(DTYP, "asynInt32")
   field(OUT, "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))ACQUIRE")
   field(ZNAM, "Done")
   field(ONAM, "Acquire")
   field(VAL,  "0")
   field(FLNK, "$(CAM):CC2:SetAcquireBusy")
   info(asyn:READBACK, "1")
}

record(bi, "$(CAM):CC2:Acquire_RBV") {
   field(DTYP, "asynInt32")
   field(INP, "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))ACQUIRE")
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):CC2:SetAcquireBusy")
{
    field(INPA, "$(CAM):CC2:Acquire NPP")
    field(CALC, "A")
    field(OOPT, "Transition To Non-zero")
    field(OUT,  "$(CAM):CC2:AcquireBusy PP")
}

record(busy, "$(CAM):CC2:AcquireBusy") {
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(VAL,  "0")
}

record(bi, "$(CAM):CC2:AcquireBusyCB") {
   field(DTYP, "asynInt32")
   field(INP, "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))ACQUIRE_BUSY")
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):CC2:ClearAcquireBusy") {
    field(INPA, "$(CAM):CC2:AcquireBusyCB CP")
    field(CALC, "A")
    field(OOPT, "Transition To Zero")
    field(OUT,  "$(CAM):CC2:AcquireBusy PP")
}

record(bo, "$(CAM):CC2:WaitForPlugins") {
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT, "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))WAIT_FOR_PLUGINS")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(VAL,  "0")
}

###################################################################
#  These records are the array size and data type                 #
###################################################################
# The number of dimensions
record(longout, "$(CAM):CC2:NDimensions")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))ARRAY_NDIMENSIONS")
}

record(longin, "$(CAM):CC2:NDimensions_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))ARRAY_NDIMENSIONS")
    field(SCAN, "I/O Intr")
}

# The array dimensions waveform records
record(waveform, "$(CAM):CC2:Dimensions")
{
    field(DTYP, "asynInt32ArrayOut")
    field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))ARRAY_DIMENSIONS")
    field(FTVL, "LONG")
    field(NELM, "10")
    field(FLNK, "$(CAM):CC2:Dim0SA")
}

record(subArray, "$(CAM):CC2:Dim0SA")
{
    field(INP,  "$(CAM):CC2:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "0")
    field(FLNK, "$(CAM):CC2:ArraySize0")
}

record(longin, "$(CAM):CC2:ArraySize0")
{
    field(INP,  "$(CAM):CC2:Dim0SA")
    field(FLNK, "$(CAM):CC2:Dim1SA")
}

record(subArray, "$(CAM):CC2:Dim1SA")
{
    field(INP,  "$(CAM):CC2:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "1")
    field(FLNK, "$(CAM):CC2:ArraySize1")
}

record(longin, "$(CAM):CC2:ArraySize1")
{
    field(INP,  "$(CAM):CC2:Dim1SA")
    field(FLNK, "$(CAM):CC2:Dim2SA")
}

record(subArray, "$(CAM):CC2:Dim2SA")
{
    field(INP,  "$(CAM):CC2:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "2")
    field(FLNK, "$(CAM):CC2:ArraySize2")
}

record(longin, "$(CAM):CC2:ArraySize2")
{
    field(INP,  "$(CAM):CC2:Dim2SA")
    field(FLNK, "$(CAM):CC2:Dim3SA")
}

record(subArray, "$(CAM):CC2:Dim3SA")
{
    field(INP,  "$(CAM):CC2:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "3")
    field(FLNK, "$(CAM):CC2:ArraySize3")
}

record(longin, "$(CAM):CC2:ArraySize3")
{
    field(INP,  "$(CAM):CC2:Dim3SA")
    field(FLNK, "$(CAM):CC2:Dim4SA")
}

record(subArray, "$(CAM):CC2:Dim4SA")
{
    field(INP,  "$(CAM):CC2:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "4")
    field(FLNK, "$(CAM):CC2:ArraySize4")
}

record(longin, "$(CAM):CC2:ArraySize4")
{
    field(INP,  "$(CAM):CC2:Dim4SA")
    field(FLNK, "$(CAM):CC2:Dim5SA")
}

record(subArray, "$(CAM):CC2:Dim5SA")
{
    field(INP,  "$(CAM):CC2:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "5")
    field(FLNK, "$(CAM):CC2:ArraySize5")
}

record(longin, "$(CAM):CC2:ArraySize5")
{
    field(INP,  "$(CAM):CC2:Dim5SA")
    field(FLNK, "$(CAM):CC2:Dim6SA")
}

record(subArray, "$(CAM):CC2:Dim6SA")
{
    field(INP,  "$(CAM):CC2:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "6")
    field(FLNK, "$(CAM):CC2:ArraySize6")
}

record(longin, "$(CAM):CC2:ArraySize6")
{
    field(INP,  "$(CAM):CC2:Dim6SA")
    field(FLNK, "$(CAM):CC2:Dim7SA")
}

record(subArray, "$(CAM):CC2:Dim7SA")
{
    field(INP,  "$(CAM):CC2:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "7")
    field(FLNK, "$(CAM):CC2:ArraySize7")
}

record(longin, "$(CAM):CC2:ArraySize7")
{
    field(INP,  "$(CAM):CC2:Dim7SA")
    field(FLNK, "$(CAM):CC2:Dim8SA")
}

record(subArray, "$(CAM):CC2:Dim8SA")
{
    field(INP,  "$(CAM):CC2:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "8")
    field(FLNK, "$(CAM):CC2:ArraySize8")
}

record(longin, "$(CAM):CC2:ArraySize8")
{
    field(INP,  "$(CAM):CC2:Dim8SA")
    field(FLNK, "$(CAM):CC2:Dim9SA")
}

record(subArray, "$(CAM):CC2:Dim9SA")
{
    field(INP,  "$(CAM):CC2:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "9")
    field(FLNK, "$(CAM):CC2:ArraySize9")
}

record(longin, "$(CAM):CC2:ArraySize9")
{
    field(INP,  "$(CAM):CC2:Dim9SA")
}


record(waveform, "$(CAM):CC2:Dimensions_RBV")
{
    field(DTYP, "asynInt32ArrayIn")
    field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))ARRAY_DIMENSIONS")
    field(FTVL, "LONG")
    field(NELM, "10")
    field(FLNK, "$(CAM):CC2:Dim0SA_RBV")
    field(SCAN, "I/O Intr")
}

record(subArray, "$(CAM):CC2:Dim0SA_RBV")
{
    field(INP,  "$(CAM):CC2:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "0")
    field(FLNK, "$(CAM):CC2:ArraySize0_RBV")
}

record(longin, "$(CAM):CC2:ArraySize0_RBV")
{
    field(INP,  "$(CAM):CC2:Dim0SA_RBV")
    field(FLNK, "$(CAM):CC2:Dim1SA_RBV")
}

record(subArray, "$(CAM):CC2:Dim1SA_RBV")
{
    field(INP,  "$(CAM):CC2:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "1")
    field(FLNK, "$(CAM):CC2:ArraySize1_RBV")
}

record(longin, "$(CAM):CC2:ArraySize1_RBV")
{
    field(INP,  "$(CAM):CC2:Dim1SA_RBV")
    field(FLNK, "$(CAM):CC2:Dim2SA_RBV")
}

record(subArray, "$(CAM):CC2:Dim2SA_RBV")
{
    field(INP,  "$(CAM):CC2:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "2")
    field(FLNK, "$(CAM):CC2:ArraySize2_RBV")
}

record(longin, "$(CAM):CC2:ArraySize2_RBV")
{
    field(INP,  "$(CAM):CC2:Dim2SA_RBV")
    field(FLNK, "$(CAM):CC2:Dim3SA_RBV")
}

record(subArray, "$(CAM):CC2:Dim3SA_RBV")
{
    field(INP,  "$(CAM):CC2:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "3")
    field(FLNK, "$(CAM):CC2:ArraySize3_RBV")
}

record(longin, "$(CAM):CC2:ArraySize3_RBV")
{
    field(INP,  "$(CAM):CC2:Dim3SA_RBV")
    field(FLNK, "$(CAM):CC2:Dim4SA_RBV")
}

record(subArray, "$(CAM):CC2:Dim4SA_RBV")
{
    field(INP,  "$(CAM):CC2:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "4")
    field(FLNK, "$(CAM):CC2:ArraySize4_RBV")
}

record(longin, "$(CAM):CC2:ArraySize4_RBV")
{
    field(INP,  "$(CAM):CC2:Dim4SA_RBV")
    field(FLNK, "$(CAM):CC2:Dim5SA_RBV")
}

record(subArray, "$(CAM):CC2:Dim5SA_RBV")
{
    field(INP,  "$(CAM):CC2:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "5")
    field(FLNK, "$(CAM):CC2:ArraySize5_RBV")
}

record(longin, "$(CAM):CC2:ArraySize5_RBV")
{
    field(INP,  "$(CAM):CC2:Dim5SA_RBV")
    field(FLNK, "$(CAM):CC2:Dim6SA_RBV")
}

record(subArray, "$(CAM):CC2:Dim6SA_RBV")
{
    field(INP,  "$(CAM):CC2:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "6")
    field(FLNK, "$(CAM):CC2:ArraySize6_RBV")
}

record(longin, "$(CAM):CC2:ArraySize6_RBV")
{
    field(INP,  "$(CAM):CC2:Dim6SA_RBV")
    field(FLNK, "$(CAM):CC2:Dim7SA_RBV")
}

record(subArray, "$(CAM):CC2:Dim7SA_RBV")
{
    field(INP,  "$(CAM):CC2:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "7")
    field(FLNK, "$(CAM):CC2:ArraySize7_RBV")
}

record(longin, "$(CAM):CC2:ArraySize7_RBV")
{
    field(INP,  "$(CAM):CC2:Dim7SA_RBV")
    field(FLNK, "$(CAM):CC2:Dim8SA_RBV")
}

record(subArray, "$(CAM):CC2:Dim8SA_RBV")
{
    field(INP,  "$(CAM):CC2:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "8")
    field(FLNK, "$(CAM):CC2:ArraySize8_RBV")
}

record(longin, "$(CAM):CC2:ArraySize8_RBV")
{
    field(INP,  "$(CAM):CC2:Dim8SA_RBV")
    field(FLNK, "$(CAM):CC2:Dim9SA_RBV")
}

record(subArray, "$(CAM):CC2:Dim9SA_RBV")
{
    field(INP,  "$(CAM):CC2:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "9")
    field(FLNK, "$(CAM):CC2:ArraySize9_RBV")
}

record(longin, "$(CAM):CC2:ArraySize9_RBV")
{
    field(INP,  "$(CAM):CC2:Dim9SA_RBV")
}


record(mbbi, "$(CAM):CC2:BayerPattern_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))BAYER_PATTERN")
   field(ZRST, "RGGB")
   field(ZRVL, "0")
   field(ONST, "GBRG")
   field(ONVL, "1")
   field(TWST, "GRBG")
   field(TWVL, "2")
   field(THST, "BGGR")
   field(THVL, "3")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):CC2:ArraySizeX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_X")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):CC2:ArraySizeY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_Y")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):CC2:ArraySizeZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_Z")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):CC2:ArraySize_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records have information on the compression              # 
###################################################################
record(stringin, "$(CAM):CC2:Codec_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))CODEC")
   field(VAL,  "")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):CC2:CompressedSize_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))COMPRESSED_SIZE")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the data type                            # 
###################################################################

record(mbbo, "$(CAM):CC2:DataType")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))DATA_TYPE")
   field(ZRST, "Int8")
   field(ZRVL, "0")
   field(ONST, "UInt8")
   field(ONVL, "1")
   field(TWST, "Int16")
   field(TWVL, "2")
   field(THST, "UInt16")
   field(THVL, "3")
   field(FRST, "Int32")
   field(FRVL, "4")
   field(FVST, "UInt32")
   field(FVVL, "5")
   field(SXST, "Int64")
   field(SXVL, "6")
   field(SVST, "UInt64")
   field(SVVL, "7")
   field(EIST, "Float32")
   field(EIVL, "8")
   field(NIST, "Float64")
   field(NIVL, "9")
   field(VAL,  "0")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):CC2:DataType_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))DATA_TYPE")
   field(ZRST, "Int8")
   field(ZRVL, "0")
   field(ONST, "UInt8")
   field(ONVL, "1")
   field(TWST, "Int16")
   field(TWVL, "2")
   field(THST, "UInt16")
   field(THVL, "3")
   field(FRST, "Int32")
   field(FRVL, "4")
   field(FVST, "UInt32")
   field(FVVL, "5")
   field(SXST, "Int64")
   field(SXVL, "6")
   field(SVST, "UInt64")
   field(SVVL, "7")
   field(EIST, "Float32")
   field(EIVL, "8")
   field(NIST, "Float64")
   field(NIVL, "9")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):CC2:BitsPerPixel_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))BITS_PER_PIXEL")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the color mode                           #
#  These choices must agree with NDColorMode_t in NDArray.h       # 
###################################################################

record(mbbo, "$(CAM):CC2:ColorMode")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))COLOR_MODE")
   field(ZRST, "Mono")
   field(ZRVL, "0")
   field(ONST, "Bayer")
   field(ONVL, "1")
   field(TWST, "RGB1")
   field(TWVL, "2")
   field(THST, "RGB2")
   field(THVL, "3")
   field(FRST, "RGB3")
   field(FRVL, "4")
   field(FVST, "YUV444")
   field(FVVL, "5")
   field(SXST, "YUV422")
   field(SXVL, "6")
   field(SVST, "YUV421")
   field(SVVL, "7")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):CC2:ColorMode_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))COLOR_MODE")
   field(ZRST, "Mono")
   field(ZRVL, "0")
   field(ONST, "Bayer")
   field(ONVL, "1")
   field(TWST, "RGB1")
   field(TWVL, "2")
   field(THST, "RGB2")
   field(THVL, "3")
   field(FRST, "RGB3")
   field(FRVL, "4")
   field(FVST, "YUV444")
   field(FVVL, "5")
   field(SXST, "YUV422")
   field(SXVL, "6")
   field(SVST, "YUV421")
   field(SVVL, "7")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records are the uniqueId and time stamps of the array     #
###################################################################
record(longin, "$(CAM):CC2:UniqueId_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))UNIQUE_ID")
    field(SCAN, "I/O Intr")
}

record(ai, "$(CAM):CC2:TimeStamp_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))TIME_STAMP")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):CC2:EpicsTSSec_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))EPICS_TS_SEC")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):CC2:EpicsTSNsec_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))EPICS_TS_NSEC")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records provide statistics on array callbacks and        #
#  array callback rates                                           # 
###################################################################
record(longout, "$(CAM):CC2:ArrayCounter")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))ARRAY_COUNTER")
}

record(longin, "$(CAM):CC2:ArrayCounter_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))ARRAY_COUNTER")
    field(SCAN, "I/O Intr")
    field(TSE,  "-2")
    field(LOW,  "0" )
    field(LSV,  "MINOR" )
    info(autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV TSE")
}

# Updated rate calculation to use a smoothing factor w/ guard against negative values
# 0 rate sets alarm state to MINOR
record(calc, "$(CAM):CC2:ArrayRate_RBV")
{
    field(INPA, "$(CAM):CC2:ArrayRate_RBV.LB NPP NMS")   # Previous counter (Last B value)
    field(INPB, "$(CAM):CC2:ArrayCounter_RBV NPP NMS")   # Current counter value
    field(INPC, "1.0")                                # Delta time in seconds
    field(INPD, "$(CAM):CC2:ArrayRate_RBV.VAL NPP NMS")  # Previous rate
    field(INPE, "0.0")                 # Smoothing factor
    field(CALC, "(D*E)/C+MAX(0,B-A)*(1-E)/C")
    field(PREC, "2" )
    field(EGU,  "Hz" )
    field(SCAN, "1 second")
    field(LOW,  "0")
    field(LSV,  "MINOR")
    field(ADEL, "0.1")
    info(autosaveFields, "ADEL DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV MDEL PREC C E SCAN EGU")
}

###################################################################
#  These records control NDArray callacks                         # 
###################################################################
record(bo, "$(CAM):CC2:ArrayCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))ARRAY_CALLBACKS")
    field(ZNAM, "Disable")
    field(ZSV,  "MINOR")
    field(ONAM, "Enable")
    field(OSV,  "NO_ALARM")
    field(VAL, "1")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):CC2:ArrayCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))ARRAY_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ZSV,  "MINOR")
    field(ONAM, "Enabled")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains macro definitions for the attributes      # 
###################################################################

record(waveform, "$(CAM):CC2:NDAttributesMacros")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_MACROS")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

###################################################################
#  This record is the name of a file defining attributes          # 
###################################################################

record(waveform, "$(CAM):CC2:NDAttributesFile")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_FILE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

###################################################################
#  This record defines the status of reading attributes file      # 
###################################################################

record(mbbi, "$(CAM):CC2:NDAttributesStatus")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_STATUS")
    field(ZRVL, "0")
    field(ZRST, "Attributes file OK")
    field(ZRSV, "NO_ALARM")
    field(ONVL, "1")
    field(ONST, "File not found")
    field(ONSV, "MINOR")
    field(TWVL, "2")
    field(TWST, "XML syntax error")
    field(TWSV, "MAJOR")
    field(THVL, "3")
    field(THST, "Macro substitution error")
    field(THSV, "MAJOR")
    field(SCAN, "I/O Intr")
}

###################################################################
#  Status of NDArrayPool - number of buffers, memory used etc.    # 
###################################################################

record(ai, "$(CAM):CC2:PoolMaxMem")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))POOL_MAX_MEMORY")
   field(PREC, "1")
   field(EGU,  "MB")
   field(SCAN, "Passive")
   field(PINI, "YES")
}

record(ai, "$(CAM):CC2:PoolUsedMem")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))POOL_USED_MEMORY")
   field(PREC, "1")
   field(EGU,  "MB")
   field(SCAN, "1 second")
   field(FLNK, "$(CAM):CC2:PoolAllocBuffers")
   info(autosaveFields, "SCAN")
}

record(longin, "$(CAM):CC2:PoolAllocBuffers")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))POOL_ALLOC_BUFFERS")
   field(FLNK, "$(CAM):CC2:PoolFreeBuffers")
}

record(longin, "$(CAM):CC2:PoolFreeBuffers")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))POOL_FREE_BUFFERS")
   field(FLNK, "$(CAM):CC2:PoolUsedBuffers")
}

record(calc, "$(CAM):CC2:PoolUsedBuffers")
{
    field(INPA, "$(CAM):CC2:PoolAllocBuffers NPP MS")
    field(INPB, "$(CAM):CC2:PoolFreeBuffers NPP MS")
    field(CALC, "A-B")
}

record(bo, "$(CAM):CC2:EmptyFreeList")
{
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))POOL_EMPTY_FREELIST")
}

record(longin, "$(CAM):CC2:NumQueuedArrays")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))NUM_QUEUED_ARRAYS")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the type of plugin                        #
###################################################################

record(stringin, "$(CAM):CC2:PluginType_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))PLUGIN_TYPE")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the connection of the server to          #
#  an NDArray driver port and address                             #
###################################################################
# Array port name
record(stringout, "$(CAM):CC2:NDArrayPort")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(OUT,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))NDARRAY_PORT")
    field(VAL,  "$(CAM_PORT)")
    info(autosaveFields, "DESC VAL")
}

record(stringin, "$(CAM):CC2:NDArrayPort_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))NDARRAY_PORT")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):CC2:NDArrayAddress")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))NDARRAY_ADDR")
    field(VAL,  "$(NDARRAY_ADDR=0)")
    info(autosaveFields, "DESC VAL")
}

record(longin, "$(CAM):CC2:NDArrayAddress_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))NDARRAY_ADDR")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control whether callbacks are enabled and        #
#  minimum time between callbacks                                 #
###################################################################
record(bo, "$(CAM):CC2:EnableCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))ENABLE_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    field(VAL,  "0")
    info(autosaveFields, "DESC VAL")
}

record(bi, "$(CAM):CC2:EnableCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))ENABLE_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    field(ZSV,  "MINOR")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):CC2:MinCallbackTime")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))MIN_CALLBACK_TIME")
    field(EGU,  "s")
    field(PREC, "3")
    field(VAL,  "0.0")
    field(DRVL, "0")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):CC2:MinCallbackTime_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))MIN_CALLBACK_TIME")
    field(EGU,  "s")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):CC2:MaxArrayRate")
{
    field(DTYP, "Soft Channel")
    field(OUT,  "$(CAM):CC2:MaxArrayRate_COUT PP")
    field(EGU,  "Hz")
    field(PREC, "3")
    field(VAL,  "0.0")
    info(autosaveFields, "VAL")
}

record(calcout, "$(CAM):CC2:MaxArrayRate_COUT")
{
    field(INPA, "$(CAM):CC2:MaxArrayRate")
    field(CALC, "A=0?0:1.0/A")
    field(OUT,  "$(CAM):CC2:MinCallbackTime PP")
}

record(calc, "$(CAM):CC2:MaxArrayRate_RBV")
{
    field(INPA, "$(CAM):CC2:MinCallbackTime_RBV CP")
    field(CALC, "A=0?0:1.0/A")
    field(EGU,  "Hz")
    field(PREC, "3")
    field(SCAN, "Passive")
}

record(ao, "$(CAM):CC2:MaxByteRate")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))MAX_BYTE_RATE")
    field(EGU,  "s")
    field(PREC, "3")
    field(VAL,  "0.0")
    field(DRVL, "0")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):CC2:MaxByteRate_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))MAX_BYTE_RATE")
    field(EGU,  "s")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the last execution time of the plugin     #
###################################################################
record(ai, "$(CAM):CC2:ExecutionTime_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))EXECUTION_TIME")
    field(EGU,  "ms")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record requests that the plugin execute again with the    #
#  same NDArray                                                   #
###################################################################
record(bo, "$(CAM):CC2:ProcessPlugin")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))PROCESS_PLUGIN")
    field(VAL,  "1")
}

###################################################################
#  These records control whether callbacks block or not           #
###################################################################
record(bo, "$(CAM):CC2:BlockingCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))BLOCKING_CALLBACKS")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(VAL,  "0")
    info(autosaveFields, "DESC ZSV OSV VAL")
}

record(bi, "$(CAM):CC2:BlockingCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))BLOCKING_CALLBACKS")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(ZSV,  "NO_ALARM")
    field(OSV,  "MINOR")
    field(SCAN, "I/O Intr")
    info( autosaveFields, "DESC ZSV OSV" )
}


record(longout, "$(CAM):CC2:DroppedArrays")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))DROPPED_ARRAYS")
    field(VAL,  "0")
    info( autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV EGU" )
}

record(longin, "$(CAM):CC2:DroppedArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))DROPPED_ARRAYS")
    field(SCAN, "I/O Intr")
    field(HIGH, "1")
    field(HSV,  "MINOR")
    info( autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV EGU" )
}

record(longout, "$(CAM):CC2:QueueSize")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))QUEUE_SIZE")
    field(PINI, "YES")
    info( autosaveFields, "DESC EGU" )
}

record(longin, "$(CAM):CC2:QueueSize_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))QUEUE_SIZE")
    field(FLNK, "$(CAM):CC2:QueueFreeLow")
    field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):CC2:QueueFreeLow") {
    field(CALC, "A*0.25")
    field(INPA, "$(CAM):CC2:QueueSize")
    field(OUT,  "$(CAM):CC2:QueueFree.LOW")
    field(FLNK, "$(CAM):CC2:QueueUseHIGH")
}

# Set a HIGH warning level for the input queue fill level to 75%
# of the full size of the queue
record(calcout, "$(CAM):CC2:QueueUseHIGH") {
   field(CALC, "A*0.75")
   field(INPA, "$(CAM):CC2:QueueSize")
   field(OUT,  "$(CAM):CC2:QueueUse.HIGH")
   field(FLNK, "$(CAM):CC2:QueueUseHIHI")
}

# Set a HIHI level for the input queue fill level to indicate an error
# (MAJOR alarm)  when it fills up to the full size of the queue (frames start dropping)
record(calcout, "$(CAM):CC2:QueueUseHIHI") {
   field(CALC, "A*1.0")
   field(INPA, "$(CAM):CC2:QueueSize")
   field(OUT,  "$(CAM):CC2:QueueUse.HIHI")
}

record(longin, "$(CAM):CC2:QueueFree")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))QUEUE_FREE")
    field(LLSV, "MAJOR")
    field(LSV,  "MINOR")
    field(LOLO, "0")
    field(HYST, "1")
    field(SCAN, "I/O Intr")
}

# Display the fill level on the plugins input queue
record(calc, "$(CAM):CC2:QueueUse") {
    field(CALC, "A-B")
    field(INPA, "$(CAM):CC2:QueueSize")
    field(INPB, "$(CAM):CC2:QueueFree CP")
    field(SCAN, "Passive")
    field(HHSV, "MAJOR")
    field(HSV,  "MINOR")
    field(HYST, "1")
}

record(longout, "$(CAM):CC2:NumThreads")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))NUM_THREADS")
    field(VAL,  "1")
    field(PINI, "YES")
    info(autosaveFields, "DESC VAL")
}

record(longin, "$(CAM):CC2:NumThreads_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))NUM_THREADS")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):CC2:MaxThreads_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))MAX_THREADS")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control output array sorting                     #
###################################################################
record(mbbo, "$(CAM):CC2:SortMode") {
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))SORT_MODE")
    field(ZRVL, "0")
    field(ZRST, "Unsorted")
    field(ONVL, "1")
    field(ONST, "Sorted")
}

record(mbbi, "$(CAM):CC2:SortMode_RBV") {
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))SORT_MODE")
    field(ZRVL, "0")
    field(ZRST, "Unsorted")
    field(ONVL, "1")
    field(ONST, "Sorted")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):CC2:SortTime") {
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))SORT_TIME")
    field(PREC, "3")
    field(VAL, "0.1")
}

record(ai, "$(CAM):CC2:SortTime_RBV") {
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))SORT_TIME")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):CC2:SortSize")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))SORT_SIZE")
    field(VAL,  "20")
    field(PINI, "YES")
}

record(longin, "$(CAM):CC2:SortSize_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))SORT_SIZE")
    field(FLNK, "$(CAM):CC2:SortFreeLow")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):CC2:SortFree") {
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))SORT_FREE")
    field(LLSV, "MAJOR")
    field(LSV,  "MINOR")
    field(LOLO, "0")
    field(HYST, "1")
    field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):CC2:SortFreeLow") {
    field(CALC, "A*0.25")
    field(INPA, "$(CAM):CC2:SortSize")
    field(OUT,  "$(CAM):CC2:SortFree.LOW")
}

record(longout, "$(CAM):CC2:DroppedOutputArrays")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))DROPPED_OUTPUT_ARRAYS")
    field(VAL,  "0")
}

record(longin, "$(CAM):CC2:DroppedOutputArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))DROPPED_OUTPUT_ARRAYS")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):CC2:DisorderedArrays")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))DISORDERED_ARRAYS")
    field(PINI, "YES")
}

record(longin, "$(CAM):CC2:DisorderedArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))DISORDERED_ARRAYS")
    field(SCAN, "I/O Intr")
}



###################################################################
#  The asynRecord is used for mainly for trace mask               # 
###################################################################
 
# Set ASYN_TRACEIO_HEX bit by default
record(asyn,"$(CAM):CC2:AsynIO")
{
    field(PORT, "CC2")
    field(TIB2,"1")
    info("ADType", "ADPlugin")
}


###################################################################
#  These records control the color mode                           #
#  These choices must agree with NDColorMode_t in NDArray.h       # 
###################################################################

record(mbbo, "$(CAM):CC2:ColorModeOut")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))COLOR_MODE_OUT")
   field(ZRST, "Mono")
   field(ZRVL, "0")
   field(ONST, "Bayer")
   field(ONVL, "1")
   field(TWST, "RGB1")
   field(TWVL, "2")
   field(THST, "RGB2")
   field(THVL, "3")
   field(FRST, "RGB3")
   field(FRVL, "4")
   field(FVST, "YUV444")
   field(FVVL, "5")
   field(SXST, "YUV422")
   field(SXVL, "6")
   field(SVST, "YUV421")
   field(SVVL, "7")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):CC2:ColorModeOut_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))COLOR_MODE_OUT")
   field(ZRST, "Mono")
   field(ZRVL, "0")
   field(ONST, "Bayer")
   field(ONVL, "1")
   field(TWST, "RGB1")
   field(TWVL, "2")
   field(THST, "RGB2")
   field(THVL, "3")
   field(FRST, "RGB3")
   field(FRVL, "4")
   field(FVST, "YUV444")
   field(FVVL, "5")
   field(SXST, "YUV422")
   field(SXVL, "6")
   field(SVST, "YUV421")
   field(SVVL, "7")
   field(SCAN, "I/O Intr")
}

record(mbbo, "$(CAM):CC2:FalseColor")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))FALSE_COLOR")
   field(ZRST, "None")
   field(ZRVL, "0")
   field(ONST, "Rainbow")
   field(ONVL, "1")
   field(TWST, "Iron")
   field(TWVL, "2")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):CC2:FalseColor_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(CC2,$(ADDR=0),$(TIMEOUT=1))FALSE_COLOR")
   field(ZRST, "None")
   field(ZRVL, "0")
   field(ONST, "Rainbow")
   field(ONVL, "1")
   field(TWST, "Iron")
   field(TWVL, "2")
   field(SCAN, "I/O Intr")
}
#=================================================================#
# Template file: NDFile.template
# Database for NDFile driver, which saves files for NDArray data.
# Mark Rivers
# April 7, 2008

###################################################################
#  These records control file I/O                                 # 
###################################################################

# File path.
record(waveform, "$(CAM):HDF51:FilePath")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))FILE_PATH")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

record(waveform, "$(CAM):HDF51:FilePath_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))FILE_PATH")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

record(bi, "$(CAM):HDF51:FilePathExists_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))FILE_PATH_EXISTS")
    field(ZNAM, "No")
    field(ZSV,  "MAJOR")
    field(ONAM, "Yes")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):HDF51:CreateDirectory")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))CREATE_DIR")
    field(VAL,  "0" )
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):HDF51:CreateDirectory_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))CREATE_DIR")
    field(VAL,  "")
    field(SCAN, "I/O Intr")
}

# Filename
record(waveform, "$(CAM):HDF51:FileName")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))FILE_NAME")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

record(waveform, "$(CAM):HDF51:FileName_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))FILE_NAME")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):HDF51:FileNumber")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))FILE_NUMBER")
    field(VAL,  "1")
    info(asyn:READBACK, "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):HDF51:FileNumber_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))FILE_NUMBER")
    field(SCAN, "I/O Intr")
}

# Autoincrement flag
record(bo, "$(CAM):HDF51:AutoIncrement")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))AUTO_INCREMENT")
    field(VAL,  "1")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):HDF51:AutoIncrement_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))AUTO_INCREMENT")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(SCAN, "I/O Intr")
}

# File template
record(waveform, "$(CAM):HDF51:FileTemplate")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))FILE_TEMPLATE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

record(waveform, "$(CAM):HDF51:FileTemplate_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))FILE_TEMPLATE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

# Full filename, including path
record(waveform, "$(CAM):HDF51:FullFileName_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))FULL_FILE_NAME")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

# Autosave flag
record(bo, "$(CAM):HDF51:AutoSave")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))AUTO_SAVE")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):HDF51:AutoSave_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))AUTO_SAVE")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(SCAN, "I/O Intr")
}

# Write file
record(busy, "$(CAM):HDF51:WriteFile")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))WRITE_FILE")
    field(ZNAM, "Done")
    field(ONAM, "Write")
}

record(bi, "$(CAM):HDF51:WriteFile_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))WRITE_FILE")
    field(ZNAM, "Done")
    field(ZSV,  "NO_ALARM")
    field(ONAM, "Writing")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}


# Read file
record(busy, "$(CAM):HDF51:ReadFile")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))READ_FILE")
    field(ZNAM, "Done")
    field(ONAM, "Read")
}

record(bi, "$(CAM):HDF51:ReadFile_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))READ_FILE")
    field(ZNAM, "Done")
    field(ZSV,  "NO_ALARM")
    field(ONAM, "Reading")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

# File data format 
record(mbbo, "$(CAM):HDF51:FileFormat")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))FILE_FORMAT")
    field(VAL,  "0")
    field(ZRST, "Undefined")
    field(ZRVL, "0")
    field(ONST, "Invalid")
    field(ONVL, "1")
    info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):HDF51:FileFormat_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))FILE_FORMAT")
    field(ZRST, "netCDF")
    field(ZRVL, "0")
    field(ONST, "Undefined")
    field(ONVL, "1")
    field(SCAN, "I/O Intr")
}

# File save mode 
record(mbbo, "$(CAM):HDF51:FileWriteMode")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))WRITE_MODE")
    field(VAL,  "0")
    field(ZRST, "Single")
    field(ZRVL, "0")
    field(ONST, "Capture")
    field(ONVL, "1")
    field(TWST, "Stream")
    field(TWVL, "2")
    info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):HDF51:FileWriteMode_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))WRITE_MODE")
    field(ZRST, "Single")
    field(ZRVL, "0")
    field(ONST, "Capture")
    field(ONVL, "1")
    field(TWST, "Stream")
    field(TWVL, "2")
    field(SCAN, "I/O Intr")
}

# Capture data
record(busy, "$(CAM):HDF51:Capture")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))CAPTURE")
    field(ZNAM, "Done")
    field(ONAM, "Capture")
    field(ZSV,  "NO_ALARM")
    field(OSV,  "NO_ALARM")
    info(autosaveFields, "OSV ZSV")
}

record(bi, "$(CAM):HDF51:Capture_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))CAPTURE")
    field(ZNAM, "Done")
    field(ZSV,  "NO_ALARM")
    field(ONAM, "Capturing")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):HDF51:NumCapture")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))NUM_CAPTURE")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):HDF51:NumCapture_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))NUM_CAPTURE")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):HDF51:NumCaptured_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))NUM_CAPTURED")
    field(SCAN, "I/O Intr")
}

# Delete driver file flag
record(bo, "$(CAM):HDF51:DeleteDriverFile")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))DELETE_DRIVER_FILE")
    field(VAL,  "0")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):HDF51:DeleteDriverFile_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))DELETE_DRIVER_FILE")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(SCAN, "I/O Intr")
}

record(bi, "$(CAM):HDF51:WriteStatus")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))WRITE_STATUS")
    field(ZNAM, "Write OK")
    field(ZSV,  "NO_ALARM")
    field(ONAM, "Write error")
    field(OSV,  "MAJOR")
    field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):HDF51:WriteMessage")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))WRITE_MESSAGE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):HDF51:LazyOpen")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))FILE_LAZY_OPEN")
    field(VAL,  "0")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):HDF51:LazyOpen_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))FILE_LAZY_OPEN")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(SCAN, "I/O Intr")
}

record(stringout, "$(CAM):HDF51:TempSuffix")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))FILE_TEMP_SUFFIX")
    field(VAL,  "")
}

record(stringin, "$(CAM):HDF51:TempSuffix_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))FILE_TEMP_SUFFIX")
    field(VAL,  "")
    field(SCAN, "I/O Intr")
}
# Database to add automatic reset of FileNumber on changes
# to FilePath, FileTemplate, or FileName

# Add FLNKS to ResetFileNumber
record(waveform, "$(CAM):HDF51:FilePath")
{
    field(FLNK, "$(CAM):HDF51:ResetFileNumber" )
}
record(waveform, "$(CAM):HDF51:FileName")
{
    field(FLNK, "$(CAM):HDF51:ResetFileNumber" )
}
record(waveform, "$(CAM):HDF51:FileTemplate")
{
    field(FLNK, "$(CAM):HDF51:ResetFileNumber" )
}

# AutoFileNumberReset flag
record(bo, "$(CAM):HDF51:AutoFileNumberReset")
{
    field(PINI, "YES")
    field(VAL,  "1")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info( autosaveFields, "VAL" )
}

record(calcout, "$(CAM):HDF51:ResetFileNumber")
{
    field(INPA, "$(CAM):HDF51:AutoFileNumberReset NPP")
    field(CALC, "A")
    field(OOPT, "When Non-zero" )
    field(OUT,  "$(CAM):HDF51:FileNumber PP")
}
#=================================================================#
# Template file: NDFileHDF5.template
# Database for NDFileHDF5 driver, which saves files for NDArray data.

# Macros:
# % macro, P, Device Prefix
# % macro, R, Device Suffix
# % macro, PORT, Asyn Port name

# This associates the template with an edm screen
# % gui, HDF51, edmtab, NDFileHDF5.edl, P=$(CAM):,R=HDF51:

#=================================================================#
# Template file: NDFile.template
# Database for NDFile driver, which saves files for NDArray data.
# Mark Rivers
# April 7, 2008

###################################################################
#  These records control file I/O                                 # 
###################################################################

# File path.
record(waveform, "$(CAM):HDF51:FilePath")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))FILE_PATH")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

record(waveform, "$(CAM):HDF51:FilePath_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))FILE_PATH")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

record(bi, "$(CAM):HDF51:FilePathExists_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))FILE_PATH_EXISTS")
    field(ZNAM, "No")
    field(ZSV,  "MAJOR")
    field(ONAM, "Yes")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):HDF51:CreateDirectory")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))CREATE_DIR")
    field(VAL,  "0" )
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):HDF51:CreateDirectory_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))CREATE_DIR")
    field(VAL,  "")
    field(SCAN, "I/O Intr")
}

# Filename
record(waveform, "$(CAM):HDF51:FileName")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))FILE_NAME")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

record(waveform, "$(CAM):HDF51:FileName_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))FILE_NAME")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):HDF51:FileNumber")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))FILE_NUMBER")
    field(VAL,  "1")
    info(asyn:READBACK, "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):HDF51:FileNumber_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))FILE_NUMBER")
    field(SCAN, "I/O Intr")
}

# Autoincrement flag
record(bo, "$(CAM):HDF51:AutoIncrement")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))AUTO_INCREMENT")
    field(VAL,  "1")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):HDF51:AutoIncrement_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))AUTO_INCREMENT")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(SCAN, "I/O Intr")
}

# File template
record(waveform, "$(CAM):HDF51:FileTemplate")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))FILE_TEMPLATE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

record(waveform, "$(CAM):HDF51:FileTemplate_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))FILE_TEMPLATE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

# Full filename, including path
record(waveform, "$(CAM):HDF51:FullFileName_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))FULL_FILE_NAME")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

# Autosave flag
record(bo, "$(CAM):HDF51:AutoSave")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))AUTO_SAVE")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):HDF51:AutoSave_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))AUTO_SAVE")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(SCAN, "I/O Intr")
}

# Write file
record(busy, "$(CAM):HDF51:WriteFile")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))WRITE_FILE")
    field(ZNAM, "Done")
    field(ONAM, "Write")
}

record(bi, "$(CAM):HDF51:WriteFile_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))WRITE_FILE")
    field(ZNAM, "Done")
    field(ZSV,  "NO_ALARM")
    field(ONAM, "Writing")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}


# Read file
record(busy, "$(CAM):HDF51:ReadFile")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))READ_FILE")
    field(ZNAM, "Done")
    field(ONAM, "Read")
}

record(bi, "$(CAM):HDF51:ReadFile_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))READ_FILE")
    field(ZNAM, "Done")
    field(ZSV,  "NO_ALARM")
    field(ONAM, "Reading")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

# File data format 
record(mbbo, "$(CAM):HDF51:FileFormat")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))FILE_FORMAT")
    field(VAL,  "0")
    field(ZRST, "Undefined")
    field(ZRVL, "0")
    field(ONST, "Invalid")
    field(ONVL, "1")
    info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):HDF51:FileFormat_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))FILE_FORMAT")
    field(ZRST, "netCDF")
    field(ZRVL, "0")
    field(ONST, "Undefined")
    field(ONVL, "1")
    field(SCAN, "I/O Intr")
}

# File save mode 
record(mbbo, "$(CAM):HDF51:FileWriteMode")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))WRITE_MODE")
    field(VAL,  "0")
    field(ZRST, "Single")
    field(ZRVL, "0")
    field(ONST, "Capture")
    field(ONVL, "1")
    field(TWST, "Stream")
    field(TWVL, "2")
    info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):HDF51:FileWriteMode_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))WRITE_MODE")
    field(ZRST, "Single")
    field(ZRVL, "0")
    field(ONST, "Capture")
    field(ONVL, "1")
    field(TWST, "Stream")
    field(TWVL, "2")
    field(SCAN, "I/O Intr")
}

# Capture data
record(busy, "$(CAM):HDF51:Capture")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))CAPTURE")
    field(ZNAM, "Done")
    field(ONAM, "Capture")
    field(ZSV,  "NO_ALARM")
    field(OSV,  "NO_ALARM")
    info(autosaveFields, "OSV ZSV")
}

record(bi, "$(CAM):HDF51:Capture_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))CAPTURE")
    field(ZNAM, "Done")
    field(ZSV,  "NO_ALARM")
    field(ONAM, "Capturing")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):HDF51:NumCapture")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))NUM_CAPTURE")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):HDF51:NumCapture_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))NUM_CAPTURE")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):HDF51:NumCaptured_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))NUM_CAPTURED")
    field(SCAN, "I/O Intr")
}

# Delete driver file flag
record(bo, "$(CAM):HDF51:DeleteDriverFile")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))DELETE_DRIVER_FILE")
    field(VAL,  "0")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):HDF51:DeleteDriverFile_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))DELETE_DRIVER_FILE")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(SCAN, "I/O Intr")
}

record(bi, "$(CAM):HDF51:WriteStatus")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))WRITE_STATUS")
    field(ZNAM, "Write OK")
    field(ZSV,  "NO_ALARM")
    field(ONAM, "Write error")
    field(OSV,  "MAJOR")
    field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):HDF51:WriteMessage")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))WRITE_MESSAGE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):HDF51:LazyOpen")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))FILE_LAZY_OPEN")
    field(VAL,  "0")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):HDF51:LazyOpen_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))FILE_LAZY_OPEN")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(SCAN, "I/O Intr")
}

record(stringout, "$(CAM):HDF51:TempSuffix")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))FILE_TEMP_SUFFIX")
    field(VAL,  "")
}

record(stringin, "$(CAM):HDF51:TempSuffix_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))FILE_TEMP_SUFFIX")
    field(VAL,  "")
    field(SCAN, "I/O Intr")
}
#=================================================================#
# Template file: NDPluginBase.template
# Database for NDPluginBase, i.e. records common to all plugins
# Mark Rivers
# April 25, 2008

#=================================================================#
# Template file: NDArrayBase.template
# Database for area detector control using asyn driver and standard asyn device support
# Mark Rivers
# March 9, 2008

###################################################################
#  This record contains the version of ADCore                     #
###################################################################

record(stringin, "$(CAM):HDF51:ADCoreVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))ADCORE_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the version of the driver or plugin       #
###################################################################

record(stringin, "$(CAM):HDF51:DriverVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))DRIVER_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the asyn port name of this detector       #
###################################################################

record(stringin, "$(CAM):HDF51:PortName_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))PORT_NAME_SELF")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records contain basic information about the detector     # 
###################################################################

record(stringin, "$(CAM):HDF51:Manufacturer_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))MANUFACTURER")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):HDF51:Model_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))MODEL")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):HDF51:SerialNumber_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))SERIAL_NUMBER")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):HDF51:SDKVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))SDK_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):HDF51:FirmwareVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))FIRMWARE_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control acquisition start and stop               #
###################################################################

record(bo, "$(CAM):HDF51:Acquire") {
   field(DTYP, "asynInt32")
   field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))ACQUIRE")
   field(ZNAM, "Done")
   field(ONAM, "Acquire")
   field(VAL,  "0")
   field(FLNK, "$(CAM):HDF51:SetAcquireBusy")
   info(asyn:READBACK, "1")
}

record(bi, "$(CAM):HDF51:Acquire_RBV") {
   field(DTYP, "asynInt32")
   field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))ACQUIRE")
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):HDF51:SetAcquireBusy")
{
    field(INPA, "$(CAM):HDF51:Acquire NPP")
    field(CALC, "A")
    field(OOPT, "Transition To Non-zero")
    field(OUT,  "$(CAM):HDF51:AcquireBusy PP")
}

record(busy, "$(CAM):HDF51:AcquireBusy") {
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(VAL,  "0")
}

record(bi, "$(CAM):HDF51:AcquireBusyCB") {
   field(DTYP, "asynInt32")
   field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))ACQUIRE_BUSY")
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):HDF51:ClearAcquireBusy") {
    field(INPA, "$(CAM):HDF51:AcquireBusyCB CP")
    field(CALC, "A")
    field(OOPT, "Transition To Zero")
    field(OUT,  "$(CAM):HDF51:AcquireBusy PP")
}

record(bo, "$(CAM):HDF51:WaitForPlugins") {
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))WAIT_FOR_PLUGINS")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(VAL,  "0")
}

###################################################################
#  These records are the array size and data type                 #
###################################################################
# The number of dimensions
record(longout, "$(CAM):HDF51:NDimensions")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))ARRAY_NDIMENSIONS")
}

record(longin, "$(CAM):HDF51:NDimensions_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))ARRAY_NDIMENSIONS")
    field(SCAN, "I/O Intr")
}

# The array dimensions waveform records
record(waveform, "$(CAM):HDF51:Dimensions")
{
    field(DTYP, "asynInt32ArrayOut")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))ARRAY_DIMENSIONS")
    field(FTVL, "LONG")
    field(NELM, "10")
    field(FLNK, "$(CAM):HDF51:Dim0SA")
}

record(subArray, "$(CAM):HDF51:Dim0SA")
{
    field(INP,  "$(CAM):HDF51:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "0")
    field(FLNK, "$(CAM):HDF51:ArraySize0")
}

record(longin, "$(CAM):HDF51:ArraySize0")
{
    field(INP,  "$(CAM):HDF51:Dim0SA")
    field(FLNK, "$(CAM):HDF51:Dim1SA")
}

record(subArray, "$(CAM):HDF51:Dim1SA")
{
    field(INP,  "$(CAM):HDF51:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "1")
    field(FLNK, "$(CAM):HDF51:ArraySize1")
}

record(longin, "$(CAM):HDF51:ArraySize1")
{
    field(INP,  "$(CAM):HDF51:Dim1SA")
    field(FLNK, "$(CAM):HDF51:Dim2SA")
}

record(subArray, "$(CAM):HDF51:Dim2SA")
{
    field(INP,  "$(CAM):HDF51:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "2")
    field(FLNK, "$(CAM):HDF51:ArraySize2")
}

record(longin, "$(CAM):HDF51:ArraySize2")
{
    field(INP,  "$(CAM):HDF51:Dim2SA")
    field(FLNK, "$(CAM):HDF51:Dim3SA")
}

record(subArray, "$(CAM):HDF51:Dim3SA")
{
    field(INP,  "$(CAM):HDF51:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "3")
    field(FLNK, "$(CAM):HDF51:ArraySize3")
}

record(longin, "$(CAM):HDF51:ArraySize3")
{
    field(INP,  "$(CAM):HDF51:Dim3SA")
    field(FLNK, "$(CAM):HDF51:Dim4SA")
}

record(subArray, "$(CAM):HDF51:Dim4SA")
{
    field(INP,  "$(CAM):HDF51:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "4")
    field(FLNK, "$(CAM):HDF51:ArraySize4")
}

record(longin, "$(CAM):HDF51:ArraySize4")
{
    field(INP,  "$(CAM):HDF51:Dim4SA")
    field(FLNK, "$(CAM):HDF51:Dim5SA")
}

record(subArray, "$(CAM):HDF51:Dim5SA")
{
    field(INP,  "$(CAM):HDF51:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "5")
    field(FLNK, "$(CAM):HDF51:ArraySize5")
}

record(longin, "$(CAM):HDF51:ArraySize5")
{
    field(INP,  "$(CAM):HDF51:Dim5SA")
    field(FLNK, "$(CAM):HDF51:Dim6SA")
}

record(subArray, "$(CAM):HDF51:Dim6SA")
{
    field(INP,  "$(CAM):HDF51:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "6")
    field(FLNK, "$(CAM):HDF51:ArraySize6")
}

record(longin, "$(CAM):HDF51:ArraySize6")
{
    field(INP,  "$(CAM):HDF51:Dim6SA")
    field(FLNK, "$(CAM):HDF51:Dim7SA")
}

record(subArray, "$(CAM):HDF51:Dim7SA")
{
    field(INP,  "$(CAM):HDF51:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "7")
    field(FLNK, "$(CAM):HDF51:ArraySize7")
}

record(longin, "$(CAM):HDF51:ArraySize7")
{
    field(INP,  "$(CAM):HDF51:Dim7SA")
    field(FLNK, "$(CAM):HDF51:Dim8SA")
}

record(subArray, "$(CAM):HDF51:Dim8SA")
{
    field(INP,  "$(CAM):HDF51:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "8")
    field(FLNK, "$(CAM):HDF51:ArraySize8")
}

record(longin, "$(CAM):HDF51:ArraySize8")
{
    field(INP,  "$(CAM):HDF51:Dim8SA")
    field(FLNK, "$(CAM):HDF51:Dim9SA")
}

record(subArray, "$(CAM):HDF51:Dim9SA")
{
    field(INP,  "$(CAM):HDF51:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "9")
    field(FLNK, "$(CAM):HDF51:ArraySize9")
}

record(longin, "$(CAM):HDF51:ArraySize9")
{
    field(INP,  "$(CAM):HDF51:Dim9SA")
}


record(waveform, "$(CAM):HDF51:Dimensions_RBV")
{
    field(DTYP, "asynInt32ArrayIn")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))ARRAY_DIMENSIONS")
    field(FTVL, "LONG")
    field(NELM, "10")
    field(FLNK, "$(CAM):HDF51:Dim0SA_RBV")
    field(SCAN, "I/O Intr")
}

record(subArray, "$(CAM):HDF51:Dim0SA_RBV")
{
    field(INP,  "$(CAM):HDF51:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "0")
    field(FLNK, "$(CAM):HDF51:ArraySize0_RBV")
}

record(longin, "$(CAM):HDF51:ArraySize0_RBV")
{
    field(INP,  "$(CAM):HDF51:Dim0SA_RBV")
    field(FLNK, "$(CAM):HDF51:Dim1SA_RBV")
}

record(subArray, "$(CAM):HDF51:Dim1SA_RBV")
{
    field(INP,  "$(CAM):HDF51:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "1")
    field(FLNK, "$(CAM):HDF51:ArraySize1_RBV")
}

record(longin, "$(CAM):HDF51:ArraySize1_RBV")
{
    field(INP,  "$(CAM):HDF51:Dim1SA_RBV")
    field(FLNK, "$(CAM):HDF51:Dim2SA_RBV")
}

record(subArray, "$(CAM):HDF51:Dim2SA_RBV")
{
    field(INP,  "$(CAM):HDF51:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "2")
    field(FLNK, "$(CAM):HDF51:ArraySize2_RBV")
}

record(longin, "$(CAM):HDF51:ArraySize2_RBV")
{
    field(INP,  "$(CAM):HDF51:Dim2SA_RBV")
    field(FLNK, "$(CAM):HDF51:Dim3SA_RBV")
}

record(subArray, "$(CAM):HDF51:Dim3SA_RBV")
{
    field(INP,  "$(CAM):HDF51:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "3")
    field(FLNK, "$(CAM):HDF51:ArraySize3_RBV")
}

record(longin, "$(CAM):HDF51:ArraySize3_RBV")
{
    field(INP,  "$(CAM):HDF51:Dim3SA_RBV")
    field(FLNK, "$(CAM):HDF51:Dim4SA_RBV")
}

record(subArray, "$(CAM):HDF51:Dim4SA_RBV")
{
    field(INP,  "$(CAM):HDF51:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "4")
    field(FLNK, "$(CAM):HDF51:ArraySize4_RBV")
}

record(longin, "$(CAM):HDF51:ArraySize4_RBV")
{
    field(INP,  "$(CAM):HDF51:Dim4SA_RBV")
    field(FLNK, "$(CAM):HDF51:Dim5SA_RBV")
}

record(subArray, "$(CAM):HDF51:Dim5SA_RBV")
{
    field(INP,  "$(CAM):HDF51:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "5")
    field(FLNK, "$(CAM):HDF51:ArraySize5_RBV")
}

record(longin, "$(CAM):HDF51:ArraySize5_RBV")
{
    field(INP,  "$(CAM):HDF51:Dim5SA_RBV")
    field(FLNK, "$(CAM):HDF51:Dim6SA_RBV")
}

record(subArray, "$(CAM):HDF51:Dim6SA_RBV")
{
    field(INP,  "$(CAM):HDF51:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "6")
    field(FLNK, "$(CAM):HDF51:ArraySize6_RBV")
}

record(longin, "$(CAM):HDF51:ArraySize6_RBV")
{
    field(INP,  "$(CAM):HDF51:Dim6SA_RBV")
    field(FLNK, "$(CAM):HDF51:Dim7SA_RBV")
}

record(subArray, "$(CAM):HDF51:Dim7SA_RBV")
{
    field(INP,  "$(CAM):HDF51:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "7")
    field(FLNK, "$(CAM):HDF51:ArraySize7_RBV")
}

record(longin, "$(CAM):HDF51:ArraySize7_RBV")
{
    field(INP,  "$(CAM):HDF51:Dim7SA_RBV")
    field(FLNK, "$(CAM):HDF51:Dim8SA_RBV")
}

record(subArray, "$(CAM):HDF51:Dim8SA_RBV")
{
    field(INP,  "$(CAM):HDF51:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "8")
    field(FLNK, "$(CAM):HDF51:ArraySize8_RBV")
}

record(longin, "$(CAM):HDF51:ArraySize8_RBV")
{
    field(INP,  "$(CAM):HDF51:Dim8SA_RBV")
    field(FLNK, "$(CAM):HDF51:Dim9SA_RBV")
}

record(subArray, "$(CAM):HDF51:Dim9SA_RBV")
{
    field(INP,  "$(CAM):HDF51:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "9")
    field(FLNK, "$(CAM):HDF51:ArraySize9_RBV")
}

record(longin, "$(CAM):HDF51:ArraySize9_RBV")
{
    field(INP,  "$(CAM):HDF51:Dim9SA_RBV")
}


record(mbbi, "$(CAM):HDF51:BayerPattern_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))BAYER_PATTERN")
   field(ZRST, "RGGB")
   field(ZRVL, "0")
   field(ONST, "GBRG")
   field(ONVL, "1")
   field(TWST, "GRBG")
   field(TWVL, "2")
   field(THST, "BGGR")
   field(THVL, "3")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):HDF51:ArraySizeX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_X")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):HDF51:ArraySizeY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_Y")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):HDF51:ArraySizeZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_Z")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):HDF51:ArraySize_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records have information on the compression              # 
###################################################################
record(stringin, "$(CAM):HDF51:Codec_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))CODEC")
   field(VAL,  "")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):HDF51:CompressedSize_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))COMPRESSED_SIZE")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the data type                            # 
###################################################################

record(mbbo, "$(CAM):HDF51:DataType")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))DATA_TYPE")
   field(ZRST, "Int8")
   field(ZRVL, "0")
   field(ONST, "UInt8")
   field(ONVL, "1")
   field(TWST, "Int16")
   field(TWVL, "2")
   field(THST, "UInt16")
   field(THVL, "3")
   field(FRST, "Int32")
   field(FRVL, "4")
   field(FVST, "UInt32")
   field(FVVL, "5")
   field(SXST, "Int64")
   field(SXVL, "6")
   field(SVST, "UInt64")
   field(SVVL, "7")
   field(EIST, "Float32")
   field(EIVL, "8")
   field(NIST, "Float64")
   field(NIVL, "9")
   field(VAL,  "0")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):HDF51:DataType_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))DATA_TYPE")
   field(ZRST, "Int8")
   field(ZRVL, "0")
   field(ONST, "UInt8")
   field(ONVL, "1")
   field(TWST, "Int16")
   field(TWVL, "2")
   field(THST, "UInt16")
   field(THVL, "3")
   field(FRST, "Int32")
   field(FRVL, "4")
   field(FVST, "UInt32")
   field(FVVL, "5")
   field(SXST, "Int64")
   field(SXVL, "6")
   field(SVST, "UInt64")
   field(SVVL, "7")
   field(EIST, "Float32")
   field(EIVL, "8")
   field(NIST, "Float64")
   field(NIVL, "9")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):HDF51:BitsPerPixel_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))BITS_PER_PIXEL")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the color mode                           #
#  These choices must agree with NDColorMode_t in NDArray.h       # 
###################################################################

record(mbbo, "$(CAM):HDF51:ColorMode")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))COLOR_MODE")
   field(ZRST, "Mono")
   field(ZRVL, "0")
   field(ONST, "Bayer")
   field(ONVL, "1")
   field(TWST, "RGB1")
   field(TWVL, "2")
   field(THST, "RGB2")
   field(THVL, "3")
   field(FRST, "RGB3")
   field(FRVL, "4")
   field(FVST, "YUV444")
   field(FVVL, "5")
   field(SXST, "YUV422")
   field(SXVL, "6")
   field(SVST, "YUV421")
   field(SVVL, "7")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):HDF51:ColorMode_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))COLOR_MODE")
   field(ZRST, "Mono")
   field(ZRVL, "0")
   field(ONST, "Bayer")
   field(ONVL, "1")
   field(TWST, "RGB1")
   field(TWVL, "2")
   field(THST, "RGB2")
   field(THVL, "3")
   field(FRST, "RGB3")
   field(FRVL, "4")
   field(FVST, "YUV444")
   field(FVVL, "5")
   field(SXST, "YUV422")
   field(SXVL, "6")
   field(SVST, "YUV421")
   field(SVVL, "7")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records are the uniqueId and time stamps of the array     #
###################################################################
record(longin, "$(CAM):HDF51:UniqueId_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))UNIQUE_ID")
    field(SCAN, "I/O Intr")
}

record(ai, "$(CAM):HDF51:TimeStamp_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))TIME_STAMP")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):HDF51:EpicsTSSec_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))EPICS_TS_SEC")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):HDF51:EpicsTSNsec_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))EPICS_TS_NSEC")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records provide statistics on array callbacks and        #
#  array callback rates                                           # 
###################################################################
record(longout, "$(CAM):HDF51:ArrayCounter")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))ARRAY_COUNTER")
}

record(longin, "$(CAM):HDF51:ArrayCounter_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))ARRAY_COUNTER")
    field(SCAN, "I/O Intr")
    field(TSE,  "-2")
    field(LOW,  "0" )
    field(LSV,  "MINOR" )
    info(autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV TSE")
}

# Updated rate calculation to use a smoothing factor w/ guard against negative values
# 0 rate sets alarm state to MINOR
record(calc, "$(CAM):HDF51:ArrayRate_RBV")
{
    field(INPA, "$(CAM):HDF51:ArrayRate_RBV.LB NPP NMS")   # Previous counter (Last B value)
    field(INPB, "$(CAM):HDF51:ArrayCounter_RBV NPP NMS")   # Current counter value
    field(INPC, "1.0")                                # Delta time in seconds
    field(INPD, "$(CAM):HDF51:ArrayRate_RBV.VAL NPP NMS")  # Previous rate
    field(INPE, "0.0")                 # Smoothing factor
    field(CALC, "(D*E)/C+MAX(0,B-A)*(1-E)/C")
    field(PREC, "2" )
    field(EGU,  "Hz" )
    field(SCAN, "1 second")
    field(LOW,  "0")
    field(LSV,  "MINOR")
    field(ADEL, "0.1")
    info(autosaveFields, "ADEL DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV MDEL PREC C E SCAN EGU")
}

###################################################################
#  These records control NDArray callacks                         # 
###################################################################
record(bo, "$(CAM):HDF51:ArrayCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))ARRAY_CALLBACKS")
    field(ZNAM, "Disable")
    field(ZSV,  "MINOR")
    field(ONAM, "Enable")
    field(OSV,  "NO_ALARM")
    field(VAL, "1")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):HDF51:ArrayCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))ARRAY_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ZSV,  "MINOR")
    field(ONAM, "Enabled")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains macro definitions for the attributes      # 
###################################################################

record(waveform, "$(CAM):HDF51:NDAttributesMacros")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_MACROS")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

###################################################################
#  This record is the name of a file defining attributes          # 
###################################################################

record(waveform, "$(CAM):HDF51:NDAttributesFile")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_FILE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

###################################################################
#  This record defines the status of reading attributes file      # 
###################################################################

record(mbbi, "$(CAM):HDF51:NDAttributesStatus")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_STATUS")
    field(ZRVL, "0")
    field(ZRST, "Attributes file OK")
    field(ZRSV, "NO_ALARM")
    field(ONVL, "1")
    field(ONST, "File not found")
    field(ONSV, "MINOR")
    field(TWVL, "2")
    field(TWST, "XML syntax error")
    field(TWSV, "MAJOR")
    field(THVL, "3")
    field(THST, "Macro substitution error")
    field(THSV, "MAJOR")
    field(SCAN, "I/O Intr")
}

###################################################################
#  Status of NDArrayPool - number of buffers, memory used etc.    # 
###################################################################

record(ai, "$(CAM):HDF51:PoolMaxMem")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))POOL_MAX_MEMORY")
   field(PREC, "1")
   field(EGU,  "MB")
   field(SCAN, "Passive")
   field(PINI, "YES")
}

record(ai, "$(CAM):HDF51:PoolUsedMem")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))POOL_USED_MEMORY")
   field(PREC, "1")
   field(EGU,  "MB")
   field(SCAN, "1 second")
   field(FLNK, "$(CAM):HDF51:PoolAllocBuffers")
   info(autosaveFields, "SCAN")
}

record(longin, "$(CAM):HDF51:PoolAllocBuffers")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))POOL_ALLOC_BUFFERS")
   field(FLNK, "$(CAM):HDF51:PoolFreeBuffers")
}

record(longin, "$(CAM):HDF51:PoolFreeBuffers")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))POOL_FREE_BUFFERS")
   field(FLNK, "$(CAM):HDF51:PoolUsedBuffers")
}

record(calc, "$(CAM):HDF51:PoolUsedBuffers")
{
    field(INPA, "$(CAM):HDF51:PoolAllocBuffers NPP MS")
    field(INPB, "$(CAM):HDF51:PoolFreeBuffers NPP MS")
    field(CALC, "A-B")
}

record(bo, "$(CAM):HDF51:EmptyFreeList")
{
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))POOL_EMPTY_FREELIST")
}

record(longin, "$(CAM):HDF51:NumQueuedArrays")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))NUM_QUEUED_ARRAYS")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the type of plugin                        #
###################################################################

record(stringin, "$(CAM):HDF51:PluginType_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))PLUGIN_TYPE")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the connection of the server to          #
#  an NDArray driver port and address                             #
###################################################################
# Array port name
record(stringout, "$(CAM):HDF51:NDArrayPort")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))NDARRAY_PORT")
    field(VAL,  "$(CAM_PORT)")
    info(autosaveFields, "DESC VAL")
}

record(stringin, "$(CAM):HDF51:NDArrayPort_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))NDARRAY_PORT")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):HDF51:NDArrayAddress")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))NDARRAY_ADDR")
    field(VAL,  "$(NDARRAY_ADDR=0)")
    info(autosaveFields, "DESC VAL")
}

record(longin, "$(CAM):HDF51:NDArrayAddress_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))NDARRAY_ADDR")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control whether callbacks are enabled and        #
#  minimum time between callbacks                                 #
###################################################################
record(bo, "$(CAM):HDF51:EnableCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))ENABLE_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    field(VAL,  "0")
    info(autosaveFields, "DESC VAL")
}

record(bi, "$(CAM):HDF51:EnableCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))ENABLE_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    field(ZSV,  "MINOR")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):HDF51:MinCallbackTime")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))MIN_CALLBACK_TIME")
    field(EGU,  "s")
    field(PREC, "3")
    field(VAL,  "0.0")
    field(DRVL, "0")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):HDF51:MinCallbackTime_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))MIN_CALLBACK_TIME")
    field(EGU,  "s")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):HDF51:MaxArrayRate")
{
    field(DTYP, "Soft Channel")
    field(OUT,  "$(CAM):HDF51:MaxArrayRate_COUT PP")
    field(EGU,  "Hz")
    field(PREC, "3")
    field(VAL,  "0.0")
    info(autosaveFields, "VAL")
}

record(calcout, "$(CAM):HDF51:MaxArrayRate_COUT")
{
    field(INPA, "$(CAM):HDF51:MaxArrayRate")
    field(CALC, "A=0?0:1.0/A")
    field(OUT,  "$(CAM):HDF51:MinCallbackTime PP")
}

record(calc, "$(CAM):HDF51:MaxArrayRate_RBV")
{
    field(INPA, "$(CAM):HDF51:MinCallbackTime_RBV CP")
    field(CALC, "A=0?0:1.0/A")
    field(EGU,  "Hz")
    field(PREC, "3")
    field(SCAN, "Passive")
}

record(ao, "$(CAM):HDF51:MaxByteRate")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))MAX_BYTE_RATE")
    field(EGU,  "s")
    field(PREC, "3")
    field(VAL,  "0.0")
    field(DRVL, "0")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):HDF51:MaxByteRate_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))MAX_BYTE_RATE")
    field(EGU,  "s")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the last execution time of the plugin     #
###################################################################
record(ai, "$(CAM):HDF51:ExecutionTime_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))EXECUTION_TIME")
    field(EGU,  "ms")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record requests that the plugin execute again with the    #
#  same NDArray                                                   #
###################################################################
record(bo, "$(CAM):HDF51:ProcessPlugin")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))PROCESS_PLUGIN")
    field(VAL,  "1")
}

###################################################################
#  These records control whether callbacks block or not           #
###################################################################
record(bo, "$(CAM):HDF51:BlockingCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))BLOCKING_CALLBACKS")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(VAL,  "0")
    info(autosaveFields, "DESC ZSV OSV VAL")
}

record(bi, "$(CAM):HDF51:BlockingCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))BLOCKING_CALLBACKS")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(ZSV,  "NO_ALARM")
    field(OSV,  "MINOR")
    field(SCAN, "I/O Intr")
    info( autosaveFields, "DESC ZSV OSV" )
}


record(longout, "$(CAM):HDF51:DroppedArrays")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))DROPPED_ARRAYS")
    field(VAL,  "0")
    info( autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV EGU" )
}

record(longin, "$(CAM):HDF51:DroppedArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))DROPPED_ARRAYS")
    field(SCAN, "I/O Intr")
    field(HIGH, "1")
    field(HSV,  "MINOR")
    info( autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV EGU" )
}

record(longout, "$(CAM):HDF51:QueueSize")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))QUEUE_SIZE")
    field(PINI, "YES")
    info( autosaveFields, "DESC EGU" )
}

record(longin, "$(CAM):HDF51:QueueSize_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))QUEUE_SIZE")
    field(FLNK, "$(CAM):HDF51:QueueFreeLow")
    field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):HDF51:QueueFreeLow") {
    field(CALC, "A*0.25")
    field(INPA, "$(CAM):HDF51:QueueSize")
    field(OUT,  "$(CAM):HDF51:QueueFree.LOW")
    field(FLNK, "$(CAM):HDF51:QueueUseHIGH")
}

# Set a HIGH warning level for the input queue fill level to 75%
# of the full size of the queue
record(calcout, "$(CAM):HDF51:QueueUseHIGH") {
   field(CALC, "A*0.75")
   field(INPA, "$(CAM):HDF51:QueueSize")
   field(OUT,  "$(CAM):HDF51:QueueUse.HIGH")
   field(FLNK, "$(CAM):HDF51:QueueUseHIHI")
}

# Set a HIHI level for the input queue fill level to indicate an error
# (MAJOR alarm)  when it fills up to the full size of the queue (frames start dropping)
record(calcout, "$(CAM):HDF51:QueueUseHIHI") {
   field(CALC, "A*1.0")
   field(INPA, "$(CAM):HDF51:QueueSize")
   field(OUT,  "$(CAM):HDF51:QueueUse.HIHI")
}

record(longin, "$(CAM):HDF51:QueueFree")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))QUEUE_FREE")
    field(LLSV, "MAJOR")
    field(LSV,  "MINOR")
    field(LOLO, "0")
    field(HYST, "1")
    field(SCAN, "I/O Intr")
}

# Display the fill level on the plugins input queue
record(calc, "$(CAM):HDF51:QueueUse") {
    field(CALC, "A-B")
    field(INPA, "$(CAM):HDF51:QueueSize")
    field(INPB, "$(CAM):HDF51:QueueFree CP")
    field(SCAN, "Passive")
    field(HHSV, "MAJOR")
    field(HSV,  "MINOR")
    field(HYST, "1")
}

record(longout, "$(CAM):HDF51:NumThreads")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))NUM_THREADS")
    field(VAL,  "1")
    field(PINI, "YES")
    info(autosaveFields, "DESC VAL")
}

record(longin, "$(CAM):HDF51:NumThreads_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))NUM_THREADS")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):HDF51:MaxThreads_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))MAX_THREADS")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control output array sorting                     #
###################################################################
record(mbbo, "$(CAM):HDF51:SortMode") {
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))SORT_MODE")
    field(ZRVL, "0")
    field(ZRST, "Unsorted")
    field(ONVL, "1")
    field(ONST, "Sorted")
}

record(mbbi, "$(CAM):HDF51:SortMode_RBV") {
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))SORT_MODE")
    field(ZRVL, "0")
    field(ZRST, "Unsorted")
    field(ONVL, "1")
    field(ONST, "Sorted")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):HDF51:SortTime") {
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))SORT_TIME")
    field(PREC, "3")
    field(VAL, "0.1")
}

record(ai, "$(CAM):HDF51:SortTime_RBV") {
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))SORT_TIME")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):HDF51:SortSize")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))SORT_SIZE")
    field(VAL,  "20")
    field(PINI, "YES")
}

record(longin, "$(CAM):HDF51:SortSize_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))SORT_SIZE")
    field(FLNK, "$(CAM):HDF51:SortFreeLow")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):HDF51:SortFree") {
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))SORT_FREE")
    field(LLSV, "MAJOR")
    field(LSV,  "MINOR")
    field(LOLO, "0")
    field(HYST, "1")
    field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):HDF51:SortFreeLow") {
    field(CALC, "A*0.25")
    field(INPA, "$(CAM):HDF51:SortSize")
    field(OUT,  "$(CAM):HDF51:SortFree.LOW")
}

record(longout, "$(CAM):HDF51:DroppedOutputArrays")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))DROPPED_OUTPUT_ARRAYS")
    field(VAL,  "0")
}

record(longin, "$(CAM):HDF51:DroppedOutputArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))DROPPED_OUTPUT_ARRAYS")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):HDF51:DisorderedArrays")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))DISORDERED_ARRAYS")
    field(PINI, "YES")
}

record(longin, "$(CAM):HDF51:DisorderedArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))DISORDERED_ARRAYS")
    field(SCAN, "I/O Intr")
}



###################################################################
#  The asynRecord is used for mainly for trace mask               # 
###################################################################
 
# Set ASYN_TRACEIO_HEX bit by default
record(asyn,"$(CAM):HDF51:AsynIO")
{
    field(PORT, "HDF51")
    field(TIB2,"1")
    info("ADType", "ADPlugin")
}


# Flush data to file
record(busy, "$(CAM):HDF51:FlushNow")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_SWMRFlushNow")
    field(ZNAM, "Done")
    field(ONAM, "Flush")
}

# We replace some fields in records defined in NDFile.template
# File data format 
record(mbbo, "$(CAM):HDF51:FileFormat")
{
    field(ZRST, "HDF5")
    field(ZRVL, "0")
    field(ONST, "Invalid")
    field(ONVL, "1")
}

record(mbbi, "$(CAM):HDF51:FileFormat_RBV")
{
    field(ZRST, "HDF5")
    field(ZRVL, "0")
    field(ONST, "Undefined")
    field(ONVL, "1")
}

record(bo, "$(CAM):HDF51:ChunkSizeAuto")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_chunkSizeAuto")
    field(PINI, "YES")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):HDF51:ChunkSizeAuto_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_chunkSizeAuto")
    field(SCAN, "I/O Intr")
    field(ZNAM, "No")
    field(ONAM, "Yes")
}

record(longout, "$(CAM):HDF51:NumRowChunks")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_nRowChunks")
    field(PINI, "YES")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):HDF51:NumRowChunks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_nRowChunks")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):HDF51:NumColChunks")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_nColChunks")
    field(PINI, "YES")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):HDF51:NumColChunks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_nColChunks")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):HDF51:ChunkSize2")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_chunkSize2")
    field(PINI, "YES")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):HDF51:ChunkSize2_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_chunkSize2")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):HDF51:ChunkSize3")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_chunkSize3")
    field(PINI, "YES")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):HDF51:ChunkSize3_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_chunkSize3")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):HDF51:ChunkSize4")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_chunkSize4")
    field(PINI, "YES")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):HDF51:ChunkSize4_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_chunkSize4")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):HDF51:ChunkSize5")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_chunkSize5")
    field(PINI, "YES")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):HDF51:ChunkSize5_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_chunkSize5")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):HDF51:ChunkSize6")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_chunkSize6")
    field(PINI, "YES")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):HDF51:ChunkSize6_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_chunkSize6")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):HDF51:ChunkSize7")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_chunkSize7")
    field(PINI, "YES")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):HDF51:ChunkSize7_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_chunkSize7")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):HDF51:ChunkSize8")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_chunkSize8")
    field(PINI, "YES")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):HDF51:ChunkSize8_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_chunkSize8")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):HDF51:ChunkSize9")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_chunkSize9")
    field(PINI, "YES")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):HDF51:ChunkSize9_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_chunkSize9")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):HDF51:NumFramesChunks")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_nFramesChunks")
    field(PINI, "YES")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):HDF51:NumFramesChunks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_nFramesChunks")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):HDF51:NDAttributeChunk")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_NDAttributeChunk")
    field(PINI, "YES")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):HDF51:NDAttributeChunk_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_NDAttributeChunk")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):HDF51:BoundaryAlign")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_chunkBoundaryAlign")
    field(PINI, "YES")
    field(VAL, "0")
    field(EGU, "bytes")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):HDF51:BoundaryAlign_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_chunkBoundaryAlign")
    field(SCAN, "I/O Intr")
    field(EGU, "bytes")
}

record(longout, "$(CAM):HDF51:BoundaryThreshold")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_chunkBoundaryThreshold")
    field(PINI, "YES")
    field(VAL, "1")
    field(EGU, "bytes")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):HDF51:BoundaryThreshold_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_chunkBoundaryThreshold")
    field(SCAN, "I/O Intr")
    field(EGU, "bytes")
}

record(longout, "$(CAM):HDF51:NumExtraDims")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_nExtraDims")
    field(PINI, "YES")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):HDF51:NumExtraDims_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_nExtraDims")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):HDF51:ExtraDimSizeN")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_extraDimSizeN")
    field(PINI, "YES")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):HDF51:ExtraDimSizeN_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_extraDimSizeN")
    field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):HDF51:ExtraDimNameN_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_extraDimNameN")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):HDF51:ExtraDimSizeX")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_extraDimSizeX")
    field(PINI, "YES")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):HDF51:ExtraDimSizeX_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_extraDimSizeX")
    field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):HDF51:ExtraDimNameX_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_extraDimNameX")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):HDF51:ExtraDimSizeY")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_extraDimSizeY")
    field(PINI, "YES")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):HDF51:ExtraDimSizeY_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_extraDimSizeY")
    field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):HDF51:ExtraDimNameY_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_extraDimNameY")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):HDF51:ExtraDimSize3")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_extraDimSize3")
    field(PINI, "YES")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):HDF51:ExtraDimSize3_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_extraDimSize3")
    field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):HDF51:ExtraDimName3_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_extraDimName3")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):HDF51:ExtraDimSize4")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_extraDimSize4")
    field(PINI, "YES")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):HDF51:ExtraDimSize4_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_extraDimSize4")
    field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):HDF51:ExtraDimName4_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_extraDimName4")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):HDF51:ExtraDimSize5")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_extraDimSize5")
    field(PINI, "YES")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):HDF51:ExtraDimSize5_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_extraDimSize5")
    field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):HDF51:ExtraDimName5_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_extraDimName5")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):HDF51:ExtraDimSize6")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_extraDimSize6")
    field(PINI, "YES")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):HDF51:ExtraDimSize6_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_extraDimSize6")
    field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):HDF51:ExtraDimName6_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_extraDimName6")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):HDF51:ExtraDimSize7")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_extraDimSize7")
    field(PINI, "YES")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):HDF51:ExtraDimSize7_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_extraDimSize7")
    field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):HDF51:ExtraDimName7_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_extraDimName7")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):HDF51:ExtraDimSize8")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_extraDimSize8")
    field(PINI, "YES")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):HDF51:ExtraDimSize8_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_extraDimSize8")
    field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):HDF51:ExtraDimName8_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_extraDimName8")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):HDF51:ExtraDimSize9")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_extraDimSize9")
    field(PINI, "YES")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):HDF51:ExtraDimSize9_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_extraDimSize9")
    field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):HDF51:ExtraDimName9_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_extraDimName9")
    field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):HDF51:StoreAttr")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_storeAttributes")
    field(PINI, "YES")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):HDF51:StoreAttr_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_storeAttributes")
    field(SCAN, "I/O Intr")
    field(ZNAM, "No")
    field(ONAM, "Yes")
}

record(bo, "$(CAM):HDF51:StorePerform")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_storePerformance")
    field(PINI, "YES")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):HDF51:StorePerform_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_storePerformance")
    field(SCAN, "I/O Intr")
    field(ZNAM, "No")
    field(ONAM, "Yes")
}

record(ai, "$(CAM):HDF51:RunTime")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_totalRuntime")
    field(SCAN, "I/O Intr")
    field(PREC, "3")
    field(EGU,  "s")
}

record(ai, "$(CAM):HDF51:IOSpeed")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_totalIoSpeed")
    field(SCAN, "I/O Intr")
    field(PREC, "1")
    field(EGU,  "Mbit/s")
}

record(longout, "$(CAM):HDF51:NumFramesFlush")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_flushNthFrame")
    field(PINI, "YES")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):HDF51:NumFramesFlush_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_flushNthFrame")
    field(SCAN, "I/O Intr")
}

record(mbbo, "$(CAM):HDF51:Compression")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_compressionType")
    field(PINI, "YES")
    field(ZRST, "None")
    field(ZRVL, "0")
    field(ONST, "N-bit")
    field(ONVL, "1")
    field(TWST, "szip")
    field(TWVL, "2")
    field(THST, "zlib")
    field(THVL, "3")
    field(FRST, "Blosc")
    field(FRVL, "4")
    field(FVST, "BSLZ4")
    field(FVVL, "5")
    field(SXST, "LZ4")
    field(SXVL, "6")
    field(SVST, "JPEG")
    field(SVVL, "7")
    info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):HDF51:Compression_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_compressionType")
    field(SCAN, "I/O Intr")
    field(ZRST, "None")
    field(ZRVL, "0")
    field(ONST, "N-bit")
    field(ONVL, "1")
    field(TWST, "szip")
    field(TWVL, "2")
    field(THST, "zlib")
    field(THVL, "3")
    field(FRST, "Blosc")
    field(FRVL, "4")
    field(FVST, "BSLZ4")
    field(FVVL, "5")
    field(SXST, "LZ4")
    field(SXVL, "6")
    field(SVST, "JPEG")
    field(SVVL, "7")
}

record(longout, "$(CAM):HDF51:NumDataBits")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_nbitsPrecision")
    field(PINI, "YES")
    field(EGU,  "bit")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):HDF51:NumDataBits_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_nbitsPrecision")
    field(SCAN, "I/O Intr")
    field(EGU,  "bit")
}

record(longout, "$(CAM):HDF51:DataBitsOffset")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_nbitsOffset")
    field(PINI, "YES")
    field(EGU,  "bit")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):HDF51:DataBitsOffset_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_nbitsOffset")
    field(SCAN, "I/O Intr")
    field(EGU,  "bit")
}

record(longout, "$(CAM):HDF51:SZipNumPixels")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_szipNumPixels")
    field(PINI, "YES")
    field(EGU,  "bit")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):HDF51:SZipNumPixels_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_szipNumPixels")
    field(SCAN, "I/O Intr")
    field(EGU,  "bit")
}

record(longout, "$(CAM):HDF51:ZLevel")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_zCompressLevel")
    field(PINI, "YES")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):HDF51:ZLevel_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_zCompressLevel")
    field(SCAN, "I/O Intr")
}

record(mbbo, "$(CAM):HDF51:BloscShuffle")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_bloscShuffleType")
    field(PINI, "YES")
    field(ZRST, "None")
    field(ZRVL, "0")
    field(ONST, "Byte")
    field(ONVL, "1")
    field(TWST, "Bit")
    field(TWVL, "2")
    info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):HDF51:BloscShuffle_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_bloscShuffleType")
    field(SCAN, "I/O Intr")
    field(ZRST, "None")
    field(ZRVL, "0")
    field(ONST, "Byte")
    field(ONVL, "1")
    field(TWST, "Bit")
    field(TWVL, "2")
}

record(mbbo, "$(CAM):HDF51:BloscCompressor")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_bloscCompressor")
    field(PINI, "YES")
    field(ZRST, "BloscLZ")
    field(ZRVL, "0")
    field(ONST, "LZ4")
    field(ONVL, "1")
    field(TWST, "LZ4HC")
    field(TWVL, "2")
    field(THST, "SNAPPY")
    field(THVL, "3")
    field(FRST, "ZLIB")
    field(FRVL, "4")
    field(FVST, "ZSTD")
    field(FVVL, "5")
    info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):HDF51:BloscCompressor_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_bloscCompressor")
    field(SCAN, "I/O Intr")
    field(ZRST, "BloscLZ")
    field(ZRVL, "0")
    field(ONST, "LZ4")
    field(ONVL, "1")
    field(TWST, "LZ4HC")
    field(TWVL, "2")
    field(THST, "SNAPPY")
    field(THVL, "3")
    field(FRST, "ZLIB")
    field(FRVL, "4")
    field(FVST, "ZSTD")
    field(FVVL, "5")
}

record(longout, "$(CAM):HDF51:BloscLevel")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_bloscCompressLevel")
    field(PINI, "YES")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):HDF51:BloscLevel_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_bloscCompressLevel")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):HDF51:JPEGQuality")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_jpegQuality")
    field(VAL, "90")
    field(DRVL, "1")
    field(DRVH, "100")
    field(PINI, "YES")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):HDF51:JPEGQuality_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_jpegQuality")
    field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):HDF51:DimAttDatasets")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_dimAttDatasets")
    field(PINI, "YES")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):HDF51:DimAttDatasets_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_dimAttDatasets")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(SCAN, "I/O Intr")
}

# File path.
# % autosave 2 
#record(waveform, "$(CAM):HDF51:XMLPath")
#{
#    field(PINI, "YES")
#    field(DTYP, "asynOctetWrite")
#    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_layoutDirectory")
#    field(FTVL, "CHAR")
#    field(NELM, "256")
#}

record(waveform, "$(CAM):HDF51:XMLErrorMsg_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_layoutErrorMsg")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

record(bi, "$(CAM):HDF51:XMLValid_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_layoutValid")
    field(ZNAM, "No")
    field(ZSV,  "MAJOR")
    field(ONAM, "Yes")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

# Filename
# % autosave 2 
record(waveform, "$(CAM):HDF51:XMLFileName")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_layoutFilename")
    field(FTVL, "CHAR")
    field(NELM, "2048")
    info(autosaveFields, "VAL")
}

record(waveform, "$(CAM):HDF51:XMLFileName_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_layoutFilename")
    field(FTVL, "CHAR")
    field(NELM, "2048")
    field(SCAN, "I/O Intr")
}

record(bi, "$(CAM):HDF51:SWMRSupported_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_SWMRSupported")
    field(SCAN, "I/O Intr")
    field(ZNAM, "Not Supported")
    field(ONAM, "Supported")
}

record(bo, "$(CAM):HDF51:SWMRMode")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_SWMRMode")
    field(PINI, "YES")
    field(ZNAM, "Off")
    field(ONAM, "On")
}

record(bi, "$(CAM):HDF51:SWMRMode_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_SWMRMode")
    field(SCAN, "I/O Intr")
    field(ZNAM, "Off")
    field(ONAM, "On")
}

record(bi, "$(CAM):HDF51:SWMRActive_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_SWMRRunning")
    field(SCAN, "I/O Intr")
    field(ZNAM, "Off")
    field(ONAM, "Active")
}

record(longin, "$(CAM):HDF51:SWMRCbCounter_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_SWMRCbCounter")
    field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):HDF51:PositionMode")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_posRunning")
    field(PINI, "YES")
    field(ZNAM, "Off")
    field(ONAM, "On")
}

record(bi, "$(CAM):HDF51:PositionMode_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_posRunning")
    field(SCAN, "I/O Intr")
    field(ZNAM, "Off")
    field(ONAM, "On")
}

record(stringout, "$(CAM):HDF51:PosNameDimN")
{
    field(DTYP, "asynOctetWrite")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_posNameDimN")
    field(PINI, "YES")
}

record(stringin, "$(CAM):HDF51:PosNameDimN_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_posNameDimN")
    field(SCAN, "I/O Intr")
}

record(stringout, "$(CAM):HDF51:PosNameDimX")
{
    field(DTYP, "asynOctetWrite")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_posNameDimX")
    field(PINI, "YES")
}

record(stringin, "$(CAM):HDF51:PosNameDimX_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_posNameDimX")
    field(SCAN, "I/O Intr")
}

record(stringout, "$(CAM):HDF51:PosNameDimY")
{
    field(DTYP, "asynOctetWrite")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_posNameDimY")
    field(PINI, "YES")
}

record(stringin, "$(CAM):HDF51:PosNameDimY_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_posNameDimY")
    field(SCAN, "I/O Intr")
}

record(stringout, "$(CAM):HDF51:PosNameDim3")
{
    field(DTYP, "asynOctetWrite")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_posNameDim3")
    field(PINI, "YES")
}

record(stringin, "$(CAM):HDF51:PosNameDim3_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_posNameDim3")
    field(SCAN, "I/O Intr")
}

record(stringout, "$(CAM):HDF51:PosNameDim4")
{
    field(DTYP, "asynOctetWrite")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_posNameDim4")
    field(PINI, "YES")
}

record(stringin, "$(CAM):HDF51:PosNameDim4_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_posNameDim4")
    field(SCAN, "I/O Intr")
}

record(stringout, "$(CAM):HDF51:PosNameDim5")
{
    field(DTYP, "asynOctetWrite")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_posNameDim5")
    field(PINI, "YES")
}

record(stringin, "$(CAM):HDF51:PosNameDim5_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_posNameDim5")
    field(SCAN, "I/O Intr")
}

record(stringout, "$(CAM):HDF51:PosNameDim6")
{
    field(DTYP, "asynOctetWrite")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_posNameDim6")
    field(PINI, "YES")
}

record(stringin, "$(CAM):HDF51:PosNameDim6_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_posNameDim6")
    field(SCAN, "I/O Intr")
}

record(stringout, "$(CAM):HDF51:PosNameDim7")
{
    field(DTYP, "asynOctetWrite")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_posNameDim7")
    field(PINI, "YES")
}

record(stringin, "$(CAM):HDF51:PosNameDim7_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_posNameDim7")
    field(SCAN, "I/O Intr")
}

record(stringout, "$(CAM):HDF51:PosNameDim8")
{
    field(DTYP, "asynOctetWrite")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_posNameDim8")
    field(PINI, "YES")
}

record(stringin, "$(CAM):HDF51:PosNameDim8_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_posNameDim8")
    field(SCAN, "I/O Intr")
}

record(stringout, "$(CAM):HDF51:PosNameDim9")
{
    field(DTYP, "asynOctetWrite")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_posNameDim9")
    field(PINI, "YES")
}

record(stringin, "$(CAM):HDF51:PosNameDim9_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_posNameDim9")
    field(SCAN, "I/O Intr")
}

record(stringout, "$(CAM):HDF51:PosIndexDimN")
{
    field(DTYP, "asynOctetWrite")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_posIndexDimN")
    field(PINI, "YES")
}

record(stringin, "$(CAM):HDF51:PosIndexDimN_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_posIndexDimN")
    field(SCAN, "I/O Intr")
}

record(stringout, "$(CAM):HDF51:PosIndexDimX")
{
    field(DTYP, "asynOctetWrite")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_posIndexDimX")
    field(PINI, "YES")
}

record(stringin, "$(CAM):HDF51:PosIndexDimX_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_posIndexDimX")
    field(SCAN, "I/O Intr")
}

record(stringout, "$(CAM):HDF51:PosIndexDimY")
{
    field(DTYP, "asynOctetWrite")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_posIndexDimY")
    field(PINI, "YES")
}

record(stringin, "$(CAM):HDF51:PosIndexDimY_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_posIndexDimY")
    field(SCAN, "I/O Intr")
}

record(stringout, "$(CAM):HDF51:PosIndexDim3")
{
    field(DTYP, "asynOctetWrite")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_posIndexDim3")
    field(PINI, "YES")
}

record(stringin, "$(CAM):HDF51:PosIndexDim3_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_posIndexDim3")
    field(SCAN, "I/O Intr")
}

record(stringout, "$(CAM):HDF51:PosIndexDim4")
{
    field(DTYP, "asynOctetWrite")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_posIndexDim4")
    field(PINI, "YES")
}

record(stringin, "$(CAM):HDF51:PosIndexDim4_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_posIndexDim4")
    field(SCAN, "I/O Intr")
}

record(stringout, "$(CAM):HDF51:PosIndexDim5")
{
    field(DTYP, "asynOctetWrite")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_posIndexDim5")
    field(PINI, "YES")
}

record(stringin, "$(CAM):HDF51:PosIndexDim5_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_posIndexDim5")
    field(SCAN, "I/O Intr")
}

record(stringout, "$(CAM):HDF51:PosIndexDim6")
{
    field(DTYP, "asynOctetWrite")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_posIndexDim6")
    field(PINI, "YES")
}

record(stringin, "$(CAM):HDF51:PosIndexDim6_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_posIndexDim6")
    field(SCAN, "I/O Intr")
}

record(stringout, "$(CAM):HDF51:PosIndexDim7")
{
    field(DTYP, "asynOctetWrite")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_posIndexDim7")
    field(PINI, "YES")
}

record(stringin, "$(CAM):HDF51:PosIndexDim7_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_posIndexDim7")
    field(SCAN, "I/O Intr")
}

record(stringout, "$(CAM):HDF51:PosIndexDim8")
{
    field(DTYP, "asynOctetWrite")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_posIndexDim8")
    field(PINI, "YES")
}

record(stringin, "$(CAM):HDF51:PosIndexDim8_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_posIndexDim8")
    field(SCAN, "I/O Intr")
}

record(stringout, "$(CAM):HDF51:PosIndexDim9")
{
    field(DTYP, "asynOctetWrite")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_posIndexDim9")
    field(PINI, "YES")
}

record(stringin, "$(CAM):HDF51:PosIndexDim9_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_posIndexDim9")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):HDF51:FillValue")
{
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_fillValue")
    field(PINI, "YES")
    field(PREC, "1")
}

record(ai, "$(CAM):HDF51:FillValue_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_fillValue")
    field(SCAN, "I/O Intr")
    field(PREC, "1")
}

record(longout, "$(CAM):HDF51:ExtraDimChunkX")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_extraDimChunkX")
    field(PINI, "YES")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):HDF51:ExtraDimChunkX_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_extraDimChunkX")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):HDF51:ExtraDimChunkY")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_extraDimChunkY")
    field(PINI, "YES")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):HDF51:ExtraDimChunkY_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_extraDimChunkY")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):HDF51:ExtraDimChunk3")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_extraDimChunk3")
    field(PINI, "YES")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):HDF51:ExtraDimChunk3_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_extraDimChunk3")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):HDF51:ExtraDimChunk4")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_extraDimChunk4")
    field(PINI, "YES")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):HDF51:ExtraDimChunk4_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_extraDimChunk4")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):HDF51:ExtraDimChunk5")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_extraDimChunk5")
    field(PINI, "YES")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):HDF51:ExtraDimChunk5_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_extraDimChunk5")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):HDF51:ExtraDimChunk6")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_extraDimChunk6")
    field(PINI, "YES")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):HDF51:ExtraDimChunk6_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_extraDimChunk6")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):HDF51:ExtraDimChunk7")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_extraDimChunk7")
    field(PINI, "YES")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):HDF51:ExtraDimChunk7_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_extraDimChunk7")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):HDF51:ExtraDimChunk8")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_extraDimChunk8")
    field(PINI, "YES")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):HDF51:ExtraDimChunk8_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_extraDimChunk8")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):HDF51:ExtraDimChunk9")
{
    field(DTYP, "asynInt32")
    field(OUT, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_extraDimChunk9")
    field(PINI, "YES")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):HDF51:ExtraDimChunk9_RBV")
{
    field(DTYP, "asynInt32")
    field(INP, "@asyn(HDF51,$(ADDR=0),$(TIMEOUT=1))HDF5_extraDimChunk9")
    field(SCAN, "I/O Intr")
}
#=================================================================#
# Template file: NDFile.template
# Database for NDFile driver, which saves files for NDArray data.
# Mark Rivers
# April 7, 2008

###################################################################
#  These records control file I/O                                 # 
###################################################################

# File path.
record(waveform, "$(CAM):JPEG1:FilePath")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))FILE_PATH")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

record(waveform, "$(CAM):JPEG1:FilePath_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))FILE_PATH")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

record(bi, "$(CAM):JPEG1:FilePathExists_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))FILE_PATH_EXISTS")
    field(ZNAM, "No")
    field(ZSV,  "MAJOR")
    field(ONAM, "Yes")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):JPEG1:CreateDirectory")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))CREATE_DIR")
    field(VAL,  "0" )
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):JPEG1:CreateDirectory_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))CREATE_DIR")
    field(VAL,  "")
    field(SCAN, "I/O Intr")
}

# Filename
record(waveform, "$(CAM):JPEG1:FileName")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))FILE_NAME")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

record(waveform, "$(CAM):JPEG1:FileName_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))FILE_NAME")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):JPEG1:FileNumber")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))FILE_NUMBER")
    field(VAL,  "1")
    info(asyn:READBACK, "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):JPEG1:FileNumber_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))FILE_NUMBER")
    field(SCAN, "I/O Intr")
}

# Autoincrement flag
record(bo, "$(CAM):JPEG1:AutoIncrement")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))AUTO_INCREMENT")
    field(VAL,  "1")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):JPEG1:AutoIncrement_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))AUTO_INCREMENT")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(SCAN, "I/O Intr")
}

# File template
record(waveform, "$(CAM):JPEG1:FileTemplate")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))FILE_TEMPLATE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

record(waveform, "$(CAM):JPEG1:FileTemplate_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))FILE_TEMPLATE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

# Full filename, including path
record(waveform, "$(CAM):JPEG1:FullFileName_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))FULL_FILE_NAME")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

# Autosave flag
record(bo, "$(CAM):JPEG1:AutoSave")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))AUTO_SAVE")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):JPEG1:AutoSave_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))AUTO_SAVE")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(SCAN, "I/O Intr")
}

# Write file
record(busy, "$(CAM):JPEG1:WriteFile")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))WRITE_FILE")
    field(ZNAM, "Done")
    field(ONAM, "Write")
}

record(bi, "$(CAM):JPEG1:WriteFile_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))WRITE_FILE")
    field(ZNAM, "Done")
    field(ZSV,  "NO_ALARM")
    field(ONAM, "Writing")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}


# Read file
record(busy, "$(CAM):JPEG1:ReadFile")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))READ_FILE")
    field(ZNAM, "Done")
    field(ONAM, "Read")
}

record(bi, "$(CAM):JPEG1:ReadFile_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))READ_FILE")
    field(ZNAM, "Done")
    field(ZSV,  "NO_ALARM")
    field(ONAM, "Reading")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

# File data format 
record(mbbo, "$(CAM):JPEG1:FileFormat")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))FILE_FORMAT")
    field(VAL,  "0")
    field(ZRST, "Undefined")
    field(ZRVL, "0")
    field(ONST, "Invalid")
    field(ONVL, "1")
    info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):JPEG1:FileFormat_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))FILE_FORMAT")
    field(ZRST, "netCDF")
    field(ZRVL, "0")
    field(ONST, "Undefined")
    field(ONVL, "1")
    field(SCAN, "I/O Intr")
}

# File save mode 
record(mbbo, "$(CAM):JPEG1:FileWriteMode")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))WRITE_MODE")
    field(VAL,  "0")
    field(ZRST, "Single")
    field(ZRVL, "0")
    field(ONST, "Capture")
    field(ONVL, "1")
    field(TWST, "Stream")
    field(TWVL, "2")
    info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):JPEG1:FileWriteMode_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))WRITE_MODE")
    field(ZRST, "Single")
    field(ZRVL, "0")
    field(ONST, "Capture")
    field(ONVL, "1")
    field(TWST, "Stream")
    field(TWVL, "2")
    field(SCAN, "I/O Intr")
}

# Capture data
record(busy, "$(CAM):JPEG1:Capture")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))CAPTURE")
    field(ZNAM, "Done")
    field(ONAM, "Capture")
    field(ZSV,  "NO_ALARM")
    field(OSV,  "NO_ALARM")
    info(autosaveFields, "OSV ZSV")
}

record(bi, "$(CAM):JPEG1:Capture_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))CAPTURE")
    field(ZNAM, "Done")
    field(ZSV,  "NO_ALARM")
    field(ONAM, "Capturing")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):JPEG1:NumCapture")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))NUM_CAPTURE")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):JPEG1:NumCapture_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))NUM_CAPTURE")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):JPEG1:NumCaptured_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))NUM_CAPTURED")
    field(SCAN, "I/O Intr")
}

# Delete driver file flag
record(bo, "$(CAM):JPEG1:DeleteDriverFile")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))DELETE_DRIVER_FILE")
    field(VAL,  "0")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):JPEG1:DeleteDriverFile_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))DELETE_DRIVER_FILE")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(SCAN, "I/O Intr")
}

record(bi, "$(CAM):JPEG1:WriteStatus")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))WRITE_STATUS")
    field(ZNAM, "Write OK")
    field(ZSV,  "NO_ALARM")
    field(ONAM, "Write error")
    field(OSV,  "MAJOR")
    field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):JPEG1:WriteMessage")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))WRITE_MESSAGE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):JPEG1:LazyOpen")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))FILE_LAZY_OPEN")
    field(VAL,  "0")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):JPEG1:LazyOpen_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))FILE_LAZY_OPEN")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(SCAN, "I/O Intr")
}

record(stringout, "$(CAM):JPEG1:TempSuffix")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(OUT,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))FILE_TEMP_SUFFIX")
    field(VAL,  "")
}

record(stringin, "$(CAM):JPEG1:TempSuffix_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))FILE_TEMP_SUFFIX")
    field(VAL,  "")
    field(SCAN, "I/O Intr")
}
# Database to add automatic reset of FileNumber on changes
# to FilePath, FileTemplate, or FileName

# Add FLNKS to ResetFileNumber
record(waveform, "$(CAM):JPEG1:FilePath")
{
    field(FLNK, "$(CAM):JPEG1:ResetFileNumber" )
}
record(waveform, "$(CAM):JPEG1:FileName")
{
    field(FLNK, "$(CAM):JPEG1:ResetFileNumber" )
}
record(waveform, "$(CAM):JPEG1:FileTemplate")
{
    field(FLNK, "$(CAM):JPEG1:ResetFileNumber" )
}

# AutoFileNumberReset flag
record(bo, "$(CAM):JPEG1:AutoFileNumberReset")
{
    field(PINI, "YES")
    field(VAL,  "1")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info( autosaveFields, "VAL" )
}

record(calcout, "$(CAM):JPEG1:ResetFileNumber")
{
    field(INPA, "$(CAM):JPEG1:AutoFileNumberReset NPP")
    field(CALC, "A")
    field(OOPT, "When Non-zero" )
    field(OUT,  "$(CAM):JPEG1:FileNumber PP")
}
#=================================================================#
# Template file: NDFileJPEG.template
# Database for NDFileJPEG driver, which saves NDArray data 
# in the JPEG file format
# Mark Rivers
# May 10, 2009

#=================================================================#
# Template file: NDFile.template
# Database for NDFile driver, which saves files for NDArray data.
# Mark Rivers
# April 7, 2008

###################################################################
#  These records control file I/O                                 # 
###################################################################

# File path.
record(waveform, "$(CAM):JPEG1:FilePath")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))FILE_PATH")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

record(waveform, "$(CAM):JPEG1:FilePath_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))FILE_PATH")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

record(bi, "$(CAM):JPEG1:FilePathExists_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))FILE_PATH_EXISTS")
    field(ZNAM, "No")
    field(ZSV,  "MAJOR")
    field(ONAM, "Yes")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):JPEG1:CreateDirectory")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))CREATE_DIR")
    field(VAL,  "0" )
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):JPEG1:CreateDirectory_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))CREATE_DIR")
    field(VAL,  "")
    field(SCAN, "I/O Intr")
}

# Filename
record(waveform, "$(CAM):JPEG1:FileName")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))FILE_NAME")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

record(waveform, "$(CAM):JPEG1:FileName_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))FILE_NAME")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):JPEG1:FileNumber")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))FILE_NUMBER")
    field(VAL,  "1")
    info(asyn:READBACK, "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):JPEG1:FileNumber_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))FILE_NUMBER")
    field(SCAN, "I/O Intr")
}

# Autoincrement flag
record(bo, "$(CAM):JPEG1:AutoIncrement")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))AUTO_INCREMENT")
    field(VAL,  "1")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):JPEG1:AutoIncrement_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))AUTO_INCREMENT")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(SCAN, "I/O Intr")
}

# File template
record(waveform, "$(CAM):JPEG1:FileTemplate")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))FILE_TEMPLATE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

record(waveform, "$(CAM):JPEG1:FileTemplate_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))FILE_TEMPLATE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

# Full filename, including path
record(waveform, "$(CAM):JPEG1:FullFileName_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))FULL_FILE_NAME")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

# Autosave flag
record(bo, "$(CAM):JPEG1:AutoSave")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))AUTO_SAVE")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):JPEG1:AutoSave_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))AUTO_SAVE")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(SCAN, "I/O Intr")
}

# Write file
record(busy, "$(CAM):JPEG1:WriteFile")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))WRITE_FILE")
    field(ZNAM, "Done")
    field(ONAM, "Write")
}

record(bi, "$(CAM):JPEG1:WriteFile_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))WRITE_FILE")
    field(ZNAM, "Done")
    field(ZSV,  "NO_ALARM")
    field(ONAM, "Writing")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}


# Read file
record(busy, "$(CAM):JPEG1:ReadFile")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))READ_FILE")
    field(ZNAM, "Done")
    field(ONAM, "Read")
}

record(bi, "$(CAM):JPEG1:ReadFile_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))READ_FILE")
    field(ZNAM, "Done")
    field(ZSV,  "NO_ALARM")
    field(ONAM, "Reading")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

# File data format 
record(mbbo, "$(CAM):JPEG1:FileFormat")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))FILE_FORMAT")
    field(VAL,  "0")
    field(ZRST, "Undefined")
    field(ZRVL, "0")
    field(ONST, "Invalid")
    field(ONVL, "1")
    info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):JPEG1:FileFormat_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))FILE_FORMAT")
    field(ZRST, "netCDF")
    field(ZRVL, "0")
    field(ONST, "Undefined")
    field(ONVL, "1")
    field(SCAN, "I/O Intr")
}

# File save mode 
record(mbbo, "$(CAM):JPEG1:FileWriteMode")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))WRITE_MODE")
    field(VAL,  "0")
    field(ZRST, "Single")
    field(ZRVL, "0")
    field(ONST, "Capture")
    field(ONVL, "1")
    field(TWST, "Stream")
    field(TWVL, "2")
    info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):JPEG1:FileWriteMode_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))WRITE_MODE")
    field(ZRST, "Single")
    field(ZRVL, "0")
    field(ONST, "Capture")
    field(ONVL, "1")
    field(TWST, "Stream")
    field(TWVL, "2")
    field(SCAN, "I/O Intr")
}

# Capture data
record(busy, "$(CAM):JPEG1:Capture")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))CAPTURE")
    field(ZNAM, "Done")
    field(ONAM, "Capture")
    field(ZSV,  "NO_ALARM")
    field(OSV,  "NO_ALARM")
    info(autosaveFields, "OSV ZSV")
}

record(bi, "$(CAM):JPEG1:Capture_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))CAPTURE")
    field(ZNAM, "Done")
    field(ZSV,  "NO_ALARM")
    field(ONAM, "Capturing")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):JPEG1:NumCapture")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))NUM_CAPTURE")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):JPEG1:NumCapture_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))NUM_CAPTURE")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):JPEG1:NumCaptured_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))NUM_CAPTURED")
    field(SCAN, "I/O Intr")
}

# Delete driver file flag
record(bo, "$(CAM):JPEG1:DeleteDriverFile")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))DELETE_DRIVER_FILE")
    field(VAL,  "0")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):JPEG1:DeleteDriverFile_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))DELETE_DRIVER_FILE")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(SCAN, "I/O Intr")
}

record(bi, "$(CAM):JPEG1:WriteStatus")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))WRITE_STATUS")
    field(ZNAM, "Write OK")
    field(ZSV,  "NO_ALARM")
    field(ONAM, "Write error")
    field(OSV,  "MAJOR")
    field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):JPEG1:WriteMessage")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))WRITE_MESSAGE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):JPEG1:LazyOpen")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))FILE_LAZY_OPEN")
    field(VAL,  "0")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):JPEG1:LazyOpen_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))FILE_LAZY_OPEN")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(SCAN, "I/O Intr")
}

record(stringout, "$(CAM):JPEG1:TempSuffix")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(OUT,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))FILE_TEMP_SUFFIX")
    field(VAL,  "")
}

record(stringin, "$(CAM):JPEG1:TempSuffix_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))FILE_TEMP_SUFFIX")
    field(VAL,  "")
    field(SCAN, "I/O Intr")
}
#=================================================================#
# Template file: NDPluginBase.template
# Database for NDPluginBase, i.e. records common to all plugins
# Mark Rivers
# April 25, 2008

#=================================================================#
# Template file: NDArrayBase.template
# Database for area detector control using asyn driver and standard asyn device support
# Mark Rivers
# March 9, 2008

###################################################################
#  This record contains the version of ADCore                     #
###################################################################

record(stringin, "$(CAM):JPEG1:ADCoreVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))ADCORE_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the version of the driver or plugin       #
###################################################################

record(stringin, "$(CAM):JPEG1:DriverVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))DRIVER_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the asyn port name of this detector       #
###################################################################

record(stringin, "$(CAM):JPEG1:PortName_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))PORT_NAME_SELF")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records contain basic information about the detector     # 
###################################################################

record(stringin, "$(CAM):JPEG1:Manufacturer_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))MANUFACTURER")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):JPEG1:Model_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))MODEL")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):JPEG1:SerialNumber_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))SERIAL_NUMBER")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):JPEG1:SDKVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))SDK_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):JPEG1:FirmwareVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))FIRMWARE_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control acquisition start and stop               #
###################################################################

record(bo, "$(CAM):JPEG1:Acquire") {
   field(DTYP, "asynInt32")
   field(OUT, "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))ACQUIRE")
   field(ZNAM, "Done")
   field(ONAM, "Acquire")
   field(VAL,  "0")
   field(FLNK, "$(CAM):JPEG1:SetAcquireBusy")
   info(asyn:READBACK, "1")
}

record(bi, "$(CAM):JPEG1:Acquire_RBV") {
   field(DTYP, "asynInt32")
   field(INP, "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))ACQUIRE")
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):JPEG1:SetAcquireBusy")
{
    field(INPA, "$(CAM):JPEG1:Acquire NPP")
    field(CALC, "A")
    field(OOPT, "Transition To Non-zero")
    field(OUT,  "$(CAM):JPEG1:AcquireBusy PP")
}

record(busy, "$(CAM):JPEG1:AcquireBusy") {
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(VAL,  "0")
}

record(bi, "$(CAM):JPEG1:AcquireBusyCB") {
   field(DTYP, "asynInt32")
   field(INP, "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))ACQUIRE_BUSY")
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):JPEG1:ClearAcquireBusy") {
    field(INPA, "$(CAM):JPEG1:AcquireBusyCB CP")
    field(CALC, "A")
    field(OOPT, "Transition To Zero")
    field(OUT,  "$(CAM):JPEG1:AcquireBusy PP")
}

record(bo, "$(CAM):JPEG1:WaitForPlugins") {
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT, "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))WAIT_FOR_PLUGINS")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(VAL,  "0")
}

###################################################################
#  These records are the array size and data type                 #
###################################################################
# The number of dimensions
record(longout, "$(CAM):JPEG1:NDimensions")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))ARRAY_NDIMENSIONS")
}

record(longin, "$(CAM):JPEG1:NDimensions_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))ARRAY_NDIMENSIONS")
    field(SCAN, "I/O Intr")
}

# The array dimensions waveform records
record(waveform, "$(CAM):JPEG1:Dimensions")
{
    field(DTYP, "asynInt32ArrayOut")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))ARRAY_DIMENSIONS")
    field(FTVL, "LONG")
    field(NELM, "10")
    field(FLNK, "$(CAM):JPEG1:Dim0SA")
}

record(subArray, "$(CAM):JPEG1:Dim0SA")
{
    field(INP,  "$(CAM):JPEG1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "0")
    field(FLNK, "$(CAM):JPEG1:ArraySize0")
}

record(longin, "$(CAM):JPEG1:ArraySize0")
{
    field(INP,  "$(CAM):JPEG1:Dim0SA")
    field(FLNK, "$(CAM):JPEG1:Dim1SA")
}

record(subArray, "$(CAM):JPEG1:Dim1SA")
{
    field(INP,  "$(CAM):JPEG1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "1")
    field(FLNK, "$(CAM):JPEG1:ArraySize1")
}

record(longin, "$(CAM):JPEG1:ArraySize1")
{
    field(INP,  "$(CAM):JPEG1:Dim1SA")
    field(FLNK, "$(CAM):JPEG1:Dim2SA")
}

record(subArray, "$(CAM):JPEG1:Dim2SA")
{
    field(INP,  "$(CAM):JPEG1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "2")
    field(FLNK, "$(CAM):JPEG1:ArraySize2")
}

record(longin, "$(CAM):JPEG1:ArraySize2")
{
    field(INP,  "$(CAM):JPEG1:Dim2SA")
    field(FLNK, "$(CAM):JPEG1:Dim3SA")
}

record(subArray, "$(CAM):JPEG1:Dim3SA")
{
    field(INP,  "$(CAM):JPEG1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "3")
    field(FLNK, "$(CAM):JPEG1:ArraySize3")
}

record(longin, "$(CAM):JPEG1:ArraySize3")
{
    field(INP,  "$(CAM):JPEG1:Dim3SA")
    field(FLNK, "$(CAM):JPEG1:Dim4SA")
}

record(subArray, "$(CAM):JPEG1:Dim4SA")
{
    field(INP,  "$(CAM):JPEG1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "4")
    field(FLNK, "$(CAM):JPEG1:ArraySize4")
}

record(longin, "$(CAM):JPEG1:ArraySize4")
{
    field(INP,  "$(CAM):JPEG1:Dim4SA")
    field(FLNK, "$(CAM):JPEG1:Dim5SA")
}

record(subArray, "$(CAM):JPEG1:Dim5SA")
{
    field(INP,  "$(CAM):JPEG1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "5")
    field(FLNK, "$(CAM):JPEG1:ArraySize5")
}

record(longin, "$(CAM):JPEG1:ArraySize5")
{
    field(INP,  "$(CAM):JPEG1:Dim5SA")
    field(FLNK, "$(CAM):JPEG1:Dim6SA")
}

record(subArray, "$(CAM):JPEG1:Dim6SA")
{
    field(INP,  "$(CAM):JPEG1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "6")
    field(FLNK, "$(CAM):JPEG1:ArraySize6")
}

record(longin, "$(CAM):JPEG1:ArraySize6")
{
    field(INP,  "$(CAM):JPEG1:Dim6SA")
    field(FLNK, "$(CAM):JPEG1:Dim7SA")
}

record(subArray, "$(CAM):JPEG1:Dim7SA")
{
    field(INP,  "$(CAM):JPEG1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "7")
    field(FLNK, "$(CAM):JPEG1:ArraySize7")
}

record(longin, "$(CAM):JPEG1:ArraySize7")
{
    field(INP,  "$(CAM):JPEG1:Dim7SA")
    field(FLNK, "$(CAM):JPEG1:Dim8SA")
}

record(subArray, "$(CAM):JPEG1:Dim8SA")
{
    field(INP,  "$(CAM):JPEG1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "8")
    field(FLNK, "$(CAM):JPEG1:ArraySize8")
}

record(longin, "$(CAM):JPEG1:ArraySize8")
{
    field(INP,  "$(CAM):JPEG1:Dim8SA")
    field(FLNK, "$(CAM):JPEG1:Dim9SA")
}

record(subArray, "$(CAM):JPEG1:Dim9SA")
{
    field(INP,  "$(CAM):JPEG1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "9")
    field(FLNK, "$(CAM):JPEG1:ArraySize9")
}

record(longin, "$(CAM):JPEG1:ArraySize9")
{
    field(INP,  "$(CAM):JPEG1:Dim9SA")
}


record(waveform, "$(CAM):JPEG1:Dimensions_RBV")
{
    field(DTYP, "asynInt32ArrayIn")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))ARRAY_DIMENSIONS")
    field(FTVL, "LONG")
    field(NELM, "10")
    field(FLNK, "$(CAM):JPEG1:Dim0SA_RBV")
    field(SCAN, "I/O Intr")
}

record(subArray, "$(CAM):JPEG1:Dim0SA_RBV")
{
    field(INP,  "$(CAM):JPEG1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "0")
    field(FLNK, "$(CAM):JPEG1:ArraySize0_RBV")
}

record(longin, "$(CAM):JPEG1:ArraySize0_RBV")
{
    field(INP,  "$(CAM):JPEG1:Dim0SA_RBV")
    field(FLNK, "$(CAM):JPEG1:Dim1SA_RBV")
}

record(subArray, "$(CAM):JPEG1:Dim1SA_RBV")
{
    field(INP,  "$(CAM):JPEG1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "1")
    field(FLNK, "$(CAM):JPEG1:ArraySize1_RBV")
}

record(longin, "$(CAM):JPEG1:ArraySize1_RBV")
{
    field(INP,  "$(CAM):JPEG1:Dim1SA_RBV")
    field(FLNK, "$(CAM):JPEG1:Dim2SA_RBV")
}

record(subArray, "$(CAM):JPEG1:Dim2SA_RBV")
{
    field(INP,  "$(CAM):JPEG1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "2")
    field(FLNK, "$(CAM):JPEG1:ArraySize2_RBV")
}

record(longin, "$(CAM):JPEG1:ArraySize2_RBV")
{
    field(INP,  "$(CAM):JPEG1:Dim2SA_RBV")
    field(FLNK, "$(CAM):JPEG1:Dim3SA_RBV")
}

record(subArray, "$(CAM):JPEG1:Dim3SA_RBV")
{
    field(INP,  "$(CAM):JPEG1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "3")
    field(FLNK, "$(CAM):JPEG1:ArraySize3_RBV")
}

record(longin, "$(CAM):JPEG1:ArraySize3_RBV")
{
    field(INP,  "$(CAM):JPEG1:Dim3SA_RBV")
    field(FLNK, "$(CAM):JPEG1:Dim4SA_RBV")
}

record(subArray, "$(CAM):JPEG1:Dim4SA_RBV")
{
    field(INP,  "$(CAM):JPEG1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "4")
    field(FLNK, "$(CAM):JPEG1:ArraySize4_RBV")
}

record(longin, "$(CAM):JPEG1:ArraySize4_RBV")
{
    field(INP,  "$(CAM):JPEG1:Dim4SA_RBV")
    field(FLNK, "$(CAM):JPEG1:Dim5SA_RBV")
}

record(subArray, "$(CAM):JPEG1:Dim5SA_RBV")
{
    field(INP,  "$(CAM):JPEG1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "5")
    field(FLNK, "$(CAM):JPEG1:ArraySize5_RBV")
}

record(longin, "$(CAM):JPEG1:ArraySize5_RBV")
{
    field(INP,  "$(CAM):JPEG1:Dim5SA_RBV")
    field(FLNK, "$(CAM):JPEG1:Dim6SA_RBV")
}

record(subArray, "$(CAM):JPEG1:Dim6SA_RBV")
{
    field(INP,  "$(CAM):JPEG1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "6")
    field(FLNK, "$(CAM):JPEG1:ArraySize6_RBV")
}

record(longin, "$(CAM):JPEG1:ArraySize6_RBV")
{
    field(INP,  "$(CAM):JPEG1:Dim6SA_RBV")
    field(FLNK, "$(CAM):JPEG1:Dim7SA_RBV")
}

record(subArray, "$(CAM):JPEG1:Dim7SA_RBV")
{
    field(INP,  "$(CAM):JPEG1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "7")
    field(FLNK, "$(CAM):JPEG1:ArraySize7_RBV")
}

record(longin, "$(CAM):JPEG1:ArraySize7_RBV")
{
    field(INP,  "$(CAM):JPEG1:Dim7SA_RBV")
    field(FLNK, "$(CAM):JPEG1:Dim8SA_RBV")
}

record(subArray, "$(CAM):JPEG1:Dim8SA_RBV")
{
    field(INP,  "$(CAM):JPEG1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "8")
    field(FLNK, "$(CAM):JPEG1:ArraySize8_RBV")
}

record(longin, "$(CAM):JPEG1:ArraySize8_RBV")
{
    field(INP,  "$(CAM):JPEG1:Dim8SA_RBV")
    field(FLNK, "$(CAM):JPEG1:Dim9SA_RBV")
}

record(subArray, "$(CAM):JPEG1:Dim9SA_RBV")
{
    field(INP,  "$(CAM):JPEG1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "9")
    field(FLNK, "$(CAM):JPEG1:ArraySize9_RBV")
}

record(longin, "$(CAM):JPEG1:ArraySize9_RBV")
{
    field(INP,  "$(CAM):JPEG1:Dim9SA_RBV")
}


record(mbbi, "$(CAM):JPEG1:BayerPattern_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))BAYER_PATTERN")
   field(ZRST, "RGGB")
   field(ZRVL, "0")
   field(ONST, "GBRG")
   field(ONVL, "1")
   field(TWST, "GRBG")
   field(TWVL, "2")
   field(THST, "BGGR")
   field(THVL, "3")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):JPEG1:ArraySizeX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_X")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):JPEG1:ArraySizeY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_Y")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):JPEG1:ArraySizeZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_Z")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):JPEG1:ArraySize_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records have information on the compression              # 
###################################################################
record(stringin, "$(CAM):JPEG1:Codec_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))CODEC")
   field(VAL,  "")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):JPEG1:CompressedSize_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))COMPRESSED_SIZE")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the data type                            # 
###################################################################

record(mbbo, "$(CAM):JPEG1:DataType")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))DATA_TYPE")
   field(ZRST, "Int8")
   field(ZRVL, "0")
   field(ONST, "UInt8")
   field(ONVL, "1")
   field(TWST, "Int16")
   field(TWVL, "2")
   field(THST, "UInt16")
   field(THVL, "3")
   field(FRST, "Int32")
   field(FRVL, "4")
   field(FVST, "UInt32")
   field(FVVL, "5")
   field(SXST, "Int64")
   field(SXVL, "6")
   field(SVST, "UInt64")
   field(SVVL, "7")
   field(EIST, "Float32")
   field(EIVL, "8")
   field(NIST, "Float64")
   field(NIVL, "9")
   field(VAL,  "0")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):JPEG1:DataType_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))DATA_TYPE")
   field(ZRST, "Int8")
   field(ZRVL, "0")
   field(ONST, "UInt8")
   field(ONVL, "1")
   field(TWST, "Int16")
   field(TWVL, "2")
   field(THST, "UInt16")
   field(THVL, "3")
   field(FRST, "Int32")
   field(FRVL, "4")
   field(FVST, "UInt32")
   field(FVVL, "5")
   field(SXST, "Int64")
   field(SXVL, "6")
   field(SVST, "UInt64")
   field(SVVL, "7")
   field(EIST, "Float32")
   field(EIVL, "8")
   field(NIST, "Float64")
   field(NIVL, "9")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):JPEG1:BitsPerPixel_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))BITS_PER_PIXEL")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the color mode                           #
#  These choices must agree with NDColorMode_t in NDArray.h       # 
###################################################################

record(mbbo, "$(CAM):JPEG1:ColorMode")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))COLOR_MODE")
   field(ZRST, "Mono")
   field(ZRVL, "0")
   field(ONST, "Bayer")
   field(ONVL, "1")
   field(TWST, "RGB1")
   field(TWVL, "2")
   field(THST, "RGB2")
   field(THVL, "3")
   field(FRST, "RGB3")
   field(FRVL, "4")
   field(FVST, "YUV444")
   field(FVVL, "5")
   field(SXST, "YUV422")
   field(SXVL, "6")
   field(SVST, "YUV421")
   field(SVVL, "7")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):JPEG1:ColorMode_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))COLOR_MODE")
   field(ZRST, "Mono")
   field(ZRVL, "0")
   field(ONST, "Bayer")
   field(ONVL, "1")
   field(TWST, "RGB1")
   field(TWVL, "2")
   field(THST, "RGB2")
   field(THVL, "3")
   field(FRST, "RGB3")
   field(FRVL, "4")
   field(FVST, "YUV444")
   field(FVVL, "5")
   field(SXST, "YUV422")
   field(SXVL, "6")
   field(SVST, "YUV421")
   field(SVVL, "7")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records are the uniqueId and time stamps of the array     #
###################################################################
record(longin, "$(CAM):JPEG1:UniqueId_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))UNIQUE_ID")
    field(SCAN, "I/O Intr")
}

record(ai, "$(CAM):JPEG1:TimeStamp_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))TIME_STAMP")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):JPEG1:EpicsTSSec_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))EPICS_TS_SEC")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):JPEG1:EpicsTSNsec_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))EPICS_TS_NSEC")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records provide statistics on array callbacks and        #
#  array callback rates                                           # 
###################################################################
record(longout, "$(CAM):JPEG1:ArrayCounter")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))ARRAY_COUNTER")
}

record(longin, "$(CAM):JPEG1:ArrayCounter_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))ARRAY_COUNTER")
    field(SCAN, "I/O Intr")
    field(TSE,  "-2")
    field(LOW,  "0" )
    field(LSV,  "MINOR" )
    info(autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV TSE")
}

# Updated rate calculation to use a smoothing factor w/ guard against negative values
# 0 rate sets alarm state to MINOR
record(calc, "$(CAM):JPEG1:ArrayRate_RBV")
{
    field(INPA, "$(CAM):JPEG1:ArrayRate_RBV.LB NPP NMS")   # Previous counter (Last B value)
    field(INPB, "$(CAM):JPEG1:ArrayCounter_RBV NPP NMS")   # Current counter value
    field(INPC, "1.0")                                # Delta time in seconds
    field(INPD, "$(CAM):JPEG1:ArrayRate_RBV.VAL NPP NMS")  # Previous rate
    field(INPE, "0.0")                 # Smoothing factor
    field(CALC, "(D*E)/C+MAX(0,B-A)*(1-E)/C")
    field(PREC, "2" )
    field(EGU,  "Hz" )
    field(SCAN, "1 second")
    field(LOW,  "0")
    field(LSV,  "MINOR")
    field(ADEL, "0.1")
    info(autosaveFields, "ADEL DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV MDEL PREC C E SCAN EGU")
}

###################################################################
#  These records control NDArray callacks                         # 
###################################################################
record(bo, "$(CAM):JPEG1:ArrayCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))ARRAY_CALLBACKS")
    field(ZNAM, "Disable")
    field(ZSV,  "MINOR")
    field(ONAM, "Enable")
    field(OSV,  "NO_ALARM")
    field(VAL, "1")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):JPEG1:ArrayCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))ARRAY_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ZSV,  "MINOR")
    field(ONAM, "Enabled")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains macro definitions for the attributes      # 
###################################################################

record(waveform, "$(CAM):JPEG1:NDAttributesMacros")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_MACROS")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

###################################################################
#  This record is the name of a file defining attributes          # 
###################################################################

record(waveform, "$(CAM):JPEG1:NDAttributesFile")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_FILE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

###################################################################
#  This record defines the status of reading attributes file      # 
###################################################################

record(mbbi, "$(CAM):JPEG1:NDAttributesStatus")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_STATUS")
    field(ZRVL, "0")
    field(ZRST, "Attributes file OK")
    field(ZRSV, "NO_ALARM")
    field(ONVL, "1")
    field(ONST, "File not found")
    field(ONSV, "MINOR")
    field(TWVL, "2")
    field(TWST, "XML syntax error")
    field(TWSV, "MAJOR")
    field(THVL, "3")
    field(THST, "Macro substitution error")
    field(THSV, "MAJOR")
    field(SCAN, "I/O Intr")
}

###################################################################
#  Status of NDArrayPool - number of buffers, memory used etc.    # 
###################################################################

record(ai, "$(CAM):JPEG1:PoolMaxMem")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))POOL_MAX_MEMORY")
   field(PREC, "1")
   field(EGU,  "MB")
   field(SCAN, "Passive")
   field(PINI, "YES")
}

record(ai, "$(CAM):JPEG1:PoolUsedMem")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))POOL_USED_MEMORY")
   field(PREC, "1")
   field(EGU,  "MB")
   field(SCAN, "1 second")
   field(FLNK, "$(CAM):JPEG1:PoolAllocBuffers")
   info(autosaveFields, "SCAN")
}

record(longin, "$(CAM):JPEG1:PoolAllocBuffers")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))POOL_ALLOC_BUFFERS")
   field(FLNK, "$(CAM):JPEG1:PoolFreeBuffers")
}

record(longin, "$(CAM):JPEG1:PoolFreeBuffers")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))POOL_FREE_BUFFERS")
   field(FLNK, "$(CAM):JPEG1:PoolUsedBuffers")
}

record(calc, "$(CAM):JPEG1:PoolUsedBuffers")
{
    field(INPA, "$(CAM):JPEG1:PoolAllocBuffers NPP MS")
    field(INPB, "$(CAM):JPEG1:PoolFreeBuffers NPP MS")
    field(CALC, "A-B")
}

record(bo, "$(CAM):JPEG1:EmptyFreeList")
{
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))POOL_EMPTY_FREELIST")
}

record(longin, "$(CAM):JPEG1:NumQueuedArrays")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))NUM_QUEUED_ARRAYS")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the type of plugin                        #
###################################################################

record(stringin, "$(CAM):JPEG1:PluginType_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))PLUGIN_TYPE")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the connection of the server to          #
#  an NDArray driver port and address                             #
###################################################################
# Array port name
record(stringout, "$(CAM):JPEG1:NDArrayPort")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(OUT,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))NDARRAY_PORT")
    field(VAL,  "$(CAM_PORT)")
    info(autosaveFields, "DESC VAL")
}

record(stringin, "$(CAM):JPEG1:NDArrayPort_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))NDARRAY_PORT")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):JPEG1:NDArrayAddress")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))NDARRAY_ADDR")
    field(VAL,  "$(NDARRAY_ADDR=0)")
    info(autosaveFields, "DESC VAL")
}

record(longin, "$(CAM):JPEG1:NDArrayAddress_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))NDARRAY_ADDR")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control whether callbacks are enabled and        #
#  minimum time between callbacks                                 #
###################################################################
record(bo, "$(CAM):JPEG1:EnableCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))ENABLE_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    field(VAL,  "0")
    info(autosaveFields, "DESC VAL")
}

record(bi, "$(CAM):JPEG1:EnableCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))ENABLE_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    field(ZSV,  "MINOR")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):JPEG1:MinCallbackTime")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))MIN_CALLBACK_TIME")
    field(EGU,  "s")
    field(PREC, "3")
    field(VAL,  "0.0")
    field(DRVL, "0")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):JPEG1:MinCallbackTime_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))MIN_CALLBACK_TIME")
    field(EGU,  "s")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):JPEG1:MaxArrayRate")
{
    field(DTYP, "Soft Channel")
    field(OUT,  "$(CAM):JPEG1:MaxArrayRate_COUT PP")
    field(EGU,  "Hz")
    field(PREC, "3")
    field(VAL,  "0.0")
    info(autosaveFields, "VAL")
}

record(calcout, "$(CAM):JPEG1:MaxArrayRate_COUT")
{
    field(INPA, "$(CAM):JPEG1:MaxArrayRate")
    field(CALC, "A=0?0:1.0/A")
    field(OUT,  "$(CAM):JPEG1:MinCallbackTime PP")
}

record(calc, "$(CAM):JPEG1:MaxArrayRate_RBV")
{
    field(INPA, "$(CAM):JPEG1:MinCallbackTime_RBV CP")
    field(CALC, "A=0?0:1.0/A")
    field(EGU,  "Hz")
    field(PREC, "3")
    field(SCAN, "Passive")
}

record(ao, "$(CAM):JPEG1:MaxByteRate")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))MAX_BYTE_RATE")
    field(EGU,  "s")
    field(PREC, "3")
    field(VAL,  "0.0")
    field(DRVL, "0")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):JPEG1:MaxByteRate_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))MAX_BYTE_RATE")
    field(EGU,  "s")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the last execution time of the plugin     #
###################################################################
record(ai, "$(CAM):JPEG1:ExecutionTime_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))EXECUTION_TIME")
    field(EGU,  "ms")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record requests that the plugin execute again with the    #
#  same NDArray                                                   #
###################################################################
record(bo, "$(CAM):JPEG1:ProcessPlugin")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))PROCESS_PLUGIN")
    field(VAL,  "1")
}

###################################################################
#  These records control whether callbacks block or not           #
###################################################################
record(bo, "$(CAM):JPEG1:BlockingCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))BLOCKING_CALLBACKS")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(VAL,  "0")
    info(autosaveFields, "DESC ZSV OSV VAL")
}

record(bi, "$(CAM):JPEG1:BlockingCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))BLOCKING_CALLBACKS")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(ZSV,  "NO_ALARM")
    field(OSV,  "MINOR")
    field(SCAN, "I/O Intr")
    info( autosaveFields, "DESC ZSV OSV" )
}


record(longout, "$(CAM):JPEG1:DroppedArrays")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))DROPPED_ARRAYS")
    field(VAL,  "0")
    info( autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV EGU" )
}

record(longin, "$(CAM):JPEG1:DroppedArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))DROPPED_ARRAYS")
    field(SCAN, "I/O Intr")
    field(HIGH, "1")
    field(HSV,  "MINOR")
    info( autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV EGU" )
}

record(longout, "$(CAM):JPEG1:QueueSize")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))QUEUE_SIZE")
    field(PINI, "YES")
    info( autosaveFields, "DESC EGU" )
}

record(longin, "$(CAM):JPEG1:QueueSize_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))QUEUE_SIZE")
    field(FLNK, "$(CAM):JPEG1:QueueFreeLow")
    field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):JPEG1:QueueFreeLow") {
    field(CALC, "A*0.25")
    field(INPA, "$(CAM):JPEG1:QueueSize")
    field(OUT,  "$(CAM):JPEG1:QueueFree.LOW")
    field(FLNK, "$(CAM):JPEG1:QueueUseHIGH")
}

# Set a HIGH warning level for the input queue fill level to 75%
# of the full size of the queue
record(calcout, "$(CAM):JPEG1:QueueUseHIGH") {
   field(CALC, "A*0.75")
   field(INPA, "$(CAM):JPEG1:QueueSize")
   field(OUT,  "$(CAM):JPEG1:QueueUse.HIGH")
   field(FLNK, "$(CAM):JPEG1:QueueUseHIHI")
}

# Set a HIHI level for the input queue fill level to indicate an error
# (MAJOR alarm)  when it fills up to the full size of the queue (frames start dropping)
record(calcout, "$(CAM):JPEG1:QueueUseHIHI") {
   field(CALC, "A*1.0")
   field(INPA, "$(CAM):JPEG1:QueueSize")
   field(OUT,  "$(CAM):JPEG1:QueueUse.HIHI")
}

record(longin, "$(CAM):JPEG1:QueueFree")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))QUEUE_FREE")
    field(LLSV, "MAJOR")
    field(LSV,  "MINOR")
    field(LOLO, "0")
    field(HYST, "1")
    field(SCAN, "I/O Intr")
}

# Display the fill level on the plugins input queue
record(calc, "$(CAM):JPEG1:QueueUse") {
    field(CALC, "A-B")
    field(INPA, "$(CAM):JPEG1:QueueSize")
    field(INPB, "$(CAM):JPEG1:QueueFree CP")
    field(SCAN, "Passive")
    field(HHSV, "MAJOR")
    field(HSV,  "MINOR")
    field(HYST, "1")
}

record(longout, "$(CAM):JPEG1:NumThreads")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))NUM_THREADS")
    field(VAL,  "1")
    field(PINI, "YES")
    info(autosaveFields, "DESC VAL")
}

record(longin, "$(CAM):JPEG1:NumThreads_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))NUM_THREADS")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):JPEG1:MaxThreads_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))MAX_THREADS")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control output array sorting                     #
###################################################################
record(mbbo, "$(CAM):JPEG1:SortMode") {
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))SORT_MODE")
    field(ZRVL, "0")
    field(ZRST, "Unsorted")
    field(ONVL, "1")
    field(ONST, "Sorted")
}

record(mbbi, "$(CAM):JPEG1:SortMode_RBV") {
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))SORT_MODE")
    field(ZRVL, "0")
    field(ZRST, "Unsorted")
    field(ONVL, "1")
    field(ONST, "Sorted")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):JPEG1:SortTime") {
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))SORT_TIME")
    field(PREC, "3")
    field(VAL, "0.1")
}

record(ai, "$(CAM):JPEG1:SortTime_RBV") {
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))SORT_TIME")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):JPEG1:SortSize")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))SORT_SIZE")
    field(VAL,  "20")
    field(PINI, "YES")
}

record(longin, "$(CAM):JPEG1:SortSize_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))SORT_SIZE")
    field(FLNK, "$(CAM):JPEG1:SortFreeLow")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):JPEG1:SortFree") {
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))SORT_FREE")
    field(LLSV, "MAJOR")
    field(LSV,  "MINOR")
    field(LOLO, "0")
    field(HYST, "1")
    field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):JPEG1:SortFreeLow") {
    field(CALC, "A*0.25")
    field(INPA, "$(CAM):JPEG1:SortSize")
    field(OUT,  "$(CAM):JPEG1:SortFree.LOW")
}

record(longout, "$(CAM):JPEG1:DroppedOutputArrays")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))DROPPED_OUTPUT_ARRAYS")
    field(VAL,  "0")
}

record(longin, "$(CAM):JPEG1:DroppedOutputArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))DROPPED_OUTPUT_ARRAYS")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):JPEG1:DisorderedArrays")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))DISORDERED_ARRAYS")
    field(PINI, "YES")
}

record(longin, "$(CAM):JPEG1:DisorderedArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))DISORDERED_ARRAYS")
    field(SCAN, "I/O Intr")
}



###################################################################
#  The asynRecord is used for mainly for trace mask               # 
###################################################################
 
# Set ASYN_TRACEIO_HEX bit by default
record(asyn,"$(CAM):JPEG1:AsynIO")
{
    field(PORT, "JPEG1")
    field(TIB2,"1")
    info("ADType", "ADPlugin")
}


# We replace some fields in records defined in NDFile.template
# File data format 
record(mbbo, "$(CAM):JPEG1:FileFormat")
{
    field(ZRST, "JPEG")
    field(ZRVL, "0")
    field(ONST, "Invalid")
    field(ONVL, "1")
}

record(mbbi, "$(CAM):JPEG1:FileFormat_RBV")
{
    field(ZRST, "JPEG")
    field(ZRVL, "0")
    field(ONST, "Undefined")
    field(ONVL, "1")
}

# File quality 
record(longout, "$(CAM):JPEG1:JPEGQuality")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))JPEG_QUALITY")
    field(VAL,  "50")
    field(LOPR, "0")
    field(DRVL, "0")
    field(HOPR, "100")
    field(DRVH, "100")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):JPEG1:JPEGQuality_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(JPEG1,$(ADDR=0),$(TIMEOUT=1))JPEG_QUALITY")
    field(LOPR, "0")
    field(HOPR, "100")
    field(SCAN, "I/O Intr")
}
#=================================================================#
# Template file: NDFile.template
# Database for NDFile driver, which saves files for NDArray data.
# Mark Rivers
# April 7, 2008

###################################################################
#  These records control file I/O                                 # 
###################################################################

# File path.
record(waveform, "$(CAM):NetCDF1:FilePath")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))FILE_PATH")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

record(waveform, "$(CAM):NetCDF1:FilePath_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))FILE_PATH")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

record(bi, "$(CAM):NetCDF1:FilePathExists_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))FILE_PATH_EXISTS")
    field(ZNAM, "No")
    field(ZSV,  "MAJOR")
    field(ONAM, "Yes")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):NetCDF1:CreateDirectory")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))CREATE_DIR")
    field(VAL,  "0" )
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):NetCDF1:CreateDirectory_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))CREATE_DIR")
    field(VAL,  "")
    field(SCAN, "I/O Intr")
}

# Filename
record(waveform, "$(CAM):NetCDF1:FileName")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))FILE_NAME")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

record(waveform, "$(CAM):NetCDF1:FileName_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))FILE_NAME")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):NetCDF1:FileNumber")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))FILE_NUMBER")
    field(VAL,  "1")
    info(asyn:READBACK, "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):NetCDF1:FileNumber_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))FILE_NUMBER")
    field(SCAN, "I/O Intr")
}

# Autoincrement flag
record(bo, "$(CAM):NetCDF1:AutoIncrement")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))AUTO_INCREMENT")
    field(VAL,  "1")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):NetCDF1:AutoIncrement_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))AUTO_INCREMENT")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(SCAN, "I/O Intr")
}

# File template
record(waveform, "$(CAM):NetCDF1:FileTemplate")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))FILE_TEMPLATE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

record(waveform, "$(CAM):NetCDF1:FileTemplate_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))FILE_TEMPLATE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

# Full filename, including path
record(waveform, "$(CAM):NetCDF1:FullFileName_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))FULL_FILE_NAME")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

# Autosave flag
record(bo, "$(CAM):NetCDF1:AutoSave")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))AUTO_SAVE")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):NetCDF1:AutoSave_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))AUTO_SAVE")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(SCAN, "I/O Intr")
}

# Write file
record(busy, "$(CAM):NetCDF1:WriteFile")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))WRITE_FILE")
    field(ZNAM, "Done")
    field(ONAM, "Write")
}

record(bi, "$(CAM):NetCDF1:WriteFile_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))WRITE_FILE")
    field(ZNAM, "Done")
    field(ZSV,  "NO_ALARM")
    field(ONAM, "Writing")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}


# Read file
record(busy, "$(CAM):NetCDF1:ReadFile")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))READ_FILE")
    field(ZNAM, "Done")
    field(ONAM, "Read")
}

record(bi, "$(CAM):NetCDF1:ReadFile_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))READ_FILE")
    field(ZNAM, "Done")
    field(ZSV,  "NO_ALARM")
    field(ONAM, "Reading")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

# File data format 
record(mbbo, "$(CAM):NetCDF1:FileFormat")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))FILE_FORMAT")
    field(VAL,  "0")
    field(ZRST, "Undefined")
    field(ZRVL, "0")
    field(ONST, "Invalid")
    field(ONVL, "1")
    info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):NetCDF1:FileFormat_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))FILE_FORMAT")
    field(ZRST, "netCDF")
    field(ZRVL, "0")
    field(ONST, "Undefined")
    field(ONVL, "1")
    field(SCAN, "I/O Intr")
}

# File save mode 
record(mbbo, "$(CAM):NetCDF1:FileWriteMode")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))WRITE_MODE")
    field(VAL,  "0")
    field(ZRST, "Single")
    field(ZRVL, "0")
    field(ONST, "Capture")
    field(ONVL, "1")
    field(TWST, "Stream")
    field(TWVL, "2")
    info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):NetCDF1:FileWriteMode_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))WRITE_MODE")
    field(ZRST, "Single")
    field(ZRVL, "0")
    field(ONST, "Capture")
    field(ONVL, "1")
    field(TWST, "Stream")
    field(TWVL, "2")
    field(SCAN, "I/O Intr")
}

# Capture data
record(busy, "$(CAM):NetCDF1:Capture")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))CAPTURE")
    field(ZNAM, "Done")
    field(ONAM, "Capture")
    field(ZSV,  "NO_ALARM")
    field(OSV,  "NO_ALARM")
    info(autosaveFields, "OSV ZSV")
}

record(bi, "$(CAM):NetCDF1:Capture_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))CAPTURE")
    field(ZNAM, "Done")
    field(ZSV,  "NO_ALARM")
    field(ONAM, "Capturing")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):NetCDF1:NumCapture")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))NUM_CAPTURE")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):NetCDF1:NumCapture_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))NUM_CAPTURE")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):NetCDF1:NumCaptured_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))NUM_CAPTURED")
    field(SCAN, "I/O Intr")
}

# Delete driver file flag
record(bo, "$(CAM):NetCDF1:DeleteDriverFile")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))DELETE_DRIVER_FILE")
    field(VAL,  "0")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):NetCDF1:DeleteDriverFile_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))DELETE_DRIVER_FILE")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(SCAN, "I/O Intr")
}

record(bi, "$(CAM):NetCDF1:WriteStatus")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))WRITE_STATUS")
    field(ZNAM, "Write OK")
    field(ZSV,  "NO_ALARM")
    field(ONAM, "Write error")
    field(OSV,  "MAJOR")
    field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):NetCDF1:WriteMessage")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))WRITE_MESSAGE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):NetCDF1:LazyOpen")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))FILE_LAZY_OPEN")
    field(VAL,  "0")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):NetCDF1:LazyOpen_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))FILE_LAZY_OPEN")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(SCAN, "I/O Intr")
}

record(stringout, "$(CAM):NetCDF1:TempSuffix")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(OUT,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))FILE_TEMP_SUFFIX")
    field(VAL,  "")
}

record(stringin, "$(CAM):NetCDF1:TempSuffix_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))FILE_TEMP_SUFFIX")
    field(VAL,  "")
    field(SCAN, "I/O Intr")
}
# Database to add automatic reset of FileNumber on changes
# to FilePath, FileTemplate, or FileName

# Add FLNKS to ResetFileNumber
record(waveform, "$(CAM):NetCDF1:FilePath")
{
    field(FLNK, "$(CAM):NetCDF1:ResetFileNumber" )
}
record(waveform, "$(CAM):NetCDF1:FileName")
{
    field(FLNK, "$(CAM):NetCDF1:ResetFileNumber" )
}
record(waveform, "$(CAM):NetCDF1:FileTemplate")
{
    field(FLNK, "$(CAM):NetCDF1:ResetFileNumber" )
}

# AutoFileNumberReset flag
record(bo, "$(CAM):NetCDF1:AutoFileNumberReset")
{
    field(PINI, "YES")
    field(VAL,  "1")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info( autosaveFields, "VAL" )
}

record(calcout, "$(CAM):NetCDF1:ResetFileNumber")
{
    field(INPA, "$(CAM):NetCDF1:AutoFileNumberReset NPP")
    field(CALC, "A")
    field(OOPT, "When Non-zero" )
    field(OUT,  "$(CAM):NetCDF1:FileNumber PP")
}
#=================================================================#
# Template file: NDFileNetCDF.template
# Database for NDFileNetCDF driver, which saves NDArray data 
# in the netCDF file format
# Mark Rivers
# May 10, 2009

#=================================================================#
# Template file: NDFile.template
# Database for NDFile driver, which saves files for NDArray data.
# Mark Rivers
# April 7, 2008

###################################################################
#  These records control file I/O                                 # 
###################################################################

# File path.
record(waveform, "$(CAM):NetCDF1:FilePath")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))FILE_PATH")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

record(waveform, "$(CAM):NetCDF1:FilePath_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))FILE_PATH")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

record(bi, "$(CAM):NetCDF1:FilePathExists_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))FILE_PATH_EXISTS")
    field(ZNAM, "No")
    field(ZSV,  "MAJOR")
    field(ONAM, "Yes")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):NetCDF1:CreateDirectory")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))CREATE_DIR")
    field(VAL,  "0" )
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):NetCDF1:CreateDirectory_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))CREATE_DIR")
    field(VAL,  "")
    field(SCAN, "I/O Intr")
}

# Filename
record(waveform, "$(CAM):NetCDF1:FileName")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))FILE_NAME")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

record(waveform, "$(CAM):NetCDF1:FileName_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))FILE_NAME")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):NetCDF1:FileNumber")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))FILE_NUMBER")
    field(VAL,  "1")
    info(asyn:READBACK, "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):NetCDF1:FileNumber_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))FILE_NUMBER")
    field(SCAN, "I/O Intr")
}

# Autoincrement flag
record(bo, "$(CAM):NetCDF1:AutoIncrement")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))AUTO_INCREMENT")
    field(VAL,  "1")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):NetCDF1:AutoIncrement_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))AUTO_INCREMENT")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(SCAN, "I/O Intr")
}

# File template
record(waveform, "$(CAM):NetCDF1:FileTemplate")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))FILE_TEMPLATE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

record(waveform, "$(CAM):NetCDF1:FileTemplate_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))FILE_TEMPLATE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

# Full filename, including path
record(waveform, "$(CAM):NetCDF1:FullFileName_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))FULL_FILE_NAME")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

# Autosave flag
record(bo, "$(CAM):NetCDF1:AutoSave")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))AUTO_SAVE")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):NetCDF1:AutoSave_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))AUTO_SAVE")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(SCAN, "I/O Intr")
}

# Write file
record(busy, "$(CAM):NetCDF1:WriteFile")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))WRITE_FILE")
    field(ZNAM, "Done")
    field(ONAM, "Write")
}

record(bi, "$(CAM):NetCDF1:WriteFile_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))WRITE_FILE")
    field(ZNAM, "Done")
    field(ZSV,  "NO_ALARM")
    field(ONAM, "Writing")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}


# Read file
record(busy, "$(CAM):NetCDF1:ReadFile")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))READ_FILE")
    field(ZNAM, "Done")
    field(ONAM, "Read")
}

record(bi, "$(CAM):NetCDF1:ReadFile_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))READ_FILE")
    field(ZNAM, "Done")
    field(ZSV,  "NO_ALARM")
    field(ONAM, "Reading")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

# File data format 
record(mbbo, "$(CAM):NetCDF1:FileFormat")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))FILE_FORMAT")
    field(VAL,  "0")
    field(ZRST, "Undefined")
    field(ZRVL, "0")
    field(ONST, "Invalid")
    field(ONVL, "1")
    info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):NetCDF1:FileFormat_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))FILE_FORMAT")
    field(ZRST, "netCDF")
    field(ZRVL, "0")
    field(ONST, "Undefined")
    field(ONVL, "1")
    field(SCAN, "I/O Intr")
}

# File save mode 
record(mbbo, "$(CAM):NetCDF1:FileWriteMode")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))WRITE_MODE")
    field(VAL,  "0")
    field(ZRST, "Single")
    field(ZRVL, "0")
    field(ONST, "Capture")
    field(ONVL, "1")
    field(TWST, "Stream")
    field(TWVL, "2")
    info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):NetCDF1:FileWriteMode_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))WRITE_MODE")
    field(ZRST, "Single")
    field(ZRVL, "0")
    field(ONST, "Capture")
    field(ONVL, "1")
    field(TWST, "Stream")
    field(TWVL, "2")
    field(SCAN, "I/O Intr")
}

# Capture data
record(busy, "$(CAM):NetCDF1:Capture")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))CAPTURE")
    field(ZNAM, "Done")
    field(ONAM, "Capture")
    field(ZSV,  "NO_ALARM")
    field(OSV,  "NO_ALARM")
    info(autosaveFields, "OSV ZSV")
}

record(bi, "$(CAM):NetCDF1:Capture_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))CAPTURE")
    field(ZNAM, "Done")
    field(ZSV,  "NO_ALARM")
    field(ONAM, "Capturing")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):NetCDF1:NumCapture")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))NUM_CAPTURE")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):NetCDF1:NumCapture_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))NUM_CAPTURE")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):NetCDF1:NumCaptured_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))NUM_CAPTURED")
    field(SCAN, "I/O Intr")
}

# Delete driver file flag
record(bo, "$(CAM):NetCDF1:DeleteDriverFile")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))DELETE_DRIVER_FILE")
    field(VAL,  "0")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):NetCDF1:DeleteDriverFile_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))DELETE_DRIVER_FILE")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(SCAN, "I/O Intr")
}

record(bi, "$(CAM):NetCDF1:WriteStatus")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))WRITE_STATUS")
    field(ZNAM, "Write OK")
    field(ZSV,  "NO_ALARM")
    field(ONAM, "Write error")
    field(OSV,  "MAJOR")
    field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):NetCDF1:WriteMessage")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))WRITE_MESSAGE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):NetCDF1:LazyOpen")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))FILE_LAZY_OPEN")
    field(VAL,  "0")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):NetCDF1:LazyOpen_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))FILE_LAZY_OPEN")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(SCAN, "I/O Intr")
}

record(stringout, "$(CAM):NetCDF1:TempSuffix")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(OUT,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))FILE_TEMP_SUFFIX")
    field(VAL,  "")
}

record(stringin, "$(CAM):NetCDF1:TempSuffix_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))FILE_TEMP_SUFFIX")
    field(VAL,  "")
    field(SCAN, "I/O Intr")
}
#=================================================================#
# Template file: NDPluginBase.template
# Database for NDPluginBase, i.e. records common to all plugins
# Mark Rivers
# April 25, 2008

#=================================================================#
# Template file: NDArrayBase.template
# Database for area detector control using asyn driver and standard asyn device support
# Mark Rivers
# March 9, 2008

###################################################################
#  This record contains the version of ADCore                     #
###################################################################

record(stringin, "$(CAM):NetCDF1:ADCoreVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))ADCORE_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the version of the driver or plugin       #
###################################################################

record(stringin, "$(CAM):NetCDF1:DriverVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))DRIVER_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the asyn port name of this detector       #
###################################################################

record(stringin, "$(CAM):NetCDF1:PortName_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))PORT_NAME_SELF")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records contain basic information about the detector     # 
###################################################################

record(stringin, "$(CAM):NetCDF1:Manufacturer_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))MANUFACTURER")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):NetCDF1:Model_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))MODEL")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):NetCDF1:SerialNumber_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))SERIAL_NUMBER")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):NetCDF1:SDKVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))SDK_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):NetCDF1:FirmwareVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))FIRMWARE_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control acquisition start and stop               #
###################################################################

record(bo, "$(CAM):NetCDF1:Acquire") {
   field(DTYP, "asynInt32")
   field(OUT, "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))ACQUIRE")
   field(ZNAM, "Done")
   field(ONAM, "Acquire")
   field(VAL,  "0")
   field(FLNK, "$(CAM):NetCDF1:SetAcquireBusy")
   info(asyn:READBACK, "1")
}

record(bi, "$(CAM):NetCDF1:Acquire_RBV") {
   field(DTYP, "asynInt32")
   field(INP, "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))ACQUIRE")
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):NetCDF1:SetAcquireBusy")
{
    field(INPA, "$(CAM):NetCDF1:Acquire NPP")
    field(CALC, "A")
    field(OOPT, "Transition To Non-zero")
    field(OUT,  "$(CAM):NetCDF1:AcquireBusy PP")
}

record(busy, "$(CAM):NetCDF1:AcquireBusy") {
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(VAL,  "0")
}

record(bi, "$(CAM):NetCDF1:AcquireBusyCB") {
   field(DTYP, "asynInt32")
   field(INP, "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))ACQUIRE_BUSY")
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):NetCDF1:ClearAcquireBusy") {
    field(INPA, "$(CAM):NetCDF1:AcquireBusyCB CP")
    field(CALC, "A")
    field(OOPT, "Transition To Zero")
    field(OUT,  "$(CAM):NetCDF1:AcquireBusy PP")
}

record(bo, "$(CAM):NetCDF1:WaitForPlugins") {
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT, "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))WAIT_FOR_PLUGINS")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(VAL,  "0")
}

###################################################################
#  These records are the array size and data type                 #
###################################################################
# The number of dimensions
record(longout, "$(CAM):NetCDF1:NDimensions")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))ARRAY_NDIMENSIONS")
}

record(longin, "$(CAM):NetCDF1:NDimensions_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))ARRAY_NDIMENSIONS")
    field(SCAN, "I/O Intr")
}

# The array dimensions waveform records
record(waveform, "$(CAM):NetCDF1:Dimensions")
{
    field(DTYP, "asynInt32ArrayOut")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))ARRAY_DIMENSIONS")
    field(FTVL, "LONG")
    field(NELM, "10")
    field(FLNK, "$(CAM):NetCDF1:Dim0SA")
}

record(subArray, "$(CAM):NetCDF1:Dim0SA")
{
    field(INP,  "$(CAM):NetCDF1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "0")
    field(FLNK, "$(CAM):NetCDF1:ArraySize0")
}

record(longin, "$(CAM):NetCDF1:ArraySize0")
{
    field(INP,  "$(CAM):NetCDF1:Dim0SA")
    field(FLNK, "$(CAM):NetCDF1:Dim1SA")
}

record(subArray, "$(CAM):NetCDF1:Dim1SA")
{
    field(INP,  "$(CAM):NetCDF1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "1")
    field(FLNK, "$(CAM):NetCDF1:ArraySize1")
}

record(longin, "$(CAM):NetCDF1:ArraySize1")
{
    field(INP,  "$(CAM):NetCDF1:Dim1SA")
    field(FLNK, "$(CAM):NetCDF1:Dim2SA")
}

record(subArray, "$(CAM):NetCDF1:Dim2SA")
{
    field(INP,  "$(CAM):NetCDF1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "2")
    field(FLNK, "$(CAM):NetCDF1:ArraySize2")
}

record(longin, "$(CAM):NetCDF1:ArraySize2")
{
    field(INP,  "$(CAM):NetCDF1:Dim2SA")
    field(FLNK, "$(CAM):NetCDF1:Dim3SA")
}

record(subArray, "$(CAM):NetCDF1:Dim3SA")
{
    field(INP,  "$(CAM):NetCDF1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "3")
    field(FLNK, "$(CAM):NetCDF1:ArraySize3")
}

record(longin, "$(CAM):NetCDF1:ArraySize3")
{
    field(INP,  "$(CAM):NetCDF1:Dim3SA")
    field(FLNK, "$(CAM):NetCDF1:Dim4SA")
}

record(subArray, "$(CAM):NetCDF1:Dim4SA")
{
    field(INP,  "$(CAM):NetCDF1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "4")
    field(FLNK, "$(CAM):NetCDF1:ArraySize4")
}

record(longin, "$(CAM):NetCDF1:ArraySize4")
{
    field(INP,  "$(CAM):NetCDF1:Dim4SA")
    field(FLNK, "$(CAM):NetCDF1:Dim5SA")
}

record(subArray, "$(CAM):NetCDF1:Dim5SA")
{
    field(INP,  "$(CAM):NetCDF1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "5")
    field(FLNK, "$(CAM):NetCDF1:ArraySize5")
}

record(longin, "$(CAM):NetCDF1:ArraySize5")
{
    field(INP,  "$(CAM):NetCDF1:Dim5SA")
    field(FLNK, "$(CAM):NetCDF1:Dim6SA")
}

record(subArray, "$(CAM):NetCDF1:Dim6SA")
{
    field(INP,  "$(CAM):NetCDF1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "6")
    field(FLNK, "$(CAM):NetCDF1:ArraySize6")
}

record(longin, "$(CAM):NetCDF1:ArraySize6")
{
    field(INP,  "$(CAM):NetCDF1:Dim6SA")
    field(FLNK, "$(CAM):NetCDF1:Dim7SA")
}

record(subArray, "$(CAM):NetCDF1:Dim7SA")
{
    field(INP,  "$(CAM):NetCDF1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "7")
    field(FLNK, "$(CAM):NetCDF1:ArraySize7")
}

record(longin, "$(CAM):NetCDF1:ArraySize7")
{
    field(INP,  "$(CAM):NetCDF1:Dim7SA")
    field(FLNK, "$(CAM):NetCDF1:Dim8SA")
}

record(subArray, "$(CAM):NetCDF1:Dim8SA")
{
    field(INP,  "$(CAM):NetCDF1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "8")
    field(FLNK, "$(CAM):NetCDF1:ArraySize8")
}

record(longin, "$(CAM):NetCDF1:ArraySize8")
{
    field(INP,  "$(CAM):NetCDF1:Dim8SA")
    field(FLNK, "$(CAM):NetCDF1:Dim9SA")
}

record(subArray, "$(CAM):NetCDF1:Dim9SA")
{
    field(INP,  "$(CAM):NetCDF1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "9")
    field(FLNK, "$(CAM):NetCDF1:ArraySize9")
}

record(longin, "$(CAM):NetCDF1:ArraySize9")
{
    field(INP,  "$(CAM):NetCDF1:Dim9SA")
}


record(waveform, "$(CAM):NetCDF1:Dimensions_RBV")
{
    field(DTYP, "asynInt32ArrayIn")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))ARRAY_DIMENSIONS")
    field(FTVL, "LONG")
    field(NELM, "10")
    field(FLNK, "$(CAM):NetCDF1:Dim0SA_RBV")
    field(SCAN, "I/O Intr")
}

record(subArray, "$(CAM):NetCDF1:Dim0SA_RBV")
{
    field(INP,  "$(CAM):NetCDF1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "0")
    field(FLNK, "$(CAM):NetCDF1:ArraySize0_RBV")
}

record(longin, "$(CAM):NetCDF1:ArraySize0_RBV")
{
    field(INP,  "$(CAM):NetCDF1:Dim0SA_RBV")
    field(FLNK, "$(CAM):NetCDF1:Dim1SA_RBV")
}

record(subArray, "$(CAM):NetCDF1:Dim1SA_RBV")
{
    field(INP,  "$(CAM):NetCDF1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "1")
    field(FLNK, "$(CAM):NetCDF1:ArraySize1_RBV")
}

record(longin, "$(CAM):NetCDF1:ArraySize1_RBV")
{
    field(INP,  "$(CAM):NetCDF1:Dim1SA_RBV")
    field(FLNK, "$(CAM):NetCDF1:Dim2SA_RBV")
}

record(subArray, "$(CAM):NetCDF1:Dim2SA_RBV")
{
    field(INP,  "$(CAM):NetCDF1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "2")
    field(FLNK, "$(CAM):NetCDF1:ArraySize2_RBV")
}

record(longin, "$(CAM):NetCDF1:ArraySize2_RBV")
{
    field(INP,  "$(CAM):NetCDF1:Dim2SA_RBV")
    field(FLNK, "$(CAM):NetCDF1:Dim3SA_RBV")
}

record(subArray, "$(CAM):NetCDF1:Dim3SA_RBV")
{
    field(INP,  "$(CAM):NetCDF1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "3")
    field(FLNK, "$(CAM):NetCDF1:ArraySize3_RBV")
}

record(longin, "$(CAM):NetCDF1:ArraySize3_RBV")
{
    field(INP,  "$(CAM):NetCDF1:Dim3SA_RBV")
    field(FLNK, "$(CAM):NetCDF1:Dim4SA_RBV")
}

record(subArray, "$(CAM):NetCDF1:Dim4SA_RBV")
{
    field(INP,  "$(CAM):NetCDF1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "4")
    field(FLNK, "$(CAM):NetCDF1:ArraySize4_RBV")
}

record(longin, "$(CAM):NetCDF1:ArraySize4_RBV")
{
    field(INP,  "$(CAM):NetCDF1:Dim4SA_RBV")
    field(FLNK, "$(CAM):NetCDF1:Dim5SA_RBV")
}

record(subArray, "$(CAM):NetCDF1:Dim5SA_RBV")
{
    field(INP,  "$(CAM):NetCDF1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "5")
    field(FLNK, "$(CAM):NetCDF1:ArraySize5_RBV")
}

record(longin, "$(CAM):NetCDF1:ArraySize5_RBV")
{
    field(INP,  "$(CAM):NetCDF1:Dim5SA_RBV")
    field(FLNK, "$(CAM):NetCDF1:Dim6SA_RBV")
}

record(subArray, "$(CAM):NetCDF1:Dim6SA_RBV")
{
    field(INP,  "$(CAM):NetCDF1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "6")
    field(FLNK, "$(CAM):NetCDF1:ArraySize6_RBV")
}

record(longin, "$(CAM):NetCDF1:ArraySize6_RBV")
{
    field(INP,  "$(CAM):NetCDF1:Dim6SA_RBV")
    field(FLNK, "$(CAM):NetCDF1:Dim7SA_RBV")
}

record(subArray, "$(CAM):NetCDF1:Dim7SA_RBV")
{
    field(INP,  "$(CAM):NetCDF1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "7")
    field(FLNK, "$(CAM):NetCDF1:ArraySize7_RBV")
}

record(longin, "$(CAM):NetCDF1:ArraySize7_RBV")
{
    field(INP,  "$(CAM):NetCDF1:Dim7SA_RBV")
    field(FLNK, "$(CAM):NetCDF1:Dim8SA_RBV")
}

record(subArray, "$(CAM):NetCDF1:Dim8SA_RBV")
{
    field(INP,  "$(CAM):NetCDF1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "8")
    field(FLNK, "$(CAM):NetCDF1:ArraySize8_RBV")
}

record(longin, "$(CAM):NetCDF1:ArraySize8_RBV")
{
    field(INP,  "$(CAM):NetCDF1:Dim8SA_RBV")
    field(FLNK, "$(CAM):NetCDF1:Dim9SA_RBV")
}

record(subArray, "$(CAM):NetCDF1:Dim9SA_RBV")
{
    field(INP,  "$(CAM):NetCDF1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "9")
    field(FLNK, "$(CAM):NetCDF1:ArraySize9_RBV")
}

record(longin, "$(CAM):NetCDF1:ArraySize9_RBV")
{
    field(INP,  "$(CAM):NetCDF1:Dim9SA_RBV")
}


record(mbbi, "$(CAM):NetCDF1:BayerPattern_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))BAYER_PATTERN")
   field(ZRST, "RGGB")
   field(ZRVL, "0")
   field(ONST, "GBRG")
   field(ONVL, "1")
   field(TWST, "GRBG")
   field(TWVL, "2")
   field(THST, "BGGR")
   field(THVL, "3")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):NetCDF1:ArraySizeX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_X")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):NetCDF1:ArraySizeY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_Y")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):NetCDF1:ArraySizeZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_Z")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):NetCDF1:ArraySize_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records have information on the compression              # 
###################################################################
record(stringin, "$(CAM):NetCDF1:Codec_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))CODEC")
   field(VAL,  "")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):NetCDF1:CompressedSize_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))COMPRESSED_SIZE")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the data type                            # 
###################################################################

record(mbbo, "$(CAM):NetCDF1:DataType")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))DATA_TYPE")
   field(ZRST, "Int8")
   field(ZRVL, "0")
   field(ONST, "UInt8")
   field(ONVL, "1")
   field(TWST, "Int16")
   field(TWVL, "2")
   field(THST, "UInt16")
   field(THVL, "3")
   field(FRST, "Int32")
   field(FRVL, "4")
   field(FVST, "UInt32")
   field(FVVL, "5")
   field(SXST, "Int64")
   field(SXVL, "6")
   field(SVST, "UInt64")
   field(SVVL, "7")
   field(EIST, "Float32")
   field(EIVL, "8")
   field(NIST, "Float64")
   field(NIVL, "9")
   field(VAL,  "0")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):NetCDF1:DataType_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))DATA_TYPE")
   field(ZRST, "Int8")
   field(ZRVL, "0")
   field(ONST, "UInt8")
   field(ONVL, "1")
   field(TWST, "Int16")
   field(TWVL, "2")
   field(THST, "UInt16")
   field(THVL, "3")
   field(FRST, "Int32")
   field(FRVL, "4")
   field(FVST, "UInt32")
   field(FVVL, "5")
   field(SXST, "Int64")
   field(SXVL, "6")
   field(SVST, "UInt64")
   field(SVVL, "7")
   field(EIST, "Float32")
   field(EIVL, "8")
   field(NIST, "Float64")
   field(NIVL, "9")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):NetCDF1:BitsPerPixel_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))BITS_PER_PIXEL")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the color mode                           #
#  These choices must agree with NDColorMode_t in NDArray.h       # 
###################################################################

record(mbbo, "$(CAM):NetCDF1:ColorMode")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))COLOR_MODE")
   field(ZRST, "Mono")
   field(ZRVL, "0")
   field(ONST, "Bayer")
   field(ONVL, "1")
   field(TWST, "RGB1")
   field(TWVL, "2")
   field(THST, "RGB2")
   field(THVL, "3")
   field(FRST, "RGB3")
   field(FRVL, "4")
   field(FVST, "YUV444")
   field(FVVL, "5")
   field(SXST, "YUV422")
   field(SXVL, "6")
   field(SVST, "YUV421")
   field(SVVL, "7")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):NetCDF1:ColorMode_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))COLOR_MODE")
   field(ZRST, "Mono")
   field(ZRVL, "0")
   field(ONST, "Bayer")
   field(ONVL, "1")
   field(TWST, "RGB1")
   field(TWVL, "2")
   field(THST, "RGB2")
   field(THVL, "3")
   field(FRST, "RGB3")
   field(FRVL, "4")
   field(FVST, "YUV444")
   field(FVVL, "5")
   field(SXST, "YUV422")
   field(SXVL, "6")
   field(SVST, "YUV421")
   field(SVVL, "7")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records are the uniqueId and time stamps of the array     #
###################################################################
record(longin, "$(CAM):NetCDF1:UniqueId_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))UNIQUE_ID")
    field(SCAN, "I/O Intr")
}

record(ai, "$(CAM):NetCDF1:TimeStamp_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))TIME_STAMP")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):NetCDF1:EpicsTSSec_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))EPICS_TS_SEC")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):NetCDF1:EpicsTSNsec_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))EPICS_TS_NSEC")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records provide statistics on array callbacks and        #
#  array callback rates                                           # 
###################################################################
record(longout, "$(CAM):NetCDF1:ArrayCounter")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))ARRAY_COUNTER")
}

record(longin, "$(CAM):NetCDF1:ArrayCounter_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))ARRAY_COUNTER")
    field(SCAN, "I/O Intr")
    field(TSE,  "-2")
    field(LOW,  "0" )
    field(LSV,  "MINOR" )
    info(autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV TSE")
}

# Updated rate calculation to use a smoothing factor w/ guard against negative values
# 0 rate sets alarm state to MINOR
record(calc, "$(CAM):NetCDF1:ArrayRate_RBV")
{
    field(INPA, "$(CAM):NetCDF1:ArrayRate_RBV.LB NPP NMS")   # Previous counter (Last B value)
    field(INPB, "$(CAM):NetCDF1:ArrayCounter_RBV NPP NMS")   # Current counter value
    field(INPC, "1.0")                                # Delta time in seconds
    field(INPD, "$(CAM):NetCDF1:ArrayRate_RBV.VAL NPP NMS")  # Previous rate
    field(INPE, "0.0")                 # Smoothing factor
    field(CALC, "(D*E)/C+MAX(0,B-A)*(1-E)/C")
    field(PREC, "2" )
    field(EGU,  "Hz" )
    field(SCAN, "1 second")
    field(LOW,  "0")
    field(LSV,  "MINOR")
    field(ADEL, "0.1")
    info(autosaveFields, "ADEL DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV MDEL PREC C E SCAN EGU")
}

###################################################################
#  These records control NDArray callacks                         # 
###################################################################
record(bo, "$(CAM):NetCDF1:ArrayCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))ARRAY_CALLBACKS")
    field(ZNAM, "Disable")
    field(ZSV,  "MINOR")
    field(ONAM, "Enable")
    field(OSV,  "NO_ALARM")
    field(VAL, "1")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):NetCDF1:ArrayCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))ARRAY_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ZSV,  "MINOR")
    field(ONAM, "Enabled")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains macro definitions for the attributes      # 
###################################################################

record(waveform, "$(CAM):NetCDF1:NDAttributesMacros")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_MACROS")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

###################################################################
#  This record is the name of a file defining attributes          # 
###################################################################

record(waveform, "$(CAM):NetCDF1:NDAttributesFile")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_FILE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

###################################################################
#  This record defines the status of reading attributes file      # 
###################################################################

record(mbbi, "$(CAM):NetCDF1:NDAttributesStatus")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_STATUS")
    field(ZRVL, "0")
    field(ZRST, "Attributes file OK")
    field(ZRSV, "NO_ALARM")
    field(ONVL, "1")
    field(ONST, "File not found")
    field(ONSV, "MINOR")
    field(TWVL, "2")
    field(TWST, "XML syntax error")
    field(TWSV, "MAJOR")
    field(THVL, "3")
    field(THST, "Macro substitution error")
    field(THSV, "MAJOR")
    field(SCAN, "I/O Intr")
}

###################################################################
#  Status of NDArrayPool - number of buffers, memory used etc.    # 
###################################################################

record(ai, "$(CAM):NetCDF1:PoolMaxMem")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))POOL_MAX_MEMORY")
   field(PREC, "1")
   field(EGU,  "MB")
   field(SCAN, "Passive")
   field(PINI, "YES")
}

record(ai, "$(CAM):NetCDF1:PoolUsedMem")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))POOL_USED_MEMORY")
   field(PREC, "1")
   field(EGU,  "MB")
   field(SCAN, "1 second")
   field(FLNK, "$(CAM):NetCDF1:PoolAllocBuffers")
   info(autosaveFields, "SCAN")
}

record(longin, "$(CAM):NetCDF1:PoolAllocBuffers")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))POOL_ALLOC_BUFFERS")
   field(FLNK, "$(CAM):NetCDF1:PoolFreeBuffers")
}

record(longin, "$(CAM):NetCDF1:PoolFreeBuffers")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))POOL_FREE_BUFFERS")
   field(FLNK, "$(CAM):NetCDF1:PoolUsedBuffers")
}

record(calc, "$(CAM):NetCDF1:PoolUsedBuffers")
{
    field(INPA, "$(CAM):NetCDF1:PoolAllocBuffers NPP MS")
    field(INPB, "$(CAM):NetCDF1:PoolFreeBuffers NPP MS")
    field(CALC, "A-B")
}

record(bo, "$(CAM):NetCDF1:EmptyFreeList")
{
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))POOL_EMPTY_FREELIST")
}

record(longin, "$(CAM):NetCDF1:NumQueuedArrays")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))NUM_QUEUED_ARRAYS")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the type of plugin                        #
###################################################################

record(stringin, "$(CAM):NetCDF1:PluginType_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))PLUGIN_TYPE")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the connection of the server to          #
#  an NDArray driver port and address                             #
###################################################################
# Array port name
record(stringout, "$(CAM):NetCDF1:NDArrayPort")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(OUT,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))NDARRAY_PORT")
    field(VAL,  "$(CAM_PORT)")
    info(autosaveFields, "DESC VAL")
}

record(stringin, "$(CAM):NetCDF1:NDArrayPort_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))NDARRAY_PORT")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):NetCDF1:NDArrayAddress")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))NDARRAY_ADDR")
    field(VAL,  "$(NDARRAY_ADDR=0)")
    info(autosaveFields, "DESC VAL")
}

record(longin, "$(CAM):NetCDF1:NDArrayAddress_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))NDARRAY_ADDR")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control whether callbacks are enabled and        #
#  minimum time between callbacks                                 #
###################################################################
record(bo, "$(CAM):NetCDF1:EnableCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))ENABLE_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    field(VAL,  "0")
    info(autosaveFields, "DESC VAL")
}

record(bi, "$(CAM):NetCDF1:EnableCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))ENABLE_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    field(ZSV,  "MINOR")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):NetCDF1:MinCallbackTime")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))MIN_CALLBACK_TIME")
    field(EGU,  "s")
    field(PREC, "3")
    field(VAL,  "0.0")
    field(DRVL, "0")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):NetCDF1:MinCallbackTime_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))MIN_CALLBACK_TIME")
    field(EGU,  "s")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):NetCDF1:MaxArrayRate")
{
    field(DTYP, "Soft Channel")
    field(OUT,  "$(CAM):NetCDF1:MaxArrayRate_COUT PP")
    field(EGU,  "Hz")
    field(PREC, "3")
    field(VAL,  "0.0")
    info(autosaveFields, "VAL")
}

record(calcout, "$(CAM):NetCDF1:MaxArrayRate_COUT")
{
    field(INPA, "$(CAM):NetCDF1:MaxArrayRate")
    field(CALC, "A=0?0:1.0/A")
    field(OUT,  "$(CAM):NetCDF1:MinCallbackTime PP")
}

record(calc, "$(CAM):NetCDF1:MaxArrayRate_RBV")
{
    field(INPA, "$(CAM):NetCDF1:MinCallbackTime_RBV CP")
    field(CALC, "A=0?0:1.0/A")
    field(EGU,  "Hz")
    field(PREC, "3")
    field(SCAN, "Passive")
}

record(ao, "$(CAM):NetCDF1:MaxByteRate")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))MAX_BYTE_RATE")
    field(EGU,  "s")
    field(PREC, "3")
    field(VAL,  "0.0")
    field(DRVL, "0")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):NetCDF1:MaxByteRate_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))MAX_BYTE_RATE")
    field(EGU,  "s")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the last execution time of the plugin     #
###################################################################
record(ai, "$(CAM):NetCDF1:ExecutionTime_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))EXECUTION_TIME")
    field(EGU,  "ms")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record requests that the plugin execute again with the    #
#  same NDArray                                                   #
###################################################################
record(bo, "$(CAM):NetCDF1:ProcessPlugin")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))PROCESS_PLUGIN")
    field(VAL,  "1")
}

###################################################################
#  These records control whether callbacks block or not           #
###################################################################
record(bo, "$(CAM):NetCDF1:BlockingCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))BLOCKING_CALLBACKS")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(VAL,  "0")
    info(autosaveFields, "DESC ZSV OSV VAL")
}

record(bi, "$(CAM):NetCDF1:BlockingCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))BLOCKING_CALLBACKS")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(ZSV,  "NO_ALARM")
    field(OSV,  "MINOR")
    field(SCAN, "I/O Intr")
    info( autosaveFields, "DESC ZSV OSV" )
}


record(longout, "$(CAM):NetCDF1:DroppedArrays")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))DROPPED_ARRAYS")
    field(VAL,  "0")
    info( autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV EGU" )
}

record(longin, "$(CAM):NetCDF1:DroppedArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))DROPPED_ARRAYS")
    field(SCAN, "I/O Intr")
    field(HIGH, "1")
    field(HSV,  "MINOR")
    info( autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV EGU" )
}

record(longout, "$(CAM):NetCDF1:QueueSize")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))QUEUE_SIZE")
    field(PINI, "YES")
    info( autosaveFields, "DESC EGU" )
}

record(longin, "$(CAM):NetCDF1:QueueSize_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))QUEUE_SIZE")
    field(FLNK, "$(CAM):NetCDF1:QueueFreeLow")
    field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):NetCDF1:QueueFreeLow") {
    field(CALC, "A*0.25")
    field(INPA, "$(CAM):NetCDF1:QueueSize")
    field(OUT,  "$(CAM):NetCDF1:QueueFree.LOW")
    field(FLNK, "$(CAM):NetCDF1:QueueUseHIGH")
}

# Set a HIGH warning level for the input queue fill level to 75%
# of the full size of the queue
record(calcout, "$(CAM):NetCDF1:QueueUseHIGH") {
   field(CALC, "A*0.75")
   field(INPA, "$(CAM):NetCDF1:QueueSize")
   field(OUT,  "$(CAM):NetCDF1:QueueUse.HIGH")
   field(FLNK, "$(CAM):NetCDF1:QueueUseHIHI")
}

# Set a HIHI level for the input queue fill level to indicate an error
# (MAJOR alarm)  when it fills up to the full size of the queue (frames start dropping)
record(calcout, "$(CAM):NetCDF1:QueueUseHIHI") {
   field(CALC, "A*1.0")
   field(INPA, "$(CAM):NetCDF1:QueueSize")
   field(OUT,  "$(CAM):NetCDF1:QueueUse.HIHI")
}

record(longin, "$(CAM):NetCDF1:QueueFree")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))QUEUE_FREE")
    field(LLSV, "MAJOR")
    field(LSV,  "MINOR")
    field(LOLO, "0")
    field(HYST, "1")
    field(SCAN, "I/O Intr")
}

# Display the fill level on the plugins input queue
record(calc, "$(CAM):NetCDF1:QueueUse") {
    field(CALC, "A-B")
    field(INPA, "$(CAM):NetCDF1:QueueSize")
    field(INPB, "$(CAM):NetCDF1:QueueFree CP")
    field(SCAN, "Passive")
    field(HHSV, "MAJOR")
    field(HSV,  "MINOR")
    field(HYST, "1")
}

record(longout, "$(CAM):NetCDF1:NumThreads")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))NUM_THREADS")
    field(VAL,  "1")
    field(PINI, "YES")
    info(autosaveFields, "DESC VAL")
}

record(longin, "$(CAM):NetCDF1:NumThreads_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))NUM_THREADS")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):NetCDF1:MaxThreads_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))MAX_THREADS")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control output array sorting                     #
###################################################################
record(mbbo, "$(CAM):NetCDF1:SortMode") {
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))SORT_MODE")
    field(ZRVL, "0")
    field(ZRST, "Unsorted")
    field(ONVL, "1")
    field(ONST, "Sorted")
}

record(mbbi, "$(CAM):NetCDF1:SortMode_RBV") {
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))SORT_MODE")
    field(ZRVL, "0")
    field(ZRST, "Unsorted")
    field(ONVL, "1")
    field(ONST, "Sorted")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):NetCDF1:SortTime") {
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))SORT_TIME")
    field(PREC, "3")
    field(VAL, "0.1")
}

record(ai, "$(CAM):NetCDF1:SortTime_RBV") {
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))SORT_TIME")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):NetCDF1:SortSize")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))SORT_SIZE")
    field(VAL,  "20")
    field(PINI, "YES")
}

record(longin, "$(CAM):NetCDF1:SortSize_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))SORT_SIZE")
    field(FLNK, "$(CAM):NetCDF1:SortFreeLow")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):NetCDF1:SortFree") {
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))SORT_FREE")
    field(LLSV, "MAJOR")
    field(LSV,  "MINOR")
    field(LOLO, "0")
    field(HYST, "1")
    field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):NetCDF1:SortFreeLow") {
    field(CALC, "A*0.25")
    field(INPA, "$(CAM):NetCDF1:SortSize")
    field(OUT,  "$(CAM):NetCDF1:SortFree.LOW")
}

record(longout, "$(CAM):NetCDF1:DroppedOutputArrays")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))DROPPED_OUTPUT_ARRAYS")
    field(VAL,  "0")
}

record(longin, "$(CAM):NetCDF1:DroppedOutputArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))DROPPED_OUTPUT_ARRAYS")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):NetCDF1:DisorderedArrays")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))DISORDERED_ARRAYS")
    field(PINI, "YES")
}

record(longin, "$(CAM):NetCDF1:DisorderedArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(NetCDF1,$(ADDR=0),$(TIMEOUT=1))DISORDERED_ARRAYS")
    field(SCAN, "I/O Intr")
}



###################################################################
#  The asynRecord is used for mainly for trace mask               # 
###################################################################
 
# Set ASYN_TRACEIO_HEX bit by default
record(asyn,"$(CAM):NetCDF1:AsynIO")
{
    field(PORT, "NetCDF1")
    field(TIB2,"1")
    info("ADType", "ADPlugin")
}


# We replace some fields in records defined in NDFile.template
# File data format 
record(mbbo, "$(CAM):NetCDF1:FileFormat")
{
    field(ZRST, "netCDF")
    field(ZRVL, "0")
    field(ONST, "Invalid")
    field(ONVL, "1")
}

record(mbbi, "$(CAM):NetCDF1:FileFormat_RBV")
{
    field(ZRST, "netCDF")
    field(ZRVL, "0")
    field(ONST, "Undefined")
    field(ONVL, "1")
}

#=================================================================#
# Template file: NDFile.template
# Database for NDFile driver, which saves files for NDArray data.
# Mark Rivers
# April 7, 2008

###################################################################
#  These records control file I/O                                 # 
###################################################################

# File path.
record(waveform, "$(CAM):Nexus1:FilePath")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))FILE_PATH")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

record(waveform, "$(CAM):Nexus1:FilePath_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))FILE_PATH")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

record(bi, "$(CAM):Nexus1:FilePathExists_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))FILE_PATH_EXISTS")
    field(ZNAM, "No")
    field(ZSV,  "MAJOR")
    field(ONAM, "Yes")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Nexus1:CreateDirectory")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))CREATE_DIR")
    field(VAL,  "0" )
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Nexus1:CreateDirectory_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))CREATE_DIR")
    field(VAL,  "")
    field(SCAN, "I/O Intr")
}

# Filename
record(waveform, "$(CAM):Nexus1:FileName")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))FILE_NAME")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

record(waveform, "$(CAM):Nexus1:FileName_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))FILE_NAME")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Nexus1:FileNumber")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))FILE_NUMBER")
    field(VAL,  "1")
    info(asyn:READBACK, "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Nexus1:FileNumber_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))FILE_NUMBER")
    field(SCAN, "I/O Intr")
}

# Autoincrement flag
record(bo, "$(CAM):Nexus1:AutoIncrement")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))AUTO_INCREMENT")
    field(VAL,  "1")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Nexus1:AutoIncrement_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))AUTO_INCREMENT")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(SCAN, "I/O Intr")
}

# File template
record(waveform, "$(CAM):Nexus1:FileTemplate")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))FILE_TEMPLATE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

record(waveform, "$(CAM):Nexus1:FileTemplate_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))FILE_TEMPLATE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

# Full filename, including path
record(waveform, "$(CAM):Nexus1:FullFileName_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))FULL_FILE_NAME")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

# Autosave flag
record(bo, "$(CAM):Nexus1:AutoSave")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))AUTO_SAVE")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Nexus1:AutoSave_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))AUTO_SAVE")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(SCAN, "I/O Intr")
}

# Write file
record(busy, "$(CAM):Nexus1:WriteFile")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))WRITE_FILE")
    field(ZNAM, "Done")
    field(ONAM, "Write")
}

record(bi, "$(CAM):Nexus1:WriteFile_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))WRITE_FILE")
    field(ZNAM, "Done")
    field(ZSV,  "NO_ALARM")
    field(ONAM, "Writing")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}


# Read file
record(busy, "$(CAM):Nexus1:ReadFile")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))READ_FILE")
    field(ZNAM, "Done")
    field(ONAM, "Read")
}

record(bi, "$(CAM):Nexus1:ReadFile_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))READ_FILE")
    field(ZNAM, "Done")
    field(ZSV,  "NO_ALARM")
    field(ONAM, "Reading")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

# File data format 
record(mbbo, "$(CAM):Nexus1:FileFormat")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))FILE_FORMAT")
    field(VAL,  "0")
    field(ZRST, "Undefined")
    field(ZRVL, "0")
    field(ONST, "Invalid")
    field(ONVL, "1")
    info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Nexus1:FileFormat_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))FILE_FORMAT")
    field(ZRST, "netCDF")
    field(ZRVL, "0")
    field(ONST, "Undefined")
    field(ONVL, "1")
    field(SCAN, "I/O Intr")
}

# File save mode 
record(mbbo, "$(CAM):Nexus1:FileWriteMode")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))WRITE_MODE")
    field(VAL,  "0")
    field(ZRST, "Single")
    field(ZRVL, "0")
    field(ONST, "Capture")
    field(ONVL, "1")
    field(TWST, "Stream")
    field(TWVL, "2")
    info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Nexus1:FileWriteMode_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))WRITE_MODE")
    field(ZRST, "Single")
    field(ZRVL, "0")
    field(ONST, "Capture")
    field(ONVL, "1")
    field(TWST, "Stream")
    field(TWVL, "2")
    field(SCAN, "I/O Intr")
}

# Capture data
record(busy, "$(CAM):Nexus1:Capture")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))CAPTURE")
    field(ZNAM, "Done")
    field(ONAM, "Capture")
    field(ZSV,  "NO_ALARM")
    field(OSV,  "NO_ALARM")
    info(autosaveFields, "OSV ZSV")
}

record(bi, "$(CAM):Nexus1:Capture_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))CAPTURE")
    field(ZNAM, "Done")
    field(ZSV,  "NO_ALARM")
    field(ONAM, "Capturing")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Nexus1:NumCapture")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))NUM_CAPTURE")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Nexus1:NumCapture_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))NUM_CAPTURE")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Nexus1:NumCaptured_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))NUM_CAPTURED")
    field(SCAN, "I/O Intr")
}

# Delete driver file flag
record(bo, "$(CAM):Nexus1:DeleteDriverFile")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))DELETE_DRIVER_FILE")
    field(VAL,  "0")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Nexus1:DeleteDriverFile_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))DELETE_DRIVER_FILE")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(SCAN, "I/O Intr")
}

record(bi, "$(CAM):Nexus1:WriteStatus")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))WRITE_STATUS")
    field(ZNAM, "Write OK")
    field(ZSV,  "NO_ALARM")
    field(ONAM, "Write error")
    field(OSV,  "MAJOR")
    field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Nexus1:WriteMessage")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))WRITE_MESSAGE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):Nexus1:LazyOpen")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))FILE_LAZY_OPEN")
    field(VAL,  "0")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Nexus1:LazyOpen_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))FILE_LAZY_OPEN")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(SCAN, "I/O Intr")
}

record(stringout, "$(CAM):Nexus1:TempSuffix")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(OUT,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))FILE_TEMP_SUFFIX")
    field(VAL,  "")
}

record(stringin, "$(CAM):Nexus1:TempSuffix_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))FILE_TEMP_SUFFIX")
    field(VAL,  "")
    field(SCAN, "I/O Intr")
}
# Database to add automatic reset of FileNumber on changes
# to FilePath, FileTemplate, or FileName

# Add FLNKS to ResetFileNumber
record(waveform, "$(CAM):Nexus1:FilePath")
{
    field(FLNK, "$(CAM):Nexus1:ResetFileNumber" )
}
record(waveform, "$(CAM):Nexus1:FileName")
{
    field(FLNK, "$(CAM):Nexus1:ResetFileNumber" )
}
record(waveform, "$(CAM):Nexus1:FileTemplate")
{
    field(FLNK, "$(CAM):Nexus1:ResetFileNumber" )
}

# AutoFileNumberReset flag
record(bo, "$(CAM):Nexus1:AutoFileNumberReset")
{
    field(PINI, "YES")
    field(VAL,  "1")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info( autosaveFields, "VAL" )
}

record(calcout, "$(CAM):Nexus1:ResetFileNumber")
{
    field(INPA, "$(CAM):Nexus1:AutoFileNumberReset NPP")
    field(CALC, "A")
    field(OOPT, "When Non-zero" )
    field(OUT,  "$(CAM):Nexus1:FileNumber PP")
}
#=================================================================#
# Template file: NDFileNexus.template
# Database for NDFileNexus driver, which saves files for NDArray data.

#=================================================================#
# Template file: NDFile.template
# Database for NDFile driver, which saves files for NDArray data.
# Mark Rivers
# April 7, 2008

###################################################################
#  These records control file I/O                                 # 
###################################################################

# File path.
record(waveform, "$(CAM):Nexus1:FilePath")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))FILE_PATH")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

record(waveform, "$(CAM):Nexus1:FilePath_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))FILE_PATH")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

record(bi, "$(CAM):Nexus1:FilePathExists_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))FILE_PATH_EXISTS")
    field(ZNAM, "No")
    field(ZSV,  "MAJOR")
    field(ONAM, "Yes")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Nexus1:CreateDirectory")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))CREATE_DIR")
    field(VAL,  "0" )
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Nexus1:CreateDirectory_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))CREATE_DIR")
    field(VAL,  "")
    field(SCAN, "I/O Intr")
}

# Filename
record(waveform, "$(CAM):Nexus1:FileName")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))FILE_NAME")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

record(waveform, "$(CAM):Nexus1:FileName_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))FILE_NAME")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Nexus1:FileNumber")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))FILE_NUMBER")
    field(VAL,  "1")
    info(asyn:READBACK, "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Nexus1:FileNumber_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))FILE_NUMBER")
    field(SCAN, "I/O Intr")
}

# Autoincrement flag
record(bo, "$(CAM):Nexus1:AutoIncrement")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))AUTO_INCREMENT")
    field(VAL,  "1")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Nexus1:AutoIncrement_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))AUTO_INCREMENT")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(SCAN, "I/O Intr")
}

# File template
record(waveform, "$(CAM):Nexus1:FileTemplate")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))FILE_TEMPLATE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

record(waveform, "$(CAM):Nexus1:FileTemplate_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))FILE_TEMPLATE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

# Full filename, including path
record(waveform, "$(CAM):Nexus1:FullFileName_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))FULL_FILE_NAME")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

# Autosave flag
record(bo, "$(CAM):Nexus1:AutoSave")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))AUTO_SAVE")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Nexus1:AutoSave_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))AUTO_SAVE")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(SCAN, "I/O Intr")
}

# Write file
record(busy, "$(CAM):Nexus1:WriteFile")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))WRITE_FILE")
    field(ZNAM, "Done")
    field(ONAM, "Write")
}

record(bi, "$(CAM):Nexus1:WriteFile_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))WRITE_FILE")
    field(ZNAM, "Done")
    field(ZSV,  "NO_ALARM")
    field(ONAM, "Writing")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}


# Read file
record(busy, "$(CAM):Nexus1:ReadFile")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))READ_FILE")
    field(ZNAM, "Done")
    field(ONAM, "Read")
}

record(bi, "$(CAM):Nexus1:ReadFile_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))READ_FILE")
    field(ZNAM, "Done")
    field(ZSV,  "NO_ALARM")
    field(ONAM, "Reading")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

# File data format 
record(mbbo, "$(CAM):Nexus1:FileFormat")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))FILE_FORMAT")
    field(VAL,  "0")
    field(ZRST, "Undefined")
    field(ZRVL, "0")
    field(ONST, "Invalid")
    field(ONVL, "1")
    info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Nexus1:FileFormat_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))FILE_FORMAT")
    field(ZRST, "netCDF")
    field(ZRVL, "0")
    field(ONST, "Undefined")
    field(ONVL, "1")
    field(SCAN, "I/O Intr")
}

# File save mode 
record(mbbo, "$(CAM):Nexus1:FileWriteMode")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))WRITE_MODE")
    field(VAL,  "0")
    field(ZRST, "Single")
    field(ZRVL, "0")
    field(ONST, "Capture")
    field(ONVL, "1")
    field(TWST, "Stream")
    field(TWVL, "2")
    info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Nexus1:FileWriteMode_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))WRITE_MODE")
    field(ZRST, "Single")
    field(ZRVL, "0")
    field(ONST, "Capture")
    field(ONVL, "1")
    field(TWST, "Stream")
    field(TWVL, "2")
    field(SCAN, "I/O Intr")
}

# Capture data
record(busy, "$(CAM):Nexus1:Capture")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))CAPTURE")
    field(ZNAM, "Done")
    field(ONAM, "Capture")
    field(ZSV,  "NO_ALARM")
    field(OSV,  "NO_ALARM")
    info(autosaveFields, "OSV ZSV")
}

record(bi, "$(CAM):Nexus1:Capture_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))CAPTURE")
    field(ZNAM, "Done")
    field(ZSV,  "NO_ALARM")
    field(ONAM, "Capturing")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Nexus1:NumCapture")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))NUM_CAPTURE")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Nexus1:NumCapture_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))NUM_CAPTURE")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Nexus1:NumCaptured_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))NUM_CAPTURED")
    field(SCAN, "I/O Intr")
}

# Delete driver file flag
record(bo, "$(CAM):Nexus1:DeleteDriverFile")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))DELETE_DRIVER_FILE")
    field(VAL,  "0")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Nexus1:DeleteDriverFile_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))DELETE_DRIVER_FILE")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(SCAN, "I/O Intr")
}

record(bi, "$(CAM):Nexus1:WriteStatus")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))WRITE_STATUS")
    field(ZNAM, "Write OK")
    field(ZSV,  "NO_ALARM")
    field(ONAM, "Write error")
    field(OSV,  "MAJOR")
    field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Nexus1:WriteMessage")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))WRITE_MESSAGE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):Nexus1:LazyOpen")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))FILE_LAZY_OPEN")
    field(VAL,  "0")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Nexus1:LazyOpen_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))FILE_LAZY_OPEN")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(SCAN, "I/O Intr")
}

record(stringout, "$(CAM):Nexus1:TempSuffix")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(OUT,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))FILE_TEMP_SUFFIX")
    field(VAL,  "")
}

record(stringin, "$(CAM):Nexus1:TempSuffix_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))FILE_TEMP_SUFFIX")
    field(VAL,  "")
    field(SCAN, "I/O Intr")
}
#=================================================================#
# Template file: NDPluginBase.template
# Database for NDPluginBase, i.e. records common to all plugins
# Mark Rivers
# April 25, 2008

#=================================================================#
# Template file: NDArrayBase.template
# Database for area detector control using asyn driver and standard asyn device support
# Mark Rivers
# March 9, 2008

###################################################################
#  This record contains the version of ADCore                     #
###################################################################

record(stringin, "$(CAM):Nexus1:ADCoreVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))ADCORE_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the version of the driver or plugin       #
###################################################################

record(stringin, "$(CAM):Nexus1:DriverVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))DRIVER_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the asyn port name of this detector       #
###################################################################

record(stringin, "$(CAM):Nexus1:PortName_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))PORT_NAME_SELF")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records contain basic information about the detector     # 
###################################################################

record(stringin, "$(CAM):Nexus1:Manufacturer_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))MANUFACTURER")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):Nexus1:Model_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))MODEL")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):Nexus1:SerialNumber_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))SERIAL_NUMBER")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):Nexus1:SDKVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))SDK_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):Nexus1:FirmwareVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))FIRMWARE_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control acquisition start and stop               #
###################################################################

record(bo, "$(CAM):Nexus1:Acquire") {
   field(DTYP, "asynInt32")
   field(OUT, "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))ACQUIRE")
   field(ZNAM, "Done")
   field(ONAM, "Acquire")
   field(VAL,  "0")
   field(FLNK, "$(CAM):Nexus1:SetAcquireBusy")
   info(asyn:READBACK, "1")
}

record(bi, "$(CAM):Nexus1:Acquire_RBV") {
   field(DTYP, "asynInt32")
   field(INP, "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))ACQUIRE")
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):Nexus1:SetAcquireBusy")
{
    field(INPA, "$(CAM):Nexus1:Acquire NPP")
    field(CALC, "A")
    field(OOPT, "Transition To Non-zero")
    field(OUT,  "$(CAM):Nexus1:AcquireBusy PP")
}

record(busy, "$(CAM):Nexus1:AcquireBusy") {
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(VAL,  "0")
}

record(bi, "$(CAM):Nexus1:AcquireBusyCB") {
   field(DTYP, "asynInt32")
   field(INP, "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))ACQUIRE_BUSY")
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):Nexus1:ClearAcquireBusy") {
    field(INPA, "$(CAM):Nexus1:AcquireBusyCB CP")
    field(CALC, "A")
    field(OOPT, "Transition To Zero")
    field(OUT,  "$(CAM):Nexus1:AcquireBusy PP")
}

record(bo, "$(CAM):Nexus1:WaitForPlugins") {
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT, "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))WAIT_FOR_PLUGINS")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(VAL,  "0")
}

###################################################################
#  These records are the array size and data type                 #
###################################################################
# The number of dimensions
record(longout, "$(CAM):Nexus1:NDimensions")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))ARRAY_NDIMENSIONS")
}

record(longin, "$(CAM):Nexus1:NDimensions_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))ARRAY_NDIMENSIONS")
    field(SCAN, "I/O Intr")
}

# The array dimensions waveform records
record(waveform, "$(CAM):Nexus1:Dimensions")
{
    field(DTYP, "asynInt32ArrayOut")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))ARRAY_DIMENSIONS")
    field(FTVL, "LONG")
    field(NELM, "10")
    field(FLNK, "$(CAM):Nexus1:Dim0SA")
}

record(subArray, "$(CAM):Nexus1:Dim0SA")
{
    field(INP,  "$(CAM):Nexus1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "0")
    field(FLNK, "$(CAM):Nexus1:ArraySize0")
}

record(longin, "$(CAM):Nexus1:ArraySize0")
{
    field(INP,  "$(CAM):Nexus1:Dim0SA")
    field(FLNK, "$(CAM):Nexus1:Dim1SA")
}

record(subArray, "$(CAM):Nexus1:Dim1SA")
{
    field(INP,  "$(CAM):Nexus1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "1")
    field(FLNK, "$(CAM):Nexus1:ArraySize1")
}

record(longin, "$(CAM):Nexus1:ArraySize1")
{
    field(INP,  "$(CAM):Nexus1:Dim1SA")
    field(FLNK, "$(CAM):Nexus1:Dim2SA")
}

record(subArray, "$(CAM):Nexus1:Dim2SA")
{
    field(INP,  "$(CAM):Nexus1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "2")
    field(FLNK, "$(CAM):Nexus1:ArraySize2")
}

record(longin, "$(CAM):Nexus1:ArraySize2")
{
    field(INP,  "$(CAM):Nexus1:Dim2SA")
    field(FLNK, "$(CAM):Nexus1:Dim3SA")
}

record(subArray, "$(CAM):Nexus1:Dim3SA")
{
    field(INP,  "$(CAM):Nexus1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "3")
    field(FLNK, "$(CAM):Nexus1:ArraySize3")
}

record(longin, "$(CAM):Nexus1:ArraySize3")
{
    field(INP,  "$(CAM):Nexus1:Dim3SA")
    field(FLNK, "$(CAM):Nexus1:Dim4SA")
}

record(subArray, "$(CAM):Nexus1:Dim4SA")
{
    field(INP,  "$(CAM):Nexus1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "4")
    field(FLNK, "$(CAM):Nexus1:ArraySize4")
}

record(longin, "$(CAM):Nexus1:ArraySize4")
{
    field(INP,  "$(CAM):Nexus1:Dim4SA")
    field(FLNK, "$(CAM):Nexus1:Dim5SA")
}

record(subArray, "$(CAM):Nexus1:Dim5SA")
{
    field(INP,  "$(CAM):Nexus1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "5")
    field(FLNK, "$(CAM):Nexus1:ArraySize5")
}

record(longin, "$(CAM):Nexus1:ArraySize5")
{
    field(INP,  "$(CAM):Nexus1:Dim5SA")
    field(FLNK, "$(CAM):Nexus1:Dim6SA")
}

record(subArray, "$(CAM):Nexus1:Dim6SA")
{
    field(INP,  "$(CAM):Nexus1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "6")
    field(FLNK, "$(CAM):Nexus1:ArraySize6")
}

record(longin, "$(CAM):Nexus1:ArraySize6")
{
    field(INP,  "$(CAM):Nexus1:Dim6SA")
    field(FLNK, "$(CAM):Nexus1:Dim7SA")
}

record(subArray, "$(CAM):Nexus1:Dim7SA")
{
    field(INP,  "$(CAM):Nexus1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "7")
    field(FLNK, "$(CAM):Nexus1:ArraySize7")
}

record(longin, "$(CAM):Nexus1:ArraySize7")
{
    field(INP,  "$(CAM):Nexus1:Dim7SA")
    field(FLNK, "$(CAM):Nexus1:Dim8SA")
}

record(subArray, "$(CAM):Nexus1:Dim8SA")
{
    field(INP,  "$(CAM):Nexus1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "8")
    field(FLNK, "$(CAM):Nexus1:ArraySize8")
}

record(longin, "$(CAM):Nexus1:ArraySize8")
{
    field(INP,  "$(CAM):Nexus1:Dim8SA")
    field(FLNK, "$(CAM):Nexus1:Dim9SA")
}

record(subArray, "$(CAM):Nexus1:Dim9SA")
{
    field(INP,  "$(CAM):Nexus1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "9")
    field(FLNK, "$(CAM):Nexus1:ArraySize9")
}

record(longin, "$(CAM):Nexus1:ArraySize9")
{
    field(INP,  "$(CAM):Nexus1:Dim9SA")
}


record(waveform, "$(CAM):Nexus1:Dimensions_RBV")
{
    field(DTYP, "asynInt32ArrayIn")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))ARRAY_DIMENSIONS")
    field(FTVL, "LONG")
    field(NELM, "10")
    field(FLNK, "$(CAM):Nexus1:Dim0SA_RBV")
    field(SCAN, "I/O Intr")
}

record(subArray, "$(CAM):Nexus1:Dim0SA_RBV")
{
    field(INP,  "$(CAM):Nexus1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "0")
    field(FLNK, "$(CAM):Nexus1:ArraySize0_RBV")
}

record(longin, "$(CAM):Nexus1:ArraySize0_RBV")
{
    field(INP,  "$(CAM):Nexus1:Dim0SA_RBV")
    field(FLNK, "$(CAM):Nexus1:Dim1SA_RBV")
}

record(subArray, "$(CAM):Nexus1:Dim1SA_RBV")
{
    field(INP,  "$(CAM):Nexus1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "1")
    field(FLNK, "$(CAM):Nexus1:ArraySize1_RBV")
}

record(longin, "$(CAM):Nexus1:ArraySize1_RBV")
{
    field(INP,  "$(CAM):Nexus1:Dim1SA_RBV")
    field(FLNK, "$(CAM):Nexus1:Dim2SA_RBV")
}

record(subArray, "$(CAM):Nexus1:Dim2SA_RBV")
{
    field(INP,  "$(CAM):Nexus1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "2")
    field(FLNK, "$(CAM):Nexus1:ArraySize2_RBV")
}

record(longin, "$(CAM):Nexus1:ArraySize2_RBV")
{
    field(INP,  "$(CAM):Nexus1:Dim2SA_RBV")
    field(FLNK, "$(CAM):Nexus1:Dim3SA_RBV")
}

record(subArray, "$(CAM):Nexus1:Dim3SA_RBV")
{
    field(INP,  "$(CAM):Nexus1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "3")
    field(FLNK, "$(CAM):Nexus1:ArraySize3_RBV")
}

record(longin, "$(CAM):Nexus1:ArraySize3_RBV")
{
    field(INP,  "$(CAM):Nexus1:Dim3SA_RBV")
    field(FLNK, "$(CAM):Nexus1:Dim4SA_RBV")
}

record(subArray, "$(CAM):Nexus1:Dim4SA_RBV")
{
    field(INP,  "$(CAM):Nexus1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "4")
    field(FLNK, "$(CAM):Nexus1:ArraySize4_RBV")
}

record(longin, "$(CAM):Nexus1:ArraySize4_RBV")
{
    field(INP,  "$(CAM):Nexus1:Dim4SA_RBV")
    field(FLNK, "$(CAM):Nexus1:Dim5SA_RBV")
}

record(subArray, "$(CAM):Nexus1:Dim5SA_RBV")
{
    field(INP,  "$(CAM):Nexus1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "5")
    field(FLNK, "$(CAM):Nexus1:ArraySize5_RBV")
}

record(longin, "$(CAM):Nexus1:ArraySize5_RBV")
{
    field(INP,  "$(CAM):Nexus1:Dim5SA_RBV")
    field(FLNK, "$(CAM):Nexus1:Dim6SA_RBV")
}

record(subArray, "$(CAM):Nexus1:Dim6SA_RBV")
{
    field(INP,  "$(CAM):Nexus1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "6")
    field(FLNK, "$(CAM):Nexus1:ArraySize6_RBV")
}

record(longin, "$(CAM):Nexus1:ArraySize6_RBV")
{
    field(INP,  "$(CAM):Nexus1:Dim6SA_RBV")
    field(FLNK, "$(CAM):Nexus1:Dim7SA_RBV")
}

record(subArray, "$(CAM):Nexus1:Dim7SA_RBV")
{
    field(INP,  "$(CAM):Nexus1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "7")
    field(FLNK, "$(CAM):Nexus1:ArraySize7_RBV")
}

record(longin, "$(CAM):Nexus1:ArraySize7_RBV")
{
    field(INP,  "$(CAM):Nexus1:Dim7SA_RBV")
    field(FLNK, "$(CAM):Nexus1:Dim8SA_RBV")
}

record(subArray, "$(CAM):Nexus1:Dim8SA_RBV")
{
    field(INP,  "$(CAM):Nexus1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "8")
    field(FLNK, "$(CAM):Nexus1:ArraySize8_RBV")
}

record(longin, "$(CAM):Nexus1:ArraySize8_RBV")
{
    field(INP,  "$(CAM):Nexus1:Dim8SA_RBV")
    field(FLNK, "$(CAM):Nexus1:Dim9SA_RBV")
}

record(subArray, "$(CAM):Nexus1:Dim9SA_RBV")
{
    field(INP,  "$(CAM):Nexus1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "9")
    field(FLNK, "$(CAM):Nexus1:ArraySize9_RBV")
}

record(longin, "$(CAM):Nexus1:ArraySize9_RBV")
{
    field(INP,  "$(CAM):Nexus1:Dim9SA_RBV")
}


record(mbbi, "$(CAM):Nexus1:BayerPattern_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))BAYER_PATTERN")
   field(ZRST, "RGGB")
   field(ZRVL, "0")
   field(ONST, "GBRG")
   field(ONVL, "1")
   field(TWST, "GRBG")
   field(TWVL, "2")
   field(THST, "BGGR")
   field(THVL, "3")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Nexus1:ArraySizeX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_X")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Nexus1:ArraySizeY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_Y")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Nexus1:ArraySizeZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_Z")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Nexus1:ArraySize_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records have information on the compression              # 
###################################################################
record(stringin, "$(CAM):Nexus1:Codec_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))CODEC")
   field(VAL,  "")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Nexus1:CompressedSize_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))COMPRESSED_SIZE")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the data type                            # 
###################################################################

record(mbbo, "$(CAM):Nexus1:DataType")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))DATA_TYPE")
   field(ZRST, "Int8")
   field(ZRVL, "0")
   field(ONST, "UInt8")
   field(ONVL, "1")
   field(TWST, "Int16")
   field(TWVL, "2")
   field(THST, "UInt16")
   field(THVL, "3")
   field(FRST, "Int32")
   field(FRVL, "4")
   field(FVST, "UInt32")
   field(FVVL, "5")
   field(SXST, "Int64")
   field(SXVL, "6")
   field(SVST, "UInt64")
   field(SVVL, "7")
   field(EIST, "Float32")
   field(EIVL, "8")
   field(NIST, "Float64")
   field(NIVL, "9")
   field(VAL,  "0")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Nexus1:DataType_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))DATA_TYPE")
   field(ZRST, "Int8")
   field(ZRVL, "0")
   field(ONST, "UInt8")
   field(ONVL, "1")
   field(TWST, "Int16")
   field(TWVL, "2")
   field(THST, "UInt16")
   field(THVL, "3")
   field(FRST, "Int32")
   field(FRVL, "4")
   field(FVST, "UInt32")
   field(FVVL, "5")
   field(SXST, "Int64")
   field(SXVL, "6")
   field(SVST, "UInt64")
   field(SVVL, "7")
   field(EIST, "Float32")
   field(EIVL, "8")
   field(NIST, "Float64")
   field(NIVL, "9")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Nexus1:BitsPerPixel_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))BITS_PER_PIXEL")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the color mode                           #
#  These choices must agree with NDColorMode_t in NDArray.h       # 
###################################################################

record(mbbo, "$(CAM):Nexus1:ColorMode")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))COLOR_MODE")
   field(ZRST, "Mono")
   field(ZRVL, "0")
   field(ONST, "Bayer")
   field(ONVL, "1")
   field(TWST, "RGB1")
   field(TWVL, "2")
   field(THST, "RGB2")
   field(THVL, "3")
   field(FRST, "RGB3")
   field(FRVL, "4")
   field(FVST, "YUV444")
   field(FVVL, "5")
   field(SXST, "YUV422")
   field(SXVL, "6")
   field(SVST, "YUV421")
   field(SVVL, "7")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Nexus1:ColorMode_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))COLOR_MODE")
   field(ZRST, "Mono")
   field(ZRVL, "0")
   field(ONST, "Bayer")
   field(ONVL, "1")
   field(TWST, "RGB1")
   field(TWVL, "2")
   field(THST, "RGB2")
   field(THVL, "3")
   field(FRST, "RGB3")
   field(FRVL, "4")
   field(FVST, "YUV444")
   field(FVVL, "5")
   field(SXST, "YUV422")
   field(SXVL, "6")
   field(SVST, "YUV421")
   field(SVVL, "7")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records are the uniqueId and time stamps of the array     #
###################################################################
record(longin, "$(CAM):Nexus1:UniqueId_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))UNIQUE_ID")
    field(SCAN, "I/O Intr")
}

record(ai, "$(CAM):Nexus1:TimeStamp_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))TIME_STAMP")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Nexus1:EpicsTSSec_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))EPICS_TS_SEC")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Nexus1:EpicsTSNsec_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))EPICS_TS_NSEC")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records provide statistics on array callbacks and        #
#  array callback rates                                           # 
###################################################################
record(longout, "$(CAM):Nexus1:ArrayCounter")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))ARRAY_COUNTER")
}

record(longin, "$(CAM):Nexus1:ArrayCounter_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))ARRAY_COUNTER")
    field(SCAN, "I/O Intr")
    field(TSE,  "-2")
    field(LOW,  "0" )
    field(LSV,  "MINOR" )
    info(autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV TSE")
}

# Updated rate calculation to use a smoothing factor w/ guard against negative values
# 0 rate sets alarm state to MINOR
record(calc, "$(CAM):Nexus1:ArrayRate_RBV")
{
    field(INPA, "$(CAM):Nexus1:ArrayRate_RBV.LB NPP NMS")   # Previous counter (Last B value)
    field(INPB, "$(CAM):Nexus1:ArrayCounter_RBV NPP NMS")   # Current counter value
    field(INPC, "1.0")                                # Delta time in seconds
    field(INPD, "$(CAM):Nexus1:ArrayRate_RBV.VAL NPP NMS")  # Previous rate
    field(INPE, "0.0")                 # Smoothing factor
    field(CALC, "(D*E)/C+MAX(0,B-A)*(1-E)/C")
    field(PREC, "2" )
    field(EGU,  "Hz" )
    field(SCAN, "1 second")
    field(LOW,  "0")
    field(LSV,  "MINOR")
    field(ADEL, "0.1")
    info(autosaveFields, "ADEL DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV MDEL PREC C E SCAN EGU")
}

###################################################################
#  These records control NDArray callacks                         # 
###################################################################
record(bo, "$(CAM):Nexus1:ArrayCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))ARRAY_CALLBACKS")
    field(ZNAM, "Disable")
    field(ZSV,  "MINOR")
    field(ONAM, "Enable")
    field(OSV,  "NO_ALARM")
    field(VAL, "1")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Nexus1:ArrayCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))ARRAY_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ZSV,  "MINOR")
    field(ONAM, "Enabled")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains macro definitions for the attributes      # 
###################################################################

record(waveform, "$(CAM):Nexus1:NDAttributesMacros")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_MACROS")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

###################################################################
#  This record is the name of a file defining attributes          # 
###################################################################

record(waveform, "$(CAM):Nexus1:NDAttributesFile")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_FILE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

###################################################################
#  This record defines the status of reading attributes file      # 
###################################################################

record(mbbi, "$(CAM):Nexus1:NDAttributesStatus")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_STATUS")
    field(ZRVL, "0")
    field(ZRST, "Attributes file OK")
    field(ZRSV, "NO_ALARM")
    field(ONVL, "1")
    field(ONST, "File not found")
    field(ONSV, "MINOR")
    field(TWVL, "2")
    field(TWST, "XML syntax error")
    field(TWSV, "MAJOR")
    field(THVL, "3")
    field(THST, "Macro substitution error")
    field(THSV, "MAJOR")
    field(SCAN, "I/O Intr")
}

###################################################################
#  Status of NDArrayPool - number of buffers, memory used etc.    # 
###################################################################

record(ai, "$(CAM):Nexus1:PoolMaxMem")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))POOL_MAX_MEMORY")
   field(PREC, "1")
   field(EGU,  "MB")
   field(SCAN, "Passive")
   field(PINI, "YES")
}

record(ai, "$(CAM):Nexus1:PoolUsedMem")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))POOL_USED_MEMORY")
   field(PREC, "1")
   field(EGU,  "MB")
   field(SCAN, "1 second")
   field(FLNK, "$(CAM):Nexus1:PoolAllocBuffers")
   info(autosaveFields, "SCAN")
}

record(longin, "$(CAM):Nexus1:PoolAllocBuffers")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))POOL_ALLOC_BUFFERS")
   field(FLNK, "$(CAM):Nexus1:PoolFreeBuffers")
}

record(longin, "$(CAM):Nexus1:PoolFreeBuffers")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))POOL_FREE_BUFFERS")
   field(FLNK, "$(CAM):Nexus1:PoolUsedBuffers")
}

record(calc, "$(CAM):Nexus1:PoolUsedBuffers")
{
    field(INPA, "$(CAM):Nexus1:PoolAllocBuffers NPP MS")
    field(INPB, "$(CAM):Nexus1:PoolFreeBuffers NPP MS")
    field(CALC, "A-B")
}

record(bo, "$(CAM):Nexus1:EmptyFreeList")
{
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))POOL_EMPTY_FREELIST")
}

record(longin, "$(CAM):Nexus1:NumQueuedArrays")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))NUM_QUEUED_ARRAYS")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the type of plugin                        #
###################################################################

record(stringin, "$(CAM):Nexus1:PluginType_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))PLUGIN_TYPE")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the connection of the server to          #
#  an NDArray driver port and address                             #
###################################################################
# Array port name
record(stringout, "$(CAM):Nexus1:NDArrayPort")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(OUT,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))NDARRAY_PORT")
    field(VAL,  "$(CAM_PORT)")
    info(autosaveFields, "DESC VAL")
}

record(stringin, "$(CAM):Nexus1:NDArrayPort_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))NDARRAY_PORT")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Nexus1:NDArrayAddress")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))NDARRAY_ADDR")
    field(VAL,  "$(NDARRAY_ADDR=0)")
    info(autosaveFields, "DESC VAL")
}

record(longin, "$(CAM):Nexus1:NDArrayAddress_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))NDARRAY_ADDR")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control whether callbacks are enabled and        #
#  minimum time between callbacks                                 #
###################################################################
record(bo, "$(CAM):Nexus1:EnableCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))ENABLE_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    field(VAL,  "0")
    info(autosaveFields, "DESC VAL")
}

record(bi, "$(CAM):Nexus1:EnableCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))ENABLE_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    field(ZSV,  "MINOR")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Nexus1:MinCallbackTime")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))MIN_CALLBACK_TIME")
    field(EGU,  "s")
    field(PREC, "3")
    field(VAL,  "0.0")
    field(DRVL, "0")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):Nexus1:MinCallbackTime_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))MIN_CALLBACK_TIME")
    field(EGU,  "s")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Nexus1:MaxArrayRate")
{
    field(DTYP, "Soft Channel")
    field(OUT,  "$(CAM):Nexus1:MaxArrayRate_COUT PP")
    field(EGU,  "Hz")
    field(PREC, "3")
    field(VAL,  "0.0")
    info(autosaveFields, "VAL")
}

record(calcout, "$(CAM):Nexus1:MaxArrayRate_COUT")
{
    field(INPA, "$(CAM):Nexus1:MaxArrayRate")
    field(CALC, "A=0?0:1.0/A")
    field(OUT,  "$(CAM):Nexus1:MinCallbackTime PP")
}

record(calc, "$(CAM):Nexus1:MaxArrayRate_RBV")
{
    field(INPA, "$(CAM):Nexus1:MinCallbackTime_RBV CP")
    field(CALC, "A=0?0:1.0/A")
    field(EGU,  "Hz")
    field(PREC, "3")
    field(SCAN, "Passive")
}

record(ao, "$(CAM):Nexus1:MaxByteRate")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))MAX_BYTE_RATE")
    field(EGU,  "s")
    field(PREC, "3")
    field(VAL,  "0.0")
    field(DRVL, "0")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):Nexus1:MaxByteRate_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))MAX_BYTE_RATE")
    field(EGU,  "s")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the last execution time of the plugin     #
###################################################################
record(ai, "$(CAM):Nexus1:ExecutionTime_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))EXECUTION_TIME")
    field(EGU,  "ms")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record requests that the plugin execute again with the    #
#  same NDArray                                                   #
###################################################################
record(bo, "$(CAM):Nexus1:ProcessPlugin")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))PROCESS_PLUGIN")
    field(VAL,  "1")
}

###################################################################
#  These records control whether callbacks block or not           #
###################################################################
record(bo, "$(CAM):Nexus1:BlockingCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))BLOCKING_CALLBACKS")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(VAL,  "0")
    info(autosaveFields, "DESC ZSV OSV VAL")
}

record(bi, "$(CAM):Nexus1:BlockingCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))BLOCKING_CALLBACKS")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(ZSV,  "NO_ALARM")
    field(OSV,  "MINOR")
    field(SCAN, "I/O Intr")
    info( autosaveFields, "DESC ZSV OSV" )
}


record(longout, "$(CAM):Nexus1:DroppedArrays")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))DROPPED_ARRAYS")
    field(VAL,  "0")
    info( autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV EGU" )
}

record(longin, "$(CAM):Nexus1:DroppedArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))DROPPED_ARRAYS")
    field(SCAN, "I/O Intr")
    field(HIGH, "1")
    field(HSV,  "MINOR")
    info( autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV EGU" )
}

record(longout, "$(CAM):Nexus1:QueueSize")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))QUEUE_SIZE")
    field(PINI, "YES")
    info( autosaveFields, "DESC EGU" )
}

record(longin, "$(CAM):Nexus1:QueueSize_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))QUEUE_SIZE")
    field(FLNK, "$(CAM):Nexus1:QueueFreeLow")
    field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):Nexus1:QueueFreeLow") {
    field(CALC, "A*0.25")
    field(INPA, "$(CAM):Nexus1:QueueSize")
    field(OUT,  "$(CAM):Nexus1:QueueFree.LOW")
    field(FLNK, "$(CAM):Nexus1:QueueUseHIGH")
}

# Set a HIGH warning level for the input queue fill level to 75%
# of the full size of the queue
record(calcout, "$(CAM):Nexus1:QueueUseHIGH") {
   field(CALC, "A*0.75")
   field(INPA, "$(CAM):Nexus1:QueueSize")
   field(OUT,  "$(CAM):Nexus1:QueueUse.HIGH")
   field(FLNK, "$(CAM):Nexus1:QueueUseHIHI")
}

# Set a HIHI level for the input queue fill level to indicate an error
# (MAJOR alarm)  when it fills up to the full size of the queue (frames start dropping)
record(calcout, "$(CAM):Nexus1:QueueUseHIHI") {
   field(CALC, "A*1.0")
   field(INPA, "$(CAM):Nexus1:QueueSize")
   field(OUT,  "$(CAM):Nexus1:QueueUse.HIHI")
}

record(longin, "$(CAM):Nexus1:QueueFree")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))QUEUE_FREE")
    field(LLSV, "MAJOR")
    field(LSV,  "MINOR")
    field(LOLO, "0")
    field(HYST, "1")
    field(SCAN, "I/O Intr")
}

# Display the fill level on the plugins input queue
record(calc, "$(CAM):Nexus1:QueueUse") {
    field(CALC, "A-B")
    field(INPA, "$(CAM):Nexus1:QueueSize")
    field(INPB, "$(CAM):Nexus1:QueueFree CP")
    field(SCAN, "Passive")
    field(HHSV, "MAJOR")
    field(HSV,  "MINOR")
    field(HYST, "1")
}

record(longout, "$(CAM):Nexus1:NumThreads")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))NUM_THREADS")
    field(VAL,  "1")
    field(PINI, "YES")
    info(autosaveFields, "DESC VAL")
}

record(longin, "$(CAM):Nexus1:NumThreads_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))NUM_THREADS")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Nexus1:MaxThreads_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))MAX_THREADS")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control output array sorting                     #
###################################################################
record(mbbo, "$(CAM):Nexus1:SortMode") {
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))SORT_MODE")
    field(ZRVL, "0")
    field(ZRST, "Unsorted")
    field(ONVL, "1")
    field(ONST, "Sorted")
}

record(mbbi, "$(CAM):Nexus1:SortMode_RBV") {
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))SORT_MODE")
    field(ZRVL, "0")
    field(ZRST, "Unsorted")
    field(ONVL, "1")
    field(ONST, "Sorted")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Nexus1:SortTime") {
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))SORT_TIME")
    field(PREC, "3")
    field(VAL, "0.1")
}

record(ai, "$(CAM):Nexus1:SortTime_RBV") {
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))SORT_TIME")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Nexus1:SortSize")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))SORT_SIZE")
    field(VAL,  "20")
    field(PINI, "YES")
}

record(longin, "$(CAM):Nexus1:SortSize_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))SORT_SIZE")
    field(FLNK, "$(CAM):Nexus1:SortFreeLow")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Nexus1:SortFree") {
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))SORT_FREE")
    field(LLSV, "MAJOR")
    field(LSV,  "MINOR")
    field(LOLO, "0")
    field(HYST, "1")
    field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):Nexus1:SortFreeLow") {
    field(CALC, "A*0.25")
    field(INPA, "$(CAM):Nexus1:SortSize")
    field(OUT,  "$(CAM):Nexus1:SortFree.LOW")
}

record(longout, "$(CAM):Nexus1:DroppedOutputArrays")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))DROPPED_OUTPUT_ARRAYS")
    field(VAL,  "0")
}

record(longin, "$(CAM):Nexus1:DroppedOutputArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))DROPPED_OUTPUT_ARRAYS")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Nexus1:DisorderedArrays")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))DISORDERED_ARRAYS")
    field(PINI, "YES")
}

record(longin, "$(CAM):Nexus1:DisorderedArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))DISORDERED_ARRAYS")
    field(SCAN, "I/O Intr")
}



###################################################################
#  The asynRecord is used for mainly for trace mask               # 
###################################################################
 
# Set ASYN_TRACEIO_HEX bit by default
record(asyn,"$(CAM):Nexus1:AsynIO")
{
    field(PORT, "Nexus1")
    field(TIB2,"1")
    info("ADType", "ADPlugin")
}


# We replace some fields in records defined in NDFile.template
# File data format 
record(mbbo, "$(CAM):Nexus1:FileFormat")
{
    field(ZRST, "NeXus")
    field(ZRVL, "0")
    field(ONST, "Invalid")
    field(ONVL, "1")
}

record(mbbi, "$(CAM):Nexus1:FileFormat_RBV")
{
    field(ZRST, "NeXus")
    field(ZRVL, "0")
    field(ONST, "Undefined")
    field(ONVL, "1")
}


# These records are specific to NeXus file format
# Template File path.
record(waveform, "$(CAM):Nexus1:TemplateFilePath")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))TEMPLATE_FILE_PATH")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

record(waveform, "$(CAM):Nexus1:TemplateFilePath_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))TEMPLATE_FILE_PATH")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

# Template Filename
record(waveform, "$(CAM):Nexus1:TemplateFileName")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))TEMPLATE_FILE_NAME")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

record(waveform, "$(CAM):Nexus1:TemplateFileName_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))TEMPLATE_FILE_NAME")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

record(bi, "$(CAM):Nexus1:FileTemplateValid")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Nexus1,$(ADDR=0),$(TIMEOUT=1))TEMPLATE_FILE_VALID")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(SCAN, "I/O Intr")
}

#=================================================================#
# Template file: NDPluginBase.template
# Database for NDPluginBase, i.e. records common to all plugins
# Mark Rivers
# April 25, 2008

#=================================================================#
# Template file: NDArrayBase.template
# Database for area detector control using asyn driver and standard asyn device support
# Mark Rivers
# March 9, 2008

###################################################################
#  This record contains the version of ADCore                     #
###################################################################

record(stringin, "$(CAM):Over1:ADCoreVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))ADCORE_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the version of the driver or plugin       #
###################################################################

record(stringin, "$(CAM):Over1:DriverVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))DRIVER_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the asyn port name of this detector       #
###################################################################

record(stringin, "$(CAM):Over1:PortName_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))PORT_NAME_SELF")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records contain basic information about the detector     # 
###################################################################

record(stringin, "$(CAM):Over1:Manufacturer_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))MANUFACTURER")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):Over1:Model_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))MODEL")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):Over1:SerialNumber_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))SERIAL_NUMBER")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):Over1:SDKVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))SDK_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):Over1:FirmwareVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))FIRMWARE_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control acquisition start and stop               #
###################################################################

record(bo, "$(CAM):Over1:Acquire") {
   field(DTYP, "asynInt32")
   field(OUT, "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))ACQUIRE")
   field(ZNAM, "Done")
   field(ONAM, "Acquire")
   field(VAL,  "0")
   field(FLNK, "$(CAM):Over1:SetAcquireBusy")
   info(asyn:READBACK, "1")
}

record(bi, "$(CAM):Over1:Acquire_RBV") {
   field(DTYP, "asynInt32")
   field(INP, "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))ACQUIRE")
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):Over1:SetAcquireBusy")
{
    field(INPA, "$(CAM):Over1:Acquire NPP")
    field(CALC, "A")
    field(OOPT, "Transition To Non-zero")
    field(OUT,  "$(CAM):Over1:AcquireBusy PP")
}

record(busy, "$(CAM):Over1:AcquireBusy") {
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(VAL,  "0")
}

record(bi, "$(CAM):Over1:AcquireBusyCB") {
   field(DTYP, "asynInt32")
   field(INP, "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))ACQUIRE_BUSY")
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):Over1:ClearAcquireBusy") {
    field(INPA, "$(CAM):Over1:AcquireBusyCB CP")
    field(CALC, "A")
    field(OOPT, "Transition To Zero")
    field(OUT,  "$(CAM):Over1:AcquireBusy PP")
}

record(bo, "$(CAM):Over1:WaitForPlugins") {
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT, "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))WAIT_FOR_PLUGINS")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(VAL,  "0")
}

###################################################################
#  These records are the array size and data type                 #
###################################################################
# The number of dimensions
record(longout, "$(CAM):Over1:NDimensions")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))ARRAY_NDIMENSIONS")
}

record(longin, "$(CAM):Over1:NDimensions_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))ARRAY_NDIMENSIONS")
    field(SCAN, "I/O Intr")
}

# The array dimensions waveform records
record(waveform, "$(CAM):Over1:Dimensions")
{
    field(DTYP, "asynInt32ArrayOut")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))ARRAY_DIMENSIONS")
    field(FTVL, "LONG")
    field(NELM, "10")
    field(FLNK, "$(CAM):Over1:Dim0SA")
}

record(subArray, "$(CAM):Over1:Dim0SA")
{
    field(INP,  "$(CAM):Over1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "0")
    field(FLNK, "$(CAM):Over1:ArraySize0")
}

record(longin, "$(CAM):Over1:ArraySize0")
{
    field(INP,  "$(CAM):Over1:Dim0SA")
    field(FLNK, "$(CAM):Over1:Dim1SA")
}

record(subArray, "$(CAM):Over1:Dim1SA")
{
    field(INP,  "$(CAM):Over1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "1")
    field(FLNK, "$(CAM):Over1:ArraySize1")
}

record(longin, "$(CAM):Over1:ArraySize1")
{
    field(INP,  "$(CAM):Over1:Dim1SA")
    field(FLNK, "$(CAM):Over1:Dim2SA")
}

record(subArray, "$(CAM):Over1:Dim2SA")
{
    field(INP,  "$(CAM):Over1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "2")
    field(FLNK, "$(CAM):Over1:ArraySize2")
}

record(longin, "$(CAM):Over1:ArraySize2")
{
    field(INP,  "$(CAM):Over1:Dim2SA")
    field(FLNK, "$(CAM):Over1:Dim3SA")
}

record(subArray, "$(CAM):Over1:Dim3SA")
{
    field(INP,  "$(CAM):Over1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "3")
    field(FLNK, "$(CAM):Over1:ArraySize3")
}

record(longin, "$(CAM):Over1:ArraySize3")
{
    field(INP,  "$(CAM):Over1:Dim3SA")
    field(FLNK, "$(CAM):Over1:Dim4SA")
}

record(subArray, "$(CAM):Over1:Dim4SA")
{
    field(INP,  "$(CAM):Over1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "4")
    field(FLNK, "$(CAM):Over1:ArraySize4")
}

record(longin, "$(CAM):Over1:ArraySize4")
{
    field(INP,  "$(CAM):Over1:Dim4SA")
    field(FLNK, "$(CAM):Over1:Dim5SA")
}

record(subArray, "$(CAM):Over1:Dim5SA")
{
    field(INP,  "$(CAM):Over1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "5")
    field(FLNK, "$(CAM):Over1:ArraySize5")
}

record(longin, "$(CAM):Over1:ArraySize5")
{
    field(INP,  "$(CAM):Over1:Dim5SA")
    field(FLNK, "$(CAM):Over1:Dim6SA")
}

record(subArray, "$(CAM):Over1:Dim6SA")
{
    field(INP,  "$(CAM):Over1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "6")
    field(FLNK, "$(CAM):Over1:ArraySize6")
}

record(longin, "$(CAM):Over1:ArraySize6")
{
    field(INP,  "$(CAM):Over1:Dim6SA")
    field(FLNK, "$(CAM):Over1:Dim7SA")
}

record(subArray, "$(CAM):Over1:Dim7SA")
{
    field(INP,  "$(CAM):Over1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "7")
    field(FLNK, "$(CAM):Over1:ArraySize7")
}

record(longin, "$(CAM):Over1:ArraySize7")
{
    field(INP,  "$(CAM):Over1:Dim7SA")
    field(FLNK, "$(CAM):Over1:Dim8SA")
}

record(subArray, "$(CAM):Over1:Dim8SA")
{
    field(INP,  "$(CAM):Over1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "8")
    field(FLNK, "$(CAM):Over1:ArraySize8")
}

record(longin, "$(CAM):Over1:ArraySize8")
{
    field(INP,  "$(CAM):Over1:Dim8SA")
    field(FLNK, "$(CAM):Over1:Dim9SA")
}

record(subArray, "$(CAM):Over1:Dim9SA")
{
    field(INP,  "$(CAM):Over1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "9")
    field(FLNK, "$(CAM):Over1:ArraySize9")
}

record(longin, "$(CAM):Over1:ArraySize9")
{
    field(INP,  "$(CAM):Over1:Dim9SA")
}


record(waveform, "$(CAM):Over1:Dimensions_RBV")
{
    field(DTYP, "asynInt32ArrayIn")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))ARRAY_DIMENSIONS")
    field(FTVL, "LONG")
    field(NELM, "10")
    field(FLNK, "$(CAM):Over1:Dim0SA_RBV")
    field(SCAN, "I/O Intr")
}

record(subArray, "$(CAM):Over1:Dim0SA_RBV")
{
    field(INP,  "$(CAM):Over1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "0")
    field(FLNK, "$(CAM):Over1:ArraySize0_RBV")
}

record(longin, "$(CAM):Over1:ArraySize0_RBV")
{
    field(INP,  "$(CAM):Over1:Dim0SA_RBV")
    field(FLNK, "$(CAM):Over1:Dim1SA_RBV")
}

record(subArray, "$(CAM):Over1:Dim1SA_RBV")
{
    field(INP,  "$(CAM):Over1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "1")
    field(FLNK, "$(CAM):Over1:ArraySize1_RBV")
}

record(longin, "$(CAM):Over1:ArraySize1_RBV")
{
    field(INP,  "$(CAM):Over1:Dim1SA_RBV")
    field(FLNK, "$(CAM):Over1:Dim2SA_RBV")
}

record(subArray, "$(CAM):Over1:Dim2SA_RBV")
{
    field(INP,  "$(CAM):Over1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "2")
    field(FLNK, "$(CAM):Over1:ArraySize2_RBV")
}

record(longin, "$(CAM):Over1:ArraySize2_RBV")
{
    field(INP,  "$(CAM):Over1:Dim2SA_RBV")
    field(FLNK, "$(CAM):Over1:Dim3SA_RBV")
}

record(subArray, "$(CAM):Over1:Dim3SA_RBV")
{
    field(INP,  "$(CAM):Over1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "3")
    field(FLNK, "$(CAM):Over1:ArraySize3_RBV")
}

record(longin, "$(CAM):Over1:ArraySize3_RBV")
{
    field(INP,  "$(CAM):Over1:Dim3SA_RBV")
    field(FLNK, "$(CAM):Over1:Dim4SA_RBV")
}

record(subArray, "$(CAM):Over1:Dim4SA_RBV")
{
    field(INP,  "$(CAM):Over1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "4")
    field(FLNK, "$(CAM):Over1:ArraySize4_RBV")
}

record(longin, "$(CAM):Over1:ArraySize4_RBV")
{
    field(INP,  "$(CAM):Over1:Dim4SA_RBV")
    field(FLNK, "$(CAM):Over1:Dim5SA_RBV")
}

record(subArray, "$(CAM):Over1:Dim5SA_RBV")
{
    field(INP,  "$(CAM):Over1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "5")
    field(FLNK, "$(CAM):Over1:ArraySize5_RBV")
}

record(longin, "$(CAM):Over1:ArraySize5_RBV")
{
    field(INP,  "$(CAM):Over1:Dim5SA_RBV")
    field(FLNK, "$(CAM):Over1:Dim6SA_RBV")
}

record(subArray, "$(CAM):Over1:Dim6SA_RBV")
{
    field(INP,  "$(CAM):Over1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "6")
    field(FLNK, "$(CAM):Over1:ArraySize6_RBV")
}

record(longin, "$(CAM):Over1:ArraySize6_RBV")
{
    field(INP,  "$(CAM):Over1:Dim6SA_RBV")
    field(FLNK, "$(CAM):Over1:Dim7SA_RBV")
}

record(subArray, "$(CAM):Over1:Dim7SA_RBV")
{
    field(INP,  "$(CAM):Over1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "7")
    field(FLNK, "$(CAM):Over1:ArraySize7_RBV")
}

record(longin, "$(CAM):Over1:ArraySize7_RBV")
{
    field(INP,  "$(CAM):Over1:Dim7SA_RBV")
    field(FLNK, "$(CAM):Over1:Dim8SA_RBV")
}

record(subArray, "$(CAM):Over1:Dim8SA_RBV")
{
    field(INP,  "$(CAM):Over1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "8")
    field(FLNK, "$(CAM):Over1:ArraySize8_RBV")
}

record(longin, "$(CAM):Over1:ArraySize8_RBV")
{
    field(INP,  "$(CAM):Over1:Dim8SA_RBV")
    field(FLNK, "$(CAM):Over1:Dim9SA_RBV")
}

record(subArray, "$(CAM):Over1:Dim9SA_RBV")
{
    field(INP,  "$(CAM):Over1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "9")
    field(FLNK, "$(CAM):Over1:ArraySize9_RBV")
}

record(longin, "$(CAM):Over1:ArraySize9_RBV")
{
    field(INP,  "$(CAM):Over1:Dim9SA_RBV")
}


record(mbbi, "$(CAM):Over1:BayerPattern_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))BAYER_PATTERN")
   field(ZRST, "RGGB")
   field(ZRVL, "0")
   field(ONST, "GBRG")
   field(ONVL, "1")
   field(TWST, "GRBG")
   field(TWVL, "2")
   field(THST, "BGGR")
   field(THVL, "3")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Over1:ArraySizeX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_X")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Over1:ArraySizeY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_Y")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Over1:ArraySizeZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_Z")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Over1:ArraySize_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records have information on the compression              # 
###################################################################
record(stringin, "$(CAM):Over1:Codec_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))CODEC")
   field(VAL,  "")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Over1:CompressedSize_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))COMPRESSED_SIZE")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the data type                            # 
###################################################################

record(mbbo, "$(CAM):Over1:DataType")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))DATA_TYPE")
   field(ZRST, "Int8")
   field(ZRVL, "0")
   field(ONST, "UInt8")
   field(ONVL, "1")
   field(TWST, "Int16")
   field(TWVL, "2")
   field(THST, "UInt16")
   field(THVL, "3")
   field(FRST, "Int32")
   field(FRVL, "4")
   field(FVST, "UInt32")
   field(FVVL, "5")
   field(SXST, "Int64")
   field(SXVL, "6")
   field(SVST, "UInt64")
   field(SVVL, "7")
   field(EIST, "Float32")
   field(EIVL, "8")
   field(NIST, "Float64")
   field(NIVL, "9")
   field(VAL,  "0")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Over1:DataType_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))DATA_TYPE")
   field(ZRST, "Int8")
   field(ZRVL, "0")
   field(ONST, "UInt8")
   field(ONVL, "1")
   field(TWST, "Int16")
   field(TWVL, "2")
   field(THST, "UInt16")
   field(THVL, "3")
   field(FRST, "Int32")
   field(FRVL, "4")
   field(FVST, "UInt32")
   field(FVVL, "5")
   field(SXST, "Int64")
   field(SXVL, "6")
   field(SVST, "UInt64")
   field(SVVL, "7")
   field(EIST, "Float32")
   field(EIVL, "8")
   field(NIST, "Float64")
   field(NIVL, "9")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Over1:BitsPerPixel_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))BITS_PER_PIXEL")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the color mode                           #
#  These choices must agree with NDColorMode_t in NDArray.h       # 
###################################################################

record(mbbo, "$(CAM):Over1:ColorMode")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))COLOR_MODE")
   field(ZRST, "Mono")
   field(ZRVL, "0")
   field(ONST, "Bayer")
   field(ONVL, "1")
   field(TWST, "RGB1")
   field(TWVL, "2")
   field(THST, "RGB2")
   field(THVL, "3")
   field(FRST, "RGB3")
   field(FRVL, "4")
   field(FVST, "YUV444")
   field(FVVL, "5")
   field(SXST, "YUV422")
   field(SXVL, "6")
   field(SVST, "YUV421")
   field(SVVL, "7")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Over1:ColorMode_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))COLOR_MODE")
   field(ZRST, "Mono")
   field(ZRVL, "0")
   field(ONST, "Bayer")
   field(ONVL, "1")
   field(TWST, "RGB1")
   field(TWVL, "2")
   field(THST, "RGB2")
   field(THVL, "3")
   field(FRST, "RGB3")
   field(FRVL, "4")
   field(FVST, "YUV444")
   field(FVVL, "5")
   field(SXST, "YUV422")
   field(SXVL, "6")
   field(SVST, "YUV421")
   field(SVVL, "7")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records are the uniqueId and time stamps of the array     #
###################################################################
record(longin, "$(CAM):Over1:UniqueId_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))UNIQUE_ID")
    field(SCAN, "I/O Intr")
}

record(ai, "$(CAM):Over1:TimeStamp_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))TIME_STAMP")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Over1:EpicsTSSec_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))EPICS_TS_SEC")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Over1:EpicsTSNsec_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))EPICS_TS_NSEC")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records provide statistics on array callbacks and        #
#  array callback rates                                           # 
###################################################################
record(longout, "$(CAM):Over1:ArrayCounter")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))ARRAY_COUNTER")
}

record(longin, "$(CAM):Over1:ArrayCounter_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))ARRAY_COUNTER")
    field(SCAN, "I/O Intr")
    field(TSE,  "-2")
    field(LOW,  "0" )
    field(LSV,  "MINOR" )
    info(autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV TSE")
}

# Updated rate calculation to use a smoothing factor w/ guard against negative values
# 0 rate sets alarm state to MINOR
record(calc, "$(CAM):Over1:ArrayRate_RBV")
{
    field(INPA, "$(CAM):Over1:ArrayRate_RBV.LB NPP NMS")   # Previous counter (Last B value)
    field(INPB, "$(CAM):Over1:ArrayCounter_RBV NPP NMS")   # Current counter value
    field(INPC, "1.0")                                # Delta time in seconds
    field(INPD, "$(CAM):Over1:ArrayRate_RBV.VAL NPP NMS")  # Previous rate
    field(INPE, "$(RATE_SMOOTH=0.2)")                 # Smoothing factor
    field(CALC, "(D*E)/C+MAX(0,B-A)*(1-E)/C")
    field(PREC, "2" )
    field(EGU,  "Hz" )
    field(SCAN, "1 second")
    field(LOW,  "0")
    field(LSV,  "MINOR")
    field(ADEL, "0.1")
    info(autosaveFields, "ADEL DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV MDEL PREC C E SCAN EGU")
}

###################################################################
#  These records control NDArray callacks                         # 
###################################################################
record(bo, "$(CAM):Over1:ArrayCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))ARRAY_CALLBACKS")
    field(ZNAM, "Disable")
    field(ZSV,  "MINOR")
    field(ONAM, "Enable")
    field(OSV,  "NO_ALARM")
    field(VAL, "1")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Over1:ArrayCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))ARRAY_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ZSV,  "MINOR")
    field(ONAM, "Enabled")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains macro definitions for the attributes      # 
###################################################################

record(waveform, "$(CAM):Over1:NDAttributesMacros")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_MACROS")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

###################################################################
#  This record is the name of a file defining attributes          # 
###################################################################

record(waveform, "$(CAM):Over1:NDAttributesFile")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_FILE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

###################################################################
#  This record defines the status of reading attributes file      # 
###################################################################

record(mbbi, "$(CAM):Over1:NDAttributesStatus")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_STATUS")
    field(ZRVL, "0")
    field(ZRST, "Attributes file OK")
    field(ZRSV, "NO_ALARM")
    field(ONVL, "1")
    field(ONST, "File not found")
    field(ONSV, "MINOR")
    field(TWVL, "2")
    field(TWST, "XML syntax error")
    field(TWSV, "MAJOR")
    field(THVL, "3")
    field(THST, "Macro substitution error")
    field(THSV, "MAJOR")
    field(SCAN, "I/O Intr")
}

###################################################################
#  Status of NDArrayPool - number of buffers, memory used etc.    # 
###################################################################

record(ai, "$(CAM):Over1:PoolMaxMem")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))POOL_MAX_MEMORY")
   field(PREC, "1")
   field(EGU,  "MB")
   field(SCAN, "Passive")
   field(PINI, "YES")
}

record(ai, "$(CAM):Over1:PoolUsedMem")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))POOL_USED_MEMORY")
   field(PREC, "1")
   field(EGU,  "MB")
   field(SCAN, "1 second")
   field(FLNK, "$(CAM):Over1:PoolAllocBuffers")
   info(autosaveFields, "SCAN")
}

record(longin, "$(CAM):Over1:PoolAllocBuffers")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))POOL_ALLOC_BUFFERS")
   field(FLNK, "$(CAM):Over1:PoolFreeBuffers")
}

record(longin, "$(CAM):Over1:PoolFreeBuffers")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))POOL_FREE_BUFFERS")
   field(FLNK, "$(CAM):Over1:PoolUsedBuffers")
}

record(calc, "$(CAM):Over1:PoolUsedBuffers")
{
    field(INPA, "$(CAM):Over1:PoolAllocBuffers NPP MS")
    field(INPB, "$(CAM):Over1:PoolFreeBuffers NPP MS")
    field(CALC, "A-B")
}

record(bo, "$(CAM):Over1:EmptyFreeList")
{
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))POOL_EMPTY_FREELIST")
}

record(longin, "$(CAM):Over1:NumQueuedArrays")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))NUM_QUEUED_ARRAYS")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the type of plugin                        #
###################################################################

record(stringin, "$(CAM):Over1:PluginType_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))PLUGIN_TYPE")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the connection of the server to          #
#  an NDArray driver port and address                             #
###################################################################
# Array port name
record(stringout, "$(CAM):Over1:NDArrayPort")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(OUT,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))NDARRAY_PORT")
    field(VAL,  "$(CAM_PORT)")
    info(autosaveFields, "DESC VAL")
}

record(stringin, "$(CAM):Over1:NDArrayPort_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))NDARRAY_PORT")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:NDArrayAddress")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))NDARRAY_ADDR")
    field(VAL,  "$(NDARRAY_ADDR=0)")
    info(autosaveFields, "DESC VAL")
}

record(longin, "$(CAM):Over1:NDArrayAddress_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))NDARRAY_ADDR")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control whether callbacks are enabled and        #
#  minimum time between callbacks                                 #
###################################################################
record(bo, "$(CAM):Over1:EnableCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))ENABLE_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    field(VAL,  "0")
    info(autosaveFields, "DESC VAL")
}

record(bi, "$(CAM):Over1:EnableCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))ENABLE_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    field(ZSV,  "MINOR")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Over1:MinCallbackTime")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))MIN_CALLBACK_TIME")
    field(EGU,  "s")
    field(PREC, "3")
    field(VAL,  "0.0")
    field(DRVL, "0")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):Over1:MinCallbackTime_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))MIN_CALLBACK_TIME")
    field(EGU,  "s")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Over1:MaxArrayRate")
{
    field(DTYP, "Soft Channel")
    field(OUT,  "$(CAM):Over1:MaxArrayRate_COUT PP")
    field(EGU,  "Hz")
    field(PREC, "3")
    field(VAL,  "0.0")
    info(autosaveFields, "VAL")
}

record(calcout, "$(CAM):Over1:MaxArrayRate_COUT")
{
    field(INPA, "$(CAM):Over1:MaxArrayRate")
    field(CALC, "A=0?0:1.0/A")
    field(OUT,  "$(CAM):Over1:MinCallbackTime PP")
}

record(calc, "$(CAM):Over1:MaxArrayRate_RBV")
{
    field(INPA, "$(CAM):Over1:MinCallbackTime_RBV CP")
    field(CALC, "A=0?0:1.0/A")
    field(EGU,  "Hz")
    field(PREC, "3")
    field(SCAN, "Passive")
}

record(ao, "$(CAM):Over1:MaxByteRate")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))MAX_BYTE_RATE")
    field(EGU,  "s")
    field(PREC, "3")
    field(VAL,  "0.0")
    field(DRVL, "0")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):Over1:MaxByteRate_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))MAX_BYTE_RATE")
    field(EGU,  "s")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the last execution time of the plugin     #
###################################################################
record(ai, "$(CAM):Over1:ExecutionTime_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))EXECUTION_TIME")
    field(EGU,  "ms")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record requests that the plugin execute again with the    #
#  same NDArray                                                   #
###################################################################
record(bo, "$(CAM):Over1:ProcessPlugin")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))PROCESS_PLUGIN")
    field(VAL,  "1")
}

###################################################################
#  These records control whether callbacks block or not           #
###################################################################
record(bo, "$(CAM):Over1:BlockingCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))BLOCKING_CALLBACKS")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(VAL,  "0")
    info(autosaveFields, "DESC ZSV OSV VAL")
}

record(bi, "$(CAM):Over1:BlockingCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))BLOCKING_CALLBACKS")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(ZSV,  "NO_ALARM")
    field(OSV,  "MINOR")
    field(SCAN, "I/O Intr")
    info( autosaveFields, "DESC ZSV OSV" )
}


record(longout, "$(CAM):Over1:DroppedArrays")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))DROPPED_ARRAYS")
    field(VAL,  "0")
    info( autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV EGU" )
}

record(longin, "$(CAM):Over1:DroppedArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))DROPPED_ARRAYS")
    field(SCAN, "I/O Intr")
    field(HIGH, "1")
    field(HSV,  "MINOR")
    info( autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV EGU" )
}

record(longout, "$(CAM):Over1:QueueSize")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))QUEUE_SIZE")
    field(PINI, "YES")
    info( autosaveFields, "DESC EGU" )
}

record(longin, "$(CAM):Over1:QueueSize_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))QUEUE_SIZE")
    field(FLNK, "$(CAM):Over1:QueueFreeLow")
    field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):Over1:QueueFreeLow") {
    field(CALC, "A*0.25")
    field(INPA, "$(CAM):Over1:QueueSize")
    field(OUT,  "$(CAM):Over1:QueueFree.LOW")
    field(FLNK, "$(CAM):Over1:QueueUseHIGH")
}

# Set a HIGH warning level for the input queue fill level to 75%
# of the full size of the queue
record(calcout, "$(CAM):Over1:QueueUseHIGH") {
   field(CALC, "A*0.75")
   field(INPA, "$(CAM):Over1:QueueSize")
   field(OUT,  "$(CAM):Over1:QueueUse.HIGH")
   field(FLNK, "$(CAM):Over1:QueueUseHIHI")
}

# Set a HIHI level for the input queue fill level to indicate an error
# (MAJOR alarm)  when it fills up to the full size of the queue (frames start dropping)
record(calcout, "$(CAM):Over1:QueueUseHIHI") {
   field(CALC, "A*1.0")
   field(INPA, "$(CAM):Over1:QueueSize")
   field(OUT,  "$(CAM):Over1:QueueUse.HIHI")
}

record(longin, "$(CAM):Over1:QueueFree")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))QUEUE_FREE")
    field(LLSV, "MAJOR")
    field(LSV,  "MINOR")
    field(LOLO, "0")
    field(HYST, "1")
    field(SCAN, "I/O Intr")
}

# Display the fill level on the plugins input queue
record(calc, "$(CAM):Over1:QueueUse") {
    field(CALC, "A-B")
    field(INPA, "$(CAM):Over1:QueueSize")
    field(INPB, "$(CAM):Over1:QueueFree CP")
    field(SCAN, "Passive")
    field(HHSV, "MAJOR")
    field(HSV,  "MINOR")
    field(HYST, "1")
}

record(longout, "$(CAM):Over1:NumThreads")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))NUM_THREADS")
    field(VAL,  "1")
    field(PINI, "YES")
    info(autosaveFields, "DESC VAL")
}

record(longin, "$(CAM):Over1:NumThreads_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))NUM_THREADS")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Over1:MaxThreads_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))MAX_THREADS")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control output array sorting                     #
###################################################################
record(mbbo, "$(CAM):Over1:SortMode") {
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))SORT_MODE")
    field(ZRVL, "0")
    field(ZRST, "Unsorted")
    field(ONVL, "1")
    field(ONST, "Sorted")
}

record(mbbi, "$(CAM):Over1:SortMode_RBV") {
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))SORT_MODE")
    field(ZRVL, "0")
    field(ZRST, "Unsorted")
    field(ONVL, "1")
    field(ONST, "Sorted")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Over1:SortTime") {
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))SORT_TIME")
    field(PREC, "3")
    field(VAL, "0.1")
}

record(ai, "$(CAM):Over1:SortTime_RBV") {
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))SORT_TIME")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:SortSize")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))SORT_SIZE")
    field(VAL,  "20")
    field(PINI, "YES")
}

record(longin, "$(CAM):Over1:SortSize_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))SORT_SIZE")
    field(FLNK, "$(CAM):Over1:SortFreeLow")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Over1:SortFree") {
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))SORT_FREE")
    field(LLSV, "MAJOR")
    field(LSV,  "MINOR")
    field(LOLO, "0")
    field(HYST, "1")
    field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):Over1:SortFreeLow") {
    field(CALC, "A*0.25")
    field(INPA, "$(CAM):Over1:SortSize")
    field(OUT,  "$(CAM):Over1:SortFree.LOW")
}

record(longout, "$(CAM):Over1:DroppedOutputArrays")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))DROPPED_OUTPUT_ARRAYS")
    field(VAL,  "0")
}

record(longin, "$(CAM):Over1:DroppedOutputArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))DROPPED_OUTPUT_ARRAYS")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:DisorderedArrays")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))DISORDERED_ARRAYS")
    field(PINI, "YES")
}

record(longin, "$(CAM):Over1:DisorderedArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))DISORDERED_ARRAYS")
    field(SCAN, "I/O Intr")
}



###################################################################
#  The asynRecord is used for mainly for trace mask               # 
###################################################################
 
# Set ASYN_TRACEIO_HEX bit by default
record(asyn,"$(CAM):Over1:AsynIO")
{
    field(PORT, "Over1")
    field(TIB2,"1")
    info("ADType", "ADPlugin")
}

#=================================================================#
# Template file: NDOverlay.template
# Database for NDPluginOverlay asyn driver and standard asyn device support
# Mark Rivers
# March 25, 2010

#=================================================================#
# Template file: NDPluginBase.template
# Database for NDPluginBase, i.e. records common to all plugins
# Mark Rivers
# April 25, 2008

#=================================================================#
# Template file: NDArrayBase.template
# Database for area detector control using asyn driver and standard asyn device support
# Mark Rivers
# March 9, 2008

###################################################################
#  This record contains the version of ADCore                     #
###################################################################

record(stringin, "$(CAM):Over1:ADCoreVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))ADCORE_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the version of the driver or plugin       #
###################################################################

record(stringin, "$(CAM):Over1:DriverVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))DRIVER_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the asyn port name of this detector       #
###################################################################

record(stringin, "$(CAM):Over1:PortName_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))PORT_NAME_SELF")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records contain basic information about the detector     # 
###################################################################

record(stringin, "$(CAM):Over1:Manufacturer_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))MANUFACTURER")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):Over1:Model_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))MODEL")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):Over1:SerialNumber_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))SERIAL_NUMBER")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):Over1:SDKVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))SDK_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):Over1:FirmwareVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))FIRMWARE_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control acquisition start and stop               #
###################################################################

record(bo, "$(CAM):Over1:Acquire") {
   field(DTYP, "asynInt32")
   field(OUT, "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))ACQUIRE")
   field(ZNAM, "Done")
   field(ONAM, "Acquire")
   field(VAL,  "0")
   field(FLNK, "$(CAM):Over1:SetAcquireBusy")
   info(asyn:READBACK, "1")
}

record(bi, "$(CAM):Over1:Acquire_RBV") {
   field(DTYP, "asynInt32")
   field(INP, "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))ACQUIRE")
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):Over1:SetAcquireBusy")
{
    field(INPA, "$(CAM):Over1:Acquire NPP")
    field(CALC, "A")
    field(OOPT, "Transition To Non-zero")
    field(OUT,  "$(CAM):Over1:AcquireBusy PP")
}

record(busy, "$(CAM):Over1:AcquireBusy") {
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(VAL,  "0")
}

record(bi, "$(CAM):Over1:AcquireBusyCB") {
   field(DTYP, "asynInt32")
   field(INP, "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))ACQUIRE_BUSY")
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):Over1:ClearAcquireBusy") {
    field(INPA, "$(CAM):Over1:AcquireBusyCB CP")
    field(CALC, "A")
    field(OOPT, "Transition To Zero")
    field(OUT,  "$(CAM):Over1:AcquireBusy PP")
}

record(bo, "$(CAM):Over1:WaitForPlugins") {
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT, "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))WAIT_FOR_PLUGINS")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(VAL,  "0")
}

###################################################################
#  These records are the array size and data type                 #
###################################################################
# The number of dimensions
record(longout, "$(CAM):Over1:NDimensions")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))ARRAY_NDIMENSIONS")
}

record(longin, "$(CAM):Over1:NDimensions_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))ARRAY_NDIMENSIONS")
    field(SCAN, "I/O Intr")
}

# The array dimensions waveform records
record(waveform, "$(CAM):Over1:Dimensions")
{
    field(DTYP, "asynInt32ArrayOut")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))ARRAY_DIMENSIONS")
    field(FTVL, "LONG")
    field(NELM, "10")
    field(FLNK, "$(CAM):Over1:Dim0SA")
}

record(subArray, "$(CAM):Over1:Dim0SA")
{
    field(INP,  "$(CAM):Over1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "0")
    field(FLNK, "$(CAM):Over1:ArraySize0")
}

record(longin, "$(CAM):Over1:ArraySize0")
{
    field(INP,  "$(CAM):Over1:Dim0SA")
    field(FLNK, "$(CAM):Over1:Dim1SA")
}

record(subArray, "$(CAM):Over1:Dim1SA")
{
    field(INP,  "$(CAM):Over1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "1")
    field(FLNK, "$(CAM):Over1:ArraySize1")
}

record(longin, "$(CAM):Over1:ArraySize1")
{
    field(INP,  "$(CAM):Over1:Dim1SA")
    field(FLNK, "$(CAM):Over1:Dim2SA")
}

record(subArray, "$(CAM):Over1:Dim2SA")
{
    field(INP,  "$(CAM):Over1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "2")
    field(FLNK, "$(CAM):Over1:ArraySize2")
}

record(longin, "$(CAM):Over1:ArraySize2")
{
    field(INP,  "$(CAM):Over1:Dim2SA")
    field(FLNK, "$(CAM):Over1:Dim3SA")
}

record(subArray, "$(CAM):Over1:Dim3SA")
{
    field(INP,  "$(CAM):Over1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "3")
    field(FLNK, "$(CAM):Over1:ArraySize3")
}

record(longin, "$(CAM):Over1:ArraySize3")
{
    field(INP,  "$(CAM):Over1:Dim3SA")
    field(FLNK, "$(CAM):Over1:Dim4SA")
}

record(subArray, "$(CAM):Over1:Dim4SA")
{
    field(INP,  "$(CAM):Over1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "4")
    field(FLNK, "$(CAM):Over1:ArraySize4")
}

record(longin, "$(CAM):Over1:ArraySize4")
{
    field(INP,  "$(CAM):Over1:Dim4SA")
    field(FLNK, "$(CAM):Over1:Dim5SA")
}

record(subArray, "$(CAM):Over1:Dim5SA")
{
    field(INP,  "$(CAM):Over1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "5")
    field(FLNK, "$(CAM):Over1:ArraySize5")
}

record(longin, "$(CAM):Over1:ArraySize5")
{
    field(INP,  "$(CAM):Over1:Dim5SA")
    field(FLNK, "$(CAM):Over1:Dim6SA")
}

record(subArray, "$(CAM):Over1:Dim6SA")
{
    field(INP,  "$(CAM):Over1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "6")
    field(FLNK, "$(CAM):Over1:ArraySize6")
}

record(longin, "$(CAM):Over1:ArraySize6")
{
    field(INP,  "$(CAM):Over1:Dim6SA")
    field(FLNK, "$(CAM):Over1:Dim7SA")
}

record(subArray, "$(CAM):Over1:Dim7SA")
{
    field(INP,  "$(CAM):Over1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "7")
    field(FLNK, "$(CAM):Over1:ArraySize7")
}

record(longin, "$(CAM):Over1:ArraySize7")
{
    field(INP,  "$(CAM):Over1:Dim7SA")
    field(FLNK, "$(CAM):Over1:Dim8SA")
}

record(subArray, "$(CAM):Over1:Dim8SA")
{
    field(INP,  "$(CAM):Over1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "8")
    field(FLNK, "$(CAM):Over1:ArraySize8")
}

record(longin, "$(CAM):Over1:ArraySize8")
{
    field(INP,  "$(CAM):Over1:Dim8SA")
    field(FLNK, "$(CAM):Over1:Dim9SA")
}

record(subArray, "$(CAM):Over1:Dim9SA")
{
    field(INP,  "$(CAM):Over1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "9")
    field(FLNK, "$(CAM):Over1:ArraySize9")
}

record(longin, "$(CAM):Over1:ArraySize9")
{
    field(INP,  "$(CAM):Over1:Dim9SA")
}


record(waveform, "$(CAM):Over1:Dimensions_RBV")
{
    field(DTYP, "asynInt32ArrayIn")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))ARRAY_DIMENSIONS")
    field(FTVL, "LONG")
    field(NELM, "10")
    field(FLNK, "$(CAM):Over1:Dim0SA_RBV")
    field(SCAN, "I/O Intr")
}

record(subArray, "$(CAM):Over1:Dim0SA_RBV")
{
    field(INP,  "$(CAM):Over1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "0")
    field(FLNK, "$(CAM):Over1:ArraySize0_RBV")
}

record(longin, "$(CAM):Over1:ArraySize0_RBV")
{
    field(INP,  "$(CAM):Over1:Dim0SA_RBV")
    field(FLNK, "$(CAM):Over1:Dim1SA_RBV")
}

record(subArray, "$(CAM):Over1:Dim1SA_RBV")
{
    field(INP,  "$(CAM):Over1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "1")
    field(FLNK, "$(CAM):Over1:ArraySize1_RBV")
}

record(longin, "$(CAM):Over1:ArraySize1_RBV")
{
    field(INP,  "$(CAM):Over1:Dim1SA_RBV")
    field(FLNK, "$(CAM):Over1:Dim2SA_RBV")
}

record(subArray, "$(CAM):Over1:Dim2SA_RBV")
{
    field(INP,  "$(CAM):Over1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "2")
    field(FLNK, "$(CAM):Over1:ArraySize2_RBV")
}

record(longin, "$(CAM):Over1:ArraySize2_RBV")
{
    field(INP,  "$(CAM):Over1:Dim2SA_RBV")
    field(FLNK, "$(CAM):Over1:Dim3SA_RBV")
}

record(subArray, "$(CAM):Over1:Dim3SA_RBV")
{
    field(INP,  "$(CAM):Over1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "3")
    field(FLNK, "$(CAM):Over1:ArraySize3_RBV")
}

record(longin, "$(CAM):Over1:ArraySize3_RBV")
{
    field(INP,  "$(CAM):Over1:Dim3SA_RBV")
    field(FLNK, "$(CAM):Over1:Dim4SA_RBV")
}

record(subArray, "$(CAM):Over1:Dim4SA_RBV")
{
    field(INP,  "$(CAM):Over1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "4")
    field(FLNK, "$(CAM):Over1:ArraySize4_RBV")
}

record(longin, "$(CAM):Over1:ArraySize4_RBV")
{
    field(INP,  "$(CAM):Over1:Dim4SA_RBV")
    field(FLNK, "$(CAM):Over1:Dim5SA_RBV")
}

record(subArray, "$(CAM):Over1:Dim5SA_RBV")
{
    field(INP,  "$(CAM):Over1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "5")
    field(FLNK, "$(CAM):Over1:ArraySize5_RBV")
}

record(longin, "$(CAM):Over1:ArraySize5_RBV")
{
    field(INP,  "$(CAM):Over1:Dim5SA_RBV")
    field(FLNK, "$(CAM):Over1:Dim6SA_RBV")
}

record(subArray, "$(CAM):Over1:Dim6SA_RBV")
{
    field(INP,  "$(CAM):Over1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "6")
    field(FLNK, "$(CAM):Over1:ArraySize6_RBV")
}

record(longin, "$(CAM):Over1:ArraySize6_RBV")
{
    field(INP,  "$(CAM):Over1:Dim6SA_RBV")
    field(FLNK, "$(CAM):Over1:Dim7SA_RBV")
}

record(subArray, "$(CAM):Over1:Dim7SA_RBV")
{
    field(INP,  "$(CAM):Over1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "7")
    field(FLNK, "$(CAM):Over1:ArraySize7_RBV")
}

record(longin, "$(CAM):Over1:ArraySize7_RBV")
{
    field(INP,  "$(CAM):Over1:Dim7SA_RBV")
    field(FLNK, "$(CAM):Over1:Dim8SA_RBV")
}

record(subArray, "$(CAM):Over1:Dim8SA_RBV")
{
    field(INP,  "$(CAM):Over1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "8")
    field(FLNK, "$(CAM):Over1:ArraySize8_RBV")
}

record(longin, "$(CAM):Over1:ArraySize8_RBV")
{
    field(INP,  "$(CAM):Over1:Dim8SA_RBV")
    field(FLNK, "$(CAM):Over1:Dim9SA_RBV")
}

record(subArray, "$(CAM):Over1:Dim9SA_RBV")
{
    field(INP,  "$(CAM):Over1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "9")
    field(FLNK, "$(CAM):Over1:ArraySize9_RBV")
}

record(longin, "$(CAM):Over1:ArraySize9_RBV")
{
    field(INP,  "$(CAM):Over1:Dim9SA_RBV")
}


record(mbbi, "$(CAM):Over1:BayerPattern_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))BAYER_PATTERN")
   field(ZRST, "RGGB")
   field(ZRVL, "0")
   field(ONST, "GBRG")
   field(ONVL, "1")
   field(TWST, "GRBG")
   field(TWVL, "2")
   field(THST, "BGGR")
   field(THVL, "3")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Over1:ArraySizeX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_X")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Over1:ArraySizeY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_Y")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Over1:ArraySizeZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_Z")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Over1:ArraySize_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records have information on the compression              # 
###################################################################
record(stringin, "$(CAM):Over1:Codec_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))CODEC")
   field(VAL,  "")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Over1:CompressedSize_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))COMPRESSED_SIZE")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the data type                            # 
###################################################################

record(mbbo, "$(CAM):Over1:DataType")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))DATA_TYPE")
   field(ZRST, "Int8")
   field(ZRVL, "0")
   field(ONST, "UInt8")
   field(ONVL, "1")
   field(TWST, "Int16")
   field(TWVL, "2")
   field(THST, "UInt16")
   field(THVL, "3")
   field(FRST, "Int32")
   field(FRVL, "4")
   field(FVST, "UInt32")
   field(FVVL, "5")
   field(SXST, "Int64")
   field(SXVL, "6")
   field(SVST, "UInt64")
   field(SVVL, "7")
   field(EIST, "Float32")
   field(EIVL, "8")
   field(NIST, "Float64")
   field(NIVL, "9")
   field(VAL,  "0")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Over1:DataType_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))DATA_TYPE")
   field(ZRST, "Int8")
   field(ZRVL, "0")
   field(ONST, "UInt8")
   field(ONVL, "1")
   field(TWST, "Int16")
   field(TWVL, "2")
   field(THST, "UInt16")
   field(THVL, "3")
   field(FRST, "Int32")
   field(FRVL, "4")
   field(FVST, "UInt32")
   field(FVVL, "5")
   field(SXST, "Int64")
   field(SXVL, "6")
   field(SVST, "UInt64")
   field(SVVL, "7")
   field(EIST, "Float32")
   field(EIVL, "8")
   field(NIST, "Float64")
   field(NIVL, "9")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Over1:BitsPerPixel_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))BITS_PER_PIXEL")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the color mode                           #
#  These choices must agree with NDColorMode_t in NDArray.h       # 
###################################################################

record(mbbo, "$(CAM):Over1:ColorMode")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))COLOR_MODE")
   field(ZRST, "Mono")
   field(ZRVL, "0")
   field(ONST, "Bayer")
   field(ONVL, "1")
   field(TWST, "RGB1")
   field(TWVL, "2")
   field(THST, "RGB2")
   field(THVL, "3")
   field(FRST, "RGB3")
   field(FRVL, "4")
   field(FVST, "YUV444")
   field(FVVL, "5")
   field(SXST, "YUV422")
   field(SXVL, "6")
   field(SVST, "YUV421")
   field(SVVL, "7")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Over1:ColorMode_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))COLOR_MODE")
   field(ZRST, "Mono")
   field(ZRVL, "0")
   field(ONST, "Bayer")
   field(ONVL, "1")
   field(TWST, "RGB1")
   field(TWVL, "2")
   field(THST, "RGB2")
   field(THVL, "3")
   field(FRST, "RGB3")
   field(FRVL, "4")
   field(FVST, "YUV444")
   field(FVVL, "5")
   field(SXST, "YUV422")
   field(SXVL, "6")
   field(SVST, "YUV421")
   field(SVVL, "7")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records are the uniqueId and time stamps of the array     #
###################################################################
record(longin, "$(CAM):Over1:UniqueId_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))UNIQUE_ID")
    field(SCAN, "I/O Intr")
}

record(ai, "$(CAM):Over1:TimeStamp_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))TIME_STAMP")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Over1:EpicsTSSec_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))EPICS_TS_SEC")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Over1:EpicsTSNsec_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))EPICS_TS_NSEC")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records provide statistics on array callbacks and        #
#  array callback rates                                           # 
###################################################################
record(longout, "$(CAM):Over1:ArrayCounter")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))ARRAY_COUNTER")
}

record(longin, "$(CAM):Over1:ArrayCounter_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))ARRAY_COUNTER")
    field(SCAN, "I/O Intr")
    field(TSE,  "-2")
    field(LOW,  "0" )
    field(LSV,  "MINOR" )
    info(autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV TSE")
}

# Updated rate calculation to use a smoothing factor w/ guard against negative values
# 0 rate sets alarm state to MINOR
record(calc, "$(CAM):Over1:ArrayRate_RBV")
{
    field(INPA, "$(CAM):Over1:ArrayRate_RBV.LB NPP NMS")   # Previous counter (Last B value)
    field(INPB, "$(CAM):Over1:ArrayCounter_RBV NPP NMS")   # Current counter value
    field(INPC, "1.0")                                # Delta time in seconds
    field(INPD, "$(CAM):Over1:ArrayRate_RBV.VAL NPP NMS")  # Previous rate
    field(INPE, "0.0")                 # Smoothing factor
    field(CALC, "(D*E)/C+MAX(0,B-A)*(1-E)/C")
    field(PREC, "2" )
    field(EGU,  "Hz" )
    field(SCAN, "1 second")
    field(LOW,  "0")
    field(LSV,  "MINOR")
    field(ADEL, "0.1")
    info(autosaveFields, "ADEL DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV MDEL PREC C E SCAN EGU")
}

###################################################################
#  These records control NDArray callacks                         # 
###################################################################
record(bo, "$(CAM):Over1:ArrayCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))ARRAY_CALLBACKS")
    field(ZNAM, "Disable")
    field(ZSV,  "MINOR")
    field(ONAM, "Enable")
    field(OSV,  "NO_ALARM")
    field(VAL, "1")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Over1:ArrayCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))ARRAY_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ZSV,  "MINOR")
    field(ONAM, "Enabled")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains macro definitions for the attributes      # 
###################################################################

record(waveform, "$(CAM):Over1:NDAttributesMacros")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_MACROS")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

###################################################################
#  This record is the name of a file defining attributes          # 
###################################################################

record(waveform, "$(CAM):Over1:NDAttributesFile")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_FILE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

###################################################################
#  This record defines the status of reading attributes file      # 
###################################################################

record(mbbi, "$(CAM):Over1:NDAttributesStatus")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_STATUS")
    field(ZRVL, "0")
    field(ZRST, "Attributes file OK")
    field(ZRSV, "NO_ALARM")
    field(ONVL, "1")
    field(ONST, "File not found")
    field(ONSV, "MINOR")
    field(TWVL, "2")
    field(TWST, "XML syntax error")
    field(TWSV, "MAJOR")
    field(THVL, "3")
    field(THST, "Macro substitution error")
    field(THSV, "MAJOR")
    field(SCAN, "I/O Intr")
}

###################################################################
#  Status of NDArrayPool - number of buffers, memory used etc.    # 
###################################################################

record(ai, "$(CAM):Over1:PoolMaxMem")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))POOL_MAX_MEMORY")
   field(PREC, "1")
   field(EGU,  "MB")
   field(SCAN, "Passive")
   field(PINI, "YES")
}

record(ai, "$(CAM):Over1:PoolUsedMem")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))POOL_USED_MEMORY")
   field(PREC, "1")
   field(EGU,  "MB")
   field(SCAN, "1 second")
   field(FLNK, "$(CAM):Over1:PoolAllocBuffers")
   info(autosaveFields, "SCAN")
}

record(longin, "$(CAM):Over1:PoolAllocBuffers")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))POOL_ALLOC_BUFFERS")
   field(FLNK, "$(CAM):Over1:PoolFreeBuffers")
}

record(longin, "$(CAM):Over1:PoolFreeBuffers")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))POOL_FREE_BUFFERS")
   field(FLNK, "$(CAM):Over1:PoolUsedBuffers")
}

record(calc, "$(CAM):Over1:PoolUsedBuffers")
{
    field(INPA, "$(CAM):Over1:PoolAllocBuffers NPP MS")
    field(INPB, "$(CAM):Over1:PoolFreeBuffers NPP MS")
    field(CALC, "A-B")
}

record(bo, "$(CAM):Over1:EmptyFreeList")
{
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))POOL_EMPTY_FREELIST")
}

record(longin, "$(CAM):Over1:NumQueuedArrays")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))NUM_QUEUED_ARRAYS")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the type of plugin                        #
###################################################################

record(stringin, "$(CAM):Over1:PluginType_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))PLUGIN_TYPE")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the connection of the server to          #
#  an NDArray driver port and address                             #
###################################################################
# Array port name
record(stringout, "$(CAM):Over1:NDArrayPort")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(OUT,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))NDARRAY_PORT")
    field(VAL,  "$(CAM_PORT)")
    info(autosaveFields, "DESC VAL")
}

record(stringin, "$(CAM):Over1:NDArrayPort_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))NDARRAY_PORT")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:NDArrayAddress")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))NDARRAY_ADDR")
    field(VAL,  "$(NDARRAY_ADDR=0)")
    info(autosaveFields, "DESC VAL")
}

record(longin, "$(CAM):Over1:NDArrayAddress_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))NDARRAY_ADDR")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control whether callbacks are enabled and        #
#  minimum time between callbacks                                 #
###################################################################
record(bo, "$(CAM):Over1:EnableCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))ENABLE_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    field(VAL,  "0")
    info(autosaveFields, "DESC VAL")
}

record(bi, "$(CAM):Over1:EnableCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))ENABLE_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    field(ZSV,  "MINOR")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Over1:MinCallbackTime")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))MIN_CALLBACK_TIME")
    field(EGU,  "s")
    field(PREC, "3")
    field(VAL,  "0.0")
    field(DRVL, "0")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):Over1:MinCallbackTime_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))MIN_CALLBACK_TIME")
    field(EGU,  "s")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Over1:MaxArrayRate")
{
    field(DTYP, "Soft Channel")
    field(OUT,  "$(CAM):Over1:MaxArrayRate_COUT PP")
    field(EGU,  "Hz")
    field(PREC, "3")
    field(VAL,  "0.0")
    info(autosaveFields, "VAL")
}

record(calcout, "$(CAM):Over1:MaxArrayRate_COUT")
{
    field(INPA, "$(CAM):Over1:MaxArrayRate")
    field(CALC, "A=0?0:1.0/A")
    field(OUT,  "$(CAM):Over1:MinCallbackTime PP")
}

record(calc, "$(CAM):Over1:MaxArrayRate_RBV")
{
    field(INPA, "$(CAM):Over1:MinCallbackTime_RBV CP")
    field(CALC, "A=0?0:1.0/A")
    field(EGU,  "Hz")
    field(PREC, "3")
    field(SCAN, "Passive")
}

record(ao, "$(CAM):Over1:MaxByteRate")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))MAX_BYTE_RATE")
    field(EGU,  "s")
    field(PREC, "3")
    field(VAL,  "0.0")
    field(DRVL, "0")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):Over1:MaxByteRate_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))MAX_BYTE_RATE")
    field(EGU,  "s")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the last execution time of the plugin     #
###################################################################
record(ai, "$(CAM):Over1:ExecutionTime_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))EXECUTION_TIME")
    field(EGU,  "ms")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record requests that the plugin execute again with the    #
#  same NDArray                                                   #
###################################################################
record(bo, "$(CAM):Over1:ProcessPlugin")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))PROCESS_PLUGIN")
    field(VAL,  "1")
}

###################################################################
#  These records control whether callbacks block or not           #
###################################################################
record(bo, "$(CAM):Over1:BlockingCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))BLOCKING_CALLBACKS")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(VAL,  "0")
    info(autosaveFields, "DESC ZSV OSV VAL")
}

record(bi, "$(CAM):Over1:BlockingCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))BLOCKING_CALLBACKS")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(ZSV,  "NO_ALARM")
    field(OSV,  "MINOR")
    field(SCAN, "I/O Intr")
    info( autosaveFields, "DESC ZSV OSV" )
}


record(longout, "$(CAM):Over1:DroppedArrays")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))DROPPED_ARRAYS")
    field(VAL,  "0")
    info( autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV EGU" )
}

record(longin, "$(CAM):Over1:DroppedArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))DROPPED_ARRAYS")
    field(SCAN, "I/O Intr")
    field(HIGH, "1")
    field(HSV,  "MINOR")
    info( autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV EGU" )
}

record(longout, "$(CAM):Over1:QueueSize")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))QUEUE_SIZE")
    field(PINI, "YES")
    info( autosaveFields, "DESC EGU" )
}

record(longin, "$(CAM):Over1:QueueSize_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))QUEUE_SIZE")
    field(FLNK, "$(CAM):Over1:QueueFreeLow")
    field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):Over1:QueueFreeLow") {
    field(CALC, "A*0.25")
    field(INPA, "$(CAM):Over1:QueueSize")
    field(OUT,  "$(CAM):Over1:QueueFree.LOW")
    field(FLNK, "$(CAM):Over1:QueueUseHIGH")
}

# Set a HIGH warning level for the input queue fill level to 75%
# of the full size of the queue
record(calcout, "$(CAM):Over1:QueueUseHIGH") {
   field(CALC, "A*0.75")
   field(INPA, "$(CAM):Over1:QueueSize")
   field(OUT,  "$(CAM):Over1:QueueUse.HIGH")
   field(FLNK, "$(CAM):Over1:QueueUseHIHI")
}

# Set a HIHI level for the input queue fill level to indicate an error
# (MAJOR alarm)  when it fills up to the full size of the queue (frames start dropping)
record(calcout, "$(CAM):Over1:QueueUseHIHI") {
   field(CALC, "A*1.0")
   field(INPA, "$(CAM):Over1:QueueSize")
   field(OUT,  "$(CAM):Over1:QueueUse.HIHI")
}

record(longin, "$(CAM):Over1:QueueFree")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))QUEUE_FREE")
    field(LLSV, "MAJOR")
    field(LSV,  "MINOR")
    field(LOLO, "0")
    field(HYST, "1")
    field(SCAN, "I/O Intr")
}

# Display the fill level on the plugins input queue
record(calc, "$(CAM):Over1:QueueUse") {
    field(CALC, "A-B")
    field(INPA, "$(CAM):Over1:QueueSize")
    field(INPB, "$(CAM):Over1:QueueFree CP")
    field(SCAN, "Passive")
    field(HHSV, "MAJOR")
    field(HSV,  "MINOR")
    field(HYST, "1")
}

record(longout, "$(CAM):Over1:NumThreads")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))NUM_THREADS")
    field(VAL,  "1")
    field(PINI, "YES")
    info(autosaveFields, "DESC VAL")
}

record(longin, "$(CAM):Over1:NumThreads_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))NUM_THREADS")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Over1:MaxThreads_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))MAX_THREADS")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control output array sorting                     #
###################################################################
record(mbbo, "$(CAM):Over1:SortMode") {
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))SORT_MODE")
    field(ZRVL, "0")
    field(ZRST, "Unsorted")
    field(ONVL, "1")
    field(ONST, "Sorted")
}

record(mbbi, "$(CAM):Over1:SortMode_RBV") {
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))SORT_MODE")
    field(ZRVL, "0")
    field(ZRST, "Unsorted")
    field(ONVL, "1")
    field(ONST, "Sorted")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Over1:SortTime") {
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))SORT_TIME")
    field(PREC, "3")
    field(VAL, "0.1")
}

record(ai, "$(CAM):Over1:SortTime_RBV") {
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))SORT_TIME")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:SortSize")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))SORT_SIZE")
    field(VAL,  "20")
    field(PINI, "YES")
}

record(longin, "$(CAM):Over1:SortSize_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))SORT_SIZE")
    field(FLNK, "$(CAM):Over1:SortFreeLow")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Over1:SortFree") {
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))SORT_FREE")
    field(LLSV, "MAJOR")
    field(LSV,  "MINOR")
    field(LOLO, "0")
    field(HYST, "1")
    field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):Over1:SortFreeLow") {
    field(CALC, "A*0.25")
    field(INPA, "$(CAM):Over1:SortSize")
    field(OUT,  "$(CAM):Over1:SortFree.LOW")
}

record(longout, "$(CAM):Over1:DroppedOutputArrays")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))DROPPED_OUTPUT_ARRAYS")
    field(VAL,  "0")
}

record(longin, "$(CAM):Over1:DroppedOutputArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))DROPPED_OUTPUT_ARRAYS")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:DisorderedArrays")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))DISORDERED_ARRAYS")
    field(PINI, "YES")
}

record(longin, "$(CAM):Over1:DisorderedArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))DISORDERED_ARRAYS")
    field(SCAN, "I/O Intr")
}



###################################################################
#  The asynRecord is used for mainly for trace mask               # 
###################################################################
 
# Set ASYN_TRACEIO_HEX bit by default
record(asyn,"$(CAM):Over1:AsynIO")
{
    field(PORT, "Over1")
    field(TIB2,"1")
    info("ADType", "ADPlugin")
}


# These are the array dimensions in X, Y order.  Used for setting HOPR on sliders
record(longin, "$(CAM):Over1:MaxSizeX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))MAX_SIZE_X")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Over1:MaxSizeY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Over1,$(ADDR=0),$(TIMEOUT=1))MAX_SIZE_Y")
   field(SCAN, "I/O Intr")
}
#=================================================================#
# Template file: NDOverlayN.template
# Database for NDOverlays
# Mark Rivers
# March 22, 2010

###################################################################
#  These records control the label for the overlay                #
###################################################################
record(stringout, "$(CAM):Over1:1:Name")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(OUT,  "@asyn(Over1,0,1)NAME")
    field(VAL,  "ROI1")
    info(autosaveFields, "VAL")
}

record(stringin, "$(CAM):Over1:1:Name_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Over1,0,1)NAME")
    field(SCAN, "I/O Intr")
}


###################################################################
#  These records control whether this overlay is used             #
###################################################################
record(bo, "$(CAM):Over1:1:Use")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,0,1)USE")
    field(VAL,  "0")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Over1:1:Use_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,0,1)USE")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(ZSV,  "NO_ALARM")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the overlay definition                   #
###################################################################

record(longout, "$(CAM):Over1:1:PositionXLink")
{
    field(DOL,  "$(CAM):ROI1:MinX_RBV CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:1:PositionX PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:1:PositionX")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,0,1)OVERLAY_POSITION_X")
    info(asyn:READBACK, "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:1:PositionX_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,0,1)OVERLAY_POSITION_X")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:1:PositionYLink")
{
    field(DOL,  "$(CAM):ROI1:MinY_RBV CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:1:PositionY PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:1:PositionY")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,0,1)OVERLAY_POSITION_Y")
    info(asyn:READBACK, "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:1:PositionY_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,0,1)OVERLAY_POSITION_Y")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:1:CenterXLink")
{
    field(DOL,  " CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:1:CenterX PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:1:CenterX")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,0,1)OVERLAY_CENTER_X")
    info(asyn:READBACK, "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:1:CenterX_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,0,1)OVERLAY_CENTER_X")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:1:CenterYLink")
{
    field(DOL,  " CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:1:CenterY PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:1:CenterY")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,0,1)OVERLAY_CENTER_Y")
    info(asyn:READBACK, "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:1:CenterY_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,0,1)OVERLAY_CENTER_Y")
    field(SCAN, "I/O Intr")
}
 
record(longout, "$(CAM):Over1:1:SizeXLink")
{
    field(DOL,  "$(CAM):ROI1:SizeX_RBV CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:1:SizeX PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:1:SizeX")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,0,1)OVERLAY_SIZE_X")
    field(LOPR, "1")
    field(HOPR, "1024")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:1:SizeX_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,0,1)OVERLAY_SIZE_X")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:1:SizeYLink")
{
    field(DOL,  "$(CAM):ROI1:SizeY_RBV CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:1:SizeY PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:1:SizeY")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,0,1)OVERLAY_SIZE_Y")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:1:SizeY_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,0,1)OVERLAY_SIZE_Y")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:1:WidthXLink")
{
    field(DOL,  " CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:1:WidthX PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:1:WidthX")
{
    field(DOL,  "1")
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,0,1)OVERLAY_WIDTH_X")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:1:WidthX_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,0,1)OVERLAY_WIDTH_X")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:1:WidthYLink")
{
    field(DOL,  " CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:1:WidthY PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:1:WidthY")
{
    field(DOL,  "1")
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,0,1)OVERLAY_WIDTH_Y")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:1:WidthY_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,0,1)OVERLAY_WIDTH_Y")
    field(SCAN, "I/O Intr")
}

record(mbbo, "$(CAM):Over1:1:Shape")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,0,1)OVERLAY_SHAPE")
    field(ZRST, "Cross")
    field(ZRVL, "0")
    field(ONST, "Rectangle")
    field(ONVL, "1")
    field(TWST, "Ellipse")
    field(TWVL, "3")
    field(THST, "Text")
    field(THVL, "2")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Over1:1:Shape_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,0,1)OVERLAY_SHAPE")
    field(ZRST, "Cross")
    field(ZRVL, "0")
    field(ONST, "Rectangle")
    field(ONVL, "1")
    field(TWST, "Ellipse")
    field(TWVL, "3")
    field(THST, "Text")
    field(THVL, "2")
    field(SCAN, "I/O Intr")
}

record(mbbo, "$(CAM):Over1:1:DrawMode")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,0,1)OVERLAY_DRAW_MODE")
    field(ZRST, "Set")
    field(ZRVL, "0")
    field(ONST, "XOR")
    field(ONVL, "1")
    info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Over1:1:DrawMode_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,0,1)OVERLAY_DRAW_MODE")
    field(ZRST, "Set")
    field(ZRVL, "0")
    field(ONST, "XOR")
    field(ONVL, "1")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:1:Red")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,0,1)OVERLAY_RED")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:1:Red_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,0,1)OVERLAY_RED")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:1:Green")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,0,1)OVERLAY_GREEN")
    field(VAL,  "65535")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:1:Green_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,0,1)OVERLAY_GREEN")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:1:Blue")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,0,1)OVERLAY_BLUE")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:1:Blue_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,0,1)OVERLAY_BLUE")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records set the HOPR and LOPR values for the position    #
#  and size to the maximum for the input array                    #
###################################################################

record(longin, "$(CAM):Over1:1:MaxSizeX")
{
    field(INP,  "$(CAM):Over1:MaxSizeX_RBV CP")
    field(FLNK, "$(CAM):Over1:1:SetXHOPR.PROC PP")
}

record(dfanout, "$(CAM):Over1:1:SetXHOPR")
{
    field(DOL,  "$(CAM):Over1:1:MaxSizeX NPP")
    field(OMSL, "closed_loop")
    field(OUTA, "$(CAM):Over1:1:PositionX.HOPR NPP")
    field(OUTB, "$(CAM):Over1:1:CenterX.HOPR NPP")
    field(OUTC, "$(CAM):Over1:1:SizeX.HOPR NPP")
}

record(longin, "$(CAM):Over1:1:MaxSizeY")
{
    field(INP,  "$(CAM):Over1:MaxSizeY_RBV CP")
    field(FLNK, "$(CAM):Over1:1:SetYHOPR.PROC PP")
}

record(dfanout, "$(CAM):Over1:1:SetYHOPR")
{
    field(DOL,  "$(CAM):Over1:1:MaxSizeY NPP")
    field(OMSL, "closed_loop")
    field(OUTA, "$(CAM):Over1:1:PositionY.HOPR NPP")
    field(OUTB, "$(CAM):Over1:1:CenterY.HOPR NPP")
    field(OUTC, "$(CAM):Over1:1:SizeY.HOPR NPP")
}

###################################################################
#  Text overlay (Keith Brister 2014-06-26)
###################################################################

record(waveform, "$(CAM):Over1:1:DisplayText")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(Over1,0,1)OVERLAY_DISPLAY_TEXT")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

record(waveform, "$(CAM):Over1:1:DisplayText_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Over1,0,1)OVERLAY_DISPLAY_TEXT")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

record(stringout, "$(CAM):Over1:1:TimeStampFormat")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(OUT,  "@asyn(Over1,0,1)OVERLAY_TIMESTAMP_FORMAT")
    field(VAL,  "%Y-%m-%d %H:%M:%S.%03f")
    info(autosaveFields, "VAL")
}

record(stringin, "$(CAM):Over1:1:TimeStampFormat_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Over1,0,1)OVERLAY_TIMESTAMP_FORMAT")
    field(SCAN, "I/O Intr")
}

record(mbbo, "$(CAM):Over1:1:Font")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,0,1)OVERLAY_FONT")
    field(ZRST, "6x13")
    field(ZRVL, "0")
    field(ONST, "6x13 Bold")
    field(ONVL, "1")
    field(TWST, "9x15")
    field(TWVL, "2")
    field(THST, "9x15 Bold")
    field(THVL, "3")
    info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Over1:1:Font_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,0,1)OVERLAY_FONT")
    field(ZRST, "6x13")
    field(ZRVL, "0")
    field(ONST, "6x13 Bold")
    field(ONVL, "1")
    field(TWST, "9x15")
    field(TWVL, "2")
    field(THST, "9x15 Bold")
    field(THVL, "3")
    field(SCAN, "I/O Intr")
}
#=================================================================#
# Template file: NDOverlayN.template
# Database for NDOverlays
# Mark Rivers
# March 22, 2010

###################################################################
#  These records control the label for the overlay                #
###################################################################
record(stringout, "$(CAM):Over1:2:Name")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(OUT,  "@asyn(Over1,1,1)NAME")
    field(VAL,  "ROI2")
    info(autosaveFields, "VAL")
}

record(stringin, "$(CAM):Over1:2:Name_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Over1,1,1)NAME")
    field(SCAN, "I/O Intr")
}


###################################################################
#  These records control whether this overlay is used             #
###################################################################
record(bo, "$(CAM):Over1:2:Use")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,1,1)USE")
    field(VAL,  "0")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Over1:2:Use_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,1,1)USE")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(ZSV,  "NO_ALARM")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the overlay definition                   #
###################################################################

record(longout, "$(CAM):Over1:2:PositionXLink")
{
    field(DOL,  "$(CAM):ROI2:MinX_RBV CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:2:PositionX PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:2:PositionX")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,1,1)OVERLAY_POSITION_X")
    info(asyn:READBACK, "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:2:PositionX_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,1,1)OVERLAY_POSITION_X")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:2:PositionYLink")
{
    field(DOL,  "$(CAM):ROI2:MinY_RBV CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:2:PositionY PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:2:PositionY")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,1,1)OVERLAY_POSITION_Y")
    info(asyn:READBACK, "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:2:PositionY_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,1,1)OVERLAY_POSITION_Y")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:2:CenterXLink")
{
    field(DOL,  " CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:2:CenterX PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:2:CenterX")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,1,1)OVERLAY_CENTER_X")
    info(asyn:READBACK, "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:2:CenterX_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,1,1)OVERLAY_CENTER_X")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:2:CenterYLink")
{
    field(DOL,  " CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:2:CenterY PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:2:CenterY")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,1,1)OVERLAY_CENTER_Y")
    info(asyn:READBACK, "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:2:CenterY_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,1,1)OVERLAY_CENTER_Y")
    field(SCAN, "I/O Intr")
}
 
record(longout, "$(CAM):Over1:2:SizeXLink")
{
    field(DOL,  "$(CAM):ROI2:SizeX_RBV CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:2:SizeX PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:2:SizeX")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,1,1)OVERLAY_SIZE_X")
    field(LOPR, "1")
    field(HOPR, "1024")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:2:SizeX_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,1,1)OVERLAY_SIZE_X")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:2:SizeYLink")
{
    field(DOL,  "$(CAM):ROI2:SizeY_RBV CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:2:SizeY PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:2:SizeY")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,1,1)OVERLAY_SIZE_Y")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:2:SizeY_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,1,1)OVERLAY_SIZE_Y")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:2:WidthXLink")
{
    field(DOL,  " CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:2:WidthX PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:2:WidthX")
{
    field(DOL,  "1")
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,1,1)OVERLAY_WIDTH_X")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:2:WidthX_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,1,1)OVERLAY_WIDTH_X")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:2:WidthYLink")
{
    field(DOL,  " CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:2:WidthY PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:2:WidthY")
{
    field(DOL,  "1")
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,1,1)OVERLAY_WIDTH_Y")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:2:WidthY_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,1,1)OVERLAY_WIDTH_Y")
    field(SCAN, "I/O Intr")
}

record(mbbo, "$(CAM):Over1:2:Shape")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,1,1)OVERLAY_SHAPE")
    field(ZRST, "Cross")
    field(ZRVL, "0")
    field(ONST, "Rectangle")
    field(ONVL, "1")
    field(TWST, "Ellipse")
    field(TWVL, "3")
    field(THST, "Text")
    field(THVL, "2")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Over1:2:Shape_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,1,1)OVERLAY_SHAPE")
    field(ZRST, "Cross")
    field(ZRVL, "0")
    field(ONST, "Rectangle")
    field(ONVL, "1")
    field(TWST, "Ellipse")
    field(TWVL, "3")
    field(THST, "Text")
    field(THVL, "2")
    field(SCAN, "I/O Intr")
}

record(mbbo, "$(CAM):Over1:2:DrawMode")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,1,1)OVERLAY_DRAW_MODE")
    field(ZRST, "Set")
    field(ZRVL, "0")
    field(ONST, "XOR")
    field(ONVL, "1")
    info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Over1:2:DrawMode_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,1,1)OVERLAY_DRAW_MODE")
    field(ZRST, "Set")
    field(ZRVL, "0")
    field(ONST, "XOR")
    field(ONVL, "1")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:2:Red")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,1,1)OVERLAY_RED")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:2:Red_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,1,1)OVERLAY_RED")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:2:Green")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,1,1)OVERLAY_GREEN")
    field(VAL,  "65535")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:2:Green_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,1,1)OVERLAY_GREEN")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:2:Blue")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,1,1)OVERLAY_BLUE")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:2:Blue_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,1,1)OVERLAY_BLUE")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records set the HOPR and LOPR values for the position    #
#  and size to the maximum for the input array                    #
###################################################################

record(longin, "$(CAM):Over1:2:MaxSizeX")
{
    field(INP,  "$(CAM):Over1:MaxSizeX_RBV CP")
    field(FLNK, "$(CAM):Over1:2:SetXHOPR.PROC PP")
}

record(dfanout, "$(CAM):Over1:2:SetXHOPR")
{
    field(DOL,  "$(CAM):Over1:2:MaxSizeX NPP")
    field(OMSL, "closed_loop")
    field(OUTA, "$(CAM):Over1:2:PositionX.HOPR NPP")
    field(OUTB, "$(CAM):Over1:2:CenterX.HOPR NPP")
    field(OUTC, "$(CAM):Over1:2:SizeX.HOPR NPP")
}

record(longin, "$(CAM):Over1:2:MaxSizeY")
{
    field(INP,  "$(CAM):Over1:MaxSizeY_RBV CP")
    field(FLNK, "$(CAM):Over1:2:SetYHOPR.PROC PP")
}

record(dfanout, "$(CAM):Over1:2:SetYHOPR")
{
    field(DOL,  "$(CAM):Over1:2:MaxSizeY NPP")
    field(OMSL, "closed_loop")
    field(OUTA, "$(CAM):Over1:2:PositionY.HOPR NPP")
    field(OUTB, "$(CAM):Over1:2:CenterY.HOPR NPP")
    field(OUTC, "$(CAM):Over1:2:SizeY.HOPR NPP")
}

###################################################################
#  Text overlay (Keith Brister 2014-06-26)
###################################################################

record(waveform, "$(CAM):Over1:2:DisplayText")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(Over1,1,1)OVERLAY_DISPLAY_TEXT")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

record(waveform, "$(CAM):Over1:2:DisplayText_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Over1,1,1)OVERLAY_DISPLAY_TEXT")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

record(stringout, "$(CAM):Over1:2:TimeStampFormat")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(OUT,  "@asyn(Over1,1,1)OVERLAY_TIMESTAMP_FORMAT")
    field(VAL,  "%Y-%m-%d %H:%M:%S.%03f")
    info(autosaveFields, "VAL")
}

record(stringin, "$(CAM):Over1:2:TimeStampFormat_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Over1,1,1)OVERLAY_TIMESTAMP_FORMAT")
    field(SCAN, "I/O Intr")
}

record(mbbo, "$(CAM):Over1:2:Font")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,1,1)OVERLAY_FONT")
    field(ZRST, "6x13")
    field(ZRVL, "0")
    field(ONST, "6x13 Bold")
    field(ONVL, "1")
    field(TWST, "9x15")
    field(TWVL, "2")
    field(THST, "9x15 Bold")
    field(THVL, "3")
    info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Over1:2:Font_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,1,1)OVERLAY_FONT")
    field(ZRST, "6x13")
    field(ZRVL, "0")
    field(ONST, "6x13 Bold")
    field(ONVL, "1")
    field(TWST, "9x15")
    field(TWVL, "2")
    field(THST, "9x15 Bold")
    field(THVL, "3")
    field(SCAN, "I/O Intr")
}
#=================================================================#
# Template file: NDOverlayN.template
# Database for NDOverlays
# Mark Rivers
# March 22, 2010

###################################################################
#  These records control the label for the overlay                #
###################################################################
record(stringout, "$(CAM):Over1:3:Name")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(OUT,  "@asyn(Over1,2,1)NAME")
    field(VAL,  "ROI3")
    info(autosaveFields, "VAL")
}

record(stringin, "$(CAM):Over1:3:Name_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Over1,2,1)NAME")
    field(SCAN, "I/O Intr")
}


###################################################################
#  These records control whether this overlay is used             #
###################################################################
record(bo, "$(CAM):Over1:3:Use")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,2,1)USE")
    field(VAL,  "0")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Over1:3:Use_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,2,1)USE")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(ZSV,  "NO_ALARM")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the overlay definition                   #
###################################################################

record(longout, "$(CAM):Over1:3:PositionXLink")
{
    field(DOL,  "$(CAM):ROI3:MinX_RBV CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:3:PositionX PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:3:PositionX")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,2,1)OVERLAY_POSITION_X")
    info(asyn:READBACK, "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:3:PositionX_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,2,1)OVERLAY_POSITION_X")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:3:PositionYLink")
{
    field(DOL,  "$(CAM):ROI3:MinY_RBV CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:3:PositionY PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:3:PositionY")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,2,1)OVERLAY_POSITION_Y")
    info(asyn:READBACK, "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:3:PositionY_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,2,1)OVERLAY_POSITION_Y")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:3:CenterXLink")
{
    field(DOL,  " CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:3:CenterX PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:3:CenterX")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,2,1)OVERLAY_CENTER_X")
    info(asyn:READBACK, "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:3:CenterX_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,2,1)OVERLAY_CENTER_X")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:3:CenterYLink")
{
    field(DOL,  " CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:3:CenterY PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:3:CenterY")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,2,1)OVERLAY_CENTER_Y")
    info(asyn:READBACK, "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:3:CenterY_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,2,1)OVERLAY_CENTER_Y")
    field(SCAN, "I/O Intr")
}
 
record(longout, "$(CAM):Over1:3:SizeXLink")
{
    field(DOL,  "$(CAM):ROI3:SizeX_RBV CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:3:SizeX PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:3:SizeX")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,2,1)OVERLAY_SIZE_X")
    field(LOPR, "1")
    field(HOPR, "1024")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:3:SizeX_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,2,1)OVERLAY_SIZE_X")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:3:SizeYLink")
{
    field(DOL,  "$(CAM):ROI3:SizeY_RBV CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:3:SizeY PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:3:SizeY")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,2,1)OVERLAY_SIZE_Y")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:3:SizeY_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,2,1)OVERLAY_SIZE_Y")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:3:WidthXLink")
{
    field(DOL,  " CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:3:WidthX PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:3:WidthX")
{
    field(DOL,  "1")
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,2,1)OVERLAY_WIDTH_X")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:3:WidthX_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,2,1)OVERLAY_WIDTH_X")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:3:WidthYLink")
{
    field(DOL,  " CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:3:WidthY PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:3:WidthY")
{
    field(DOL,  "1")
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,2,1)OVERLAY_WIDTH_Y")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:3:WidthY_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,2,1)OVERLAY_WIDTH_Y")
    field(SCAN, "I/O Intr")
}

record(mbbo, "$(CAM):Over1:3:Shape")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,2,1)OVERLAY_SHAPE")
    field(ZRST, "Cross")
    field(ZRVL, "0")
    field(ONST, "Rectangle")
    field(ONVL, "1")
    field(TWST, "Ellipse")
    field(TWVL, "3")
    field(THST, "Text")
    field(THVL, "2")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Over1:3:Shape_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,2,1)OVERLAY_SHAPE")
    field(ZRST, "Cross")
    field(ZRVL, "0")
    field(ONST, "Rectangle")
    field(ONVL, "1")
    field(TWST, "Ellipse")
    field(TWVL, "3")
    field(THST, "Text")
    field(THVL, "2")
    field(SCAN, "I/O Intr")
}

record(mbbo, "$(CAM):Over1:3:DrawMode")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,2,1)OVERLAY_DRAW_MODE")
    field(ZRST, "Set")
    field(ZRVL, "0")
    field(ONST, "XOR")
    field(ONVL, "1")
    info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Over1:3:DrawMode_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,2,1)OVERLAY_DRAW_MODE")
    field(ZRST, "Set")
    field(ZRVL, "0")
    field(ONST, "XOR")
    field(ONVL, "1")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:3:Red")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,2,1)OVERLAY_RED")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:3:Red_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,2,1)OVERLAY_RED")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:3:Green")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,2,1)OVERLAY_GREEN")
    field(VAL,  "65535")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:3:Green_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,2,1)OVERLAY_GREEN")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:3:Blue")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,2,1)OVERLAY_BLUE")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:3:Blue_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,2,1)OVERLAY_BLUE")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records set the HOPR and LOPR values for the position    #
#  and size to the maximum for the input array                    #
###################################################################

record(longin, "$(CAM):Over1:3:MaxSizeX")
{
    field(INP,  "$(CAM):Over1:MaxSizeX_RBV CP")
    field(FLNK, "$(CAM):Over1:3:SetXHOPR.PROC PP")
}

record(dfanout, "$(CAM):Over1:3:SetXHOPR")
{
    field(DOL,  "$(CAM):Over1:3:MaxSizeX NPP")
    field(OMSL, "closed_loop")
    field(OUTA, "$(CAM):Over1:3:PositionX.HOPR NPP")
    field(OUTB, "$(CAM):Over1:3:CenterX.HOPR NPP")
    field(OUTC, "$(CAM):Over1:3:SizeX.HOPR NPP")
}

record(longin, "$(CAM):Over1:3:MaxSizeY")
{
    field(INP,  "$(CAM):Over1:MaxSizeY_RBV CP")
    field(FLNK, "$(CAM):Over1:3:SetYHOPR.PROC PP")
}

record(dfanout, "$(CAM):Over1:3:SetYHOPR")
{
    field(DOL,  "$(CAM):Over1:3:MaxSizeY NPP")
    field(OMSL, "closed_loop")
    field(OUTA, "$(CAM):Over1:3:PositionY.HOPR NPP")
    field(OUTB, "$(CAM):Over1:3:CenterY.HOPR NPP")
    field(OUTC, "$(CAM):Over1:3:SizeY.HOPR NPP")
}

###################################################################
#  Text overlay (Keith Brister 2014-06-26)
###################################################################

record(waveform, "$(CAM):Over1:3:DisplayText")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(Over1,2,1)OVERLAY_DISPLAY_TEXT")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

record(waveform, "$(CAM):Over1:3:DisplayText_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Over1,2,1)OVERLAY_DISPLAY_TEXT")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

record(stringout, "$(CAM):Over1:3:TimeStampFormat")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(OUT,  "@asyn(Over1,2,1)OVERLAY_TIMESTAMP_FORMAT")
    field(VAL,  "%Y-%m-%d %H:%M:%S.%03f")
    info(autosaveFields, "VAL")
}

record(stringin, "$(CAM):Over1:3:TimeStampFormat_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Over1,2,1)OVERLAY_TIMESTAMP_FORMAT")
    field(SCAN, "I/O Intr")
}

record(mbbo, "$(CAM):Over1:3:Font")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,2,1)OVERLAY_FONT")
    field(ZRST, "6x13")
    field(ZRVL, "0")
    field(ONST, "6x13 Bold")
    field(ONVL, "1")
    field(TWST, "9x15")
    field(TWVL, "2")
    field(THST, "9x15 Bold")
    field(THVL, "3")
    info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Over1:3:Font_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,2,1)OVERLAY_FONT")
    field(ZRST, "6x13")
    field(ZRVL, "0")
    field(ONST, "6x13 Bold")
    field(ONVL, "1")
    field(TWST, "9x15")
    field(TWVL, "2")
    field(THST, "9x15 Bold")
    field(THVL, "3")
    field(SCAN, "I/O Intr")
}
#=================================================================#
# Template file: NDOverlayN.template
# Database for NDOverlays
# Mark Rivers
# March 22, 2010

###################################################################
#  These records control the label for the overlay                #
###################################################################
record(stringout, "$(CAM):Over1:4:Name")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(OUT,  "@asyn(Over1,3,1)NAME")
    field(VAL,  "ROI4")
    info(autosaveFields, "VAL")
}

record(stringin, "$(CAM):Over1:4:Name_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Over1,3,1)NAME")
    field(SCAN, "I/O Intr")
}


###################################################################
#  These records control whether this overlay is used             #
###################################################################
record(bo, "$(CAM):Over1:4:Use")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,3,1)USE")
    field(VAL,  "0")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Over1:4:Use_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,3,1)USE")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(ZSV,  "NO_ALARM")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the overlay definition                   #
###################################################################

record(longout, "$(CAM):Over1:4:PositionXLink")
{
    field(DOL,  "$(CAM):ROI4:MinX_RBV CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:4:PositionX PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:4:PositionX")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,3,1)OVERLAY_POSITION_X")
    info(asyn:READBACK, "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:4:PositionX_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,3,1)OVERLAY_POSITION_X")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:4:PositionYLink")
{
    field(DOL,  "$(CAM):ROI4:MinY_RBV CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:4:PositionY PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:4:PositionY")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,3,1)OVERLAY_POSITION_Y")
    info(asyn:READBACK, "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:4:PositionY_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,3,1)OVERLAY_POSITION_Y")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:4:CenterXLink")
{
    field(DOL,  " CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:4:CenterX PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:4:CenterX")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,3,1)OVERLAY_CENTER_X")
    info(asyn:READBACK, "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:4:CenterX_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,3,1)OVERLAY_CENTER_X")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:4:CenterYLink")
{
    field(DOL,  " CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:4:CenterY PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:4:CenterY")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,3,1)OVERLAY_CENTER_Y")
    info(asyn:READBACK, "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:4:CenterY_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,3,1)OVERLAY_CENTER_Y")
    field(SCAN, "I/O Intr")
}
 
record(longout, "$(CAM):Over1:4:SizeXLink")
{
    field(DOL,  "$(CAM):ROI4:SizeX_RBV CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:4:SizeX PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:4:SizeX")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,3,1)OVERLAY_SIZE_X")
    field(LOPR, "1")
    field(HOPR, "1024")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:4:SizeX_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,3,1)OVERLAY_SIZE_X")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:4:SizeYLink")
{
    field(DOL,  "$(CAM):ROI4:SizeY_RBV CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:4:SizeY PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:4:SizeY")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,3,1)OVERLAY_SIZE_Y")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:4:SizeY_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,3,1)OVERLAY_SIZE_Y")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:4:WidthXLink")
{
    field(DOL,  " CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:4:WidthX PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:4:WidthX")
{
    field(DOL,  "1")
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,3,1)OVERLAY_WIDTH_X")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:4:WidthX_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,3,1)OVERLAY_WIDTH_X")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:4:WidthYLink")
{
    field(DOL,  " CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:4:WidthY PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:4:WidthY")
{
    field(DOL,  "1")
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,3,1)OVERLAY_WIDTH_Y")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:4:WidthY_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,3,1)OVERLAY_WIDTH_Y")
    field(SCAN, "I/O Intr")
}

record(mbbo, "$(CAM):Over1:4:Shape")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,3,1)OVERLAY_SHAPE")
    field(ZRST, "Cross")
    field(ZRVL, "0")
    field(ONST, "Rectangle")
    field(ONVL, "1")
    field(TWST, "Ellipse")
    field(TWVL, "3")
    field(THST, "Text")
    field(THVL, "2")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Over1:4:Shape_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,3,1)OVERLAY_SHAPE")
    field(ZRST, "Cross")
    field(ZRVL, "0")
    field(ONST, "Rectangle")
    field(ONVL, "1")
    field(TWST, "Ellipse")
    field(TWVL, "3")
    field(THST, "Text")
    field(THVL, "2")
    field(SCAN, "I/O Intr")
}

record(mbbo, "$(CAM):Over1:4:DrawMode")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,3,1)OVERLAY_DRAW_MODE")
    field(ZRST, "Set")
    field(ZRVL, "0")
    field(ONST, "XOR")
    field(ONVL, "1")
    info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Over1:4:DrawMode_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,3,1)OVERLAY_DRAW_MODE")
    field(ZRST, "Set")
    field(ZRVL, "0")
    field(ONST, "XOR")
    field(ONVL, "1")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:4:Red")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,3,1)OVERLAY_RED")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:4:Red_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,3,1)OVERLAY_RED")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:4:Green")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,3,1)OVERLAY_GREEN")
    field(VAL,  "65535")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:4:Green_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,3,1)OVERLAY_GREEN")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:4:Blue")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,3,1)OVERLAY_BLUE")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:4:Blue_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,3,1)OVERLAY_BLUE")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records set the HOPR and LOPR values for the position    #
#  and size to the maximum for the input array                    #
###################################################################

record(longin, "$(CAM):Over1:4:MaxSizeX")
{
    field(INP,  "$(CAM):Over1:MaxSizeX_RBV CP")
    field(FLNK, "$(CAM):Over1:4:SetXHOPR.PROC PP")
}

record(dfanout, "$(CAM):Over1:4:SetXHOPR")
{
    field(DOL,  "$(CAM):Over1:4:MaxSizeX NPP")
    field(OMSL, "closed_loop")
    field(OUTA, "$(CAM):Over1:4:PositionX.HOPR NPP")
    field(OUTB, "$(CAM):Over1:4:CenterX.HOPR NPP")
    field(OUTC, "$(CAM):Over1:4:SizeX.HOPR NPP")
}

record(longin, "$(CAM):Over1:4:MaxSizeY")
{
    field(INP,  "$(CAM):Over1:MaxSizeY_RBV CP")
    field(FLNK, "$(CAM):Over1:4:SetYHOPR.PROC PP")
}

record(dfanout, "$(CAM):Over1:4:SetYHOPR")
{
    field(DOL,  "$(CAM):Over1:4:MaxSizeY NPP")
    field(OMSL, "closed_loop")
    field(OUTA, "$(CAM):Over1:4:PositionY.HOPR NPP")
    field(OUTB, "$(CAM):Over1:4:CenterY.HOPR NPP")
    field(OUTC, "$(CAM):Over1:4:SizeY.HOPR NPP")
}

###################################################################
#  Text overlay (Keith Brister 2014-06-26)
###################################################################

record(waveform, "$(CAM):Over1:4:DisplayText")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(Over1,3,1)OVERLAY_DISPLAY_TEXT")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

record(waveform, "$(CAM):Over1:4:DisplayText_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Over1,3,1)OVERLAY_DISPLAY_TEXT")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

record(stringout, "$(CAM):Over1:4:TimeStampFormat")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(OUT,  "@asyn(Over1,3,1)OVERLAY_TIMESTAMP_FORMAT")
    field(VAL,  "%Y-%m-%d %H:%M:%S.%03f")
    info(autosaveFields, "VAL")
}

record(stringin, "$(CAM):Over1:4:TimeStampFormat_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Over1,3,1)OVERLAY_TIMESTAMP_FORMAT")
    field(SCAN, "I/O Intr")
}

record(mbbo, "$(CAM):Over1:4:Font")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,3,1)OVERLAY_FONT")
    field(ZRST, "6x13")
    field(ZRVL, "0")
    field(ONST, "6x13 Bold")
    field(ONVL, "1")
    field(TWST, "9x15")
    field(TWVL, "2")
    field(THST, "9x15 Bold")
    field(THVL, "3")
    info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Over1:4:Font_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,3,1)OVERLAY_FONT")
    field(ZRST, "6x13")
    field(ZRVL, "0")
    field(ONST, "6x13 Bold")
    field(ONVL, "1")
    field(TWST, "9x15")
    field(TWVL, "2")
    field(THST, "9x15 Bold")
    field(THVL, "3")
    field(SCAN, "I/O Intr")
}
#=================================================================#
# Template file: NDOverlayN.template
# Database for NDOverlays
# Mark Rivers
# March 22, 2010

###################################################################
#  These records control the label for the overlay                #
###################################################################
record(stringout, "$(CAM):Over1:5:Name")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(OUT,  "@asyn(Over1,4,1)NAME")
    field(VAL,  "Cursor1")
    info(autosaveFields, "VAL")
}

record(stringin, "$(CAM):Over1:5:Name_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Over1,4,1)NAME")
    field(SCAN, "I/O Intr")
}


###################################################################
#  These records control whether this overlay is used             #
###################################################################
record(bo, "$(CAM):Over1:5:Use")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,4,1)USE")
    field(VAL,  "0")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Over1:5:Use_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,4,1)USE")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(ZSV,  "NO_ALARM")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the overlay definition                   #
###################################################################

record(longout, "$(CAM):Over1:5:PositionXLink")
{
    field(DOL,  "junk CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:5:PositionX PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:5:PositionX")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,4,1)OVERLAY_POSITION_X")
    info(asyn:READBACK, "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:5:PositionX_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,4,1)OVERLAY_POSITION_X")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:5:PositionYLink")
{
    field(DOL,  "junk CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:5:PositionY PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:5:PositionY")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,4,1)OVERLAY_POSITION_Y")
    info(asyn:READBACK, "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:5:PositionY_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,4,1)OVERLAY_POSITION_Y")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:5:CenterXLink")
{
    field(DOL,  " CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:5:CenterX PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:5:CenterX")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,4,1)OVERLAY_CENTER_X")
    info(asyn:READBACK, "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:5:CenterX_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,4,1)OVERLAY_CENTER_X")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:5:CenterYLink")
{
    field(DOL,  " CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:5:CenterY PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:5:CenterY")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,4,1)OVERLAY_CENTER_Y")
    info(asyn:READBACK, "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:5:CenterY_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,4,1)OVERLAY_CENTER_Y")
    field(SCAN, "I/O Intr")
}
 
record(longout, "$(CAM):Over1:5:SizeXLink")
{
    field(DOL,  "junk CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:5:SizeX PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:5:SizeX")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,4,1)OVERLAY_SIZE_X")
    field(LOPR, "1")
    field(HOPR, "1024")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:5:SizeX_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,4,1)OVERLAY_SIZE_X")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:5:SizeYLink")
{
    field(DOL,  "junk CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:5:SizeY PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:5:SizeY")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,4,1)OVERLAY_SIZE_Y")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:5:SizeY_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,4,1)OVERLAY_SIZE_Y")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:5:WidthXLink")
{
    field(DOL,  " CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:5:WidthX PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:5:WidthX")
{
    field(DOL,  "1")
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,4,1)OVERLAY_WIDTH_X")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:5:WidthX_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,4,1)OVERLAY_WIDTH_X")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:5:WidthYLink")
{
    field(DOL,  " CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:5:WidthY PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:5:WidthY")
{
    field(DOL,  "1")
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,4,1)OVERLAY_WIDTH_Y")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:5:WidthY_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,4,1)OVERLAY_WIDTH_Y")
    field(SCAN, "I/O Intr")
}

record(mbbo, "$(CAM):Over1:5:Shape")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,4,1)OVERLAY_SHAPE")
    field(ZRST, "Cross")
    field(ZRVL, "0")
    field(ONST, "Rectangle")
    field(ONVL, "1")
    field(TWST, "Ellipse")
    field(TWVL, "3")
    field(THST, "Text")
    field(THVL, "2")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Over1:5:Shape_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,4,1)OVERLAY_SHAPE")
    field(ZRST, "Cross")
    field(ZRVL, "0")
    field(ONST, "Rectangle")
    field(ONVL, "1")
    field(TWST, "Ellipse")
    field(TWVL, "3")
    field(THST, "Text")
    field(THVL, "2")
    field(SCAN, "I/O Intr")
}

record(mbbo, "$(CAM):Over1:5:DrawMode")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,4,1)OVERLAY_DRAW_MODE")
    field(ZRST, "Set")
    field(ZRVL, "0")
    field(ONST, "XOR")
    field(ONVL, "1")
    info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Over1:5:DrawMode_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,4,1)OVERLAY_DRAW_MODE")
    field(ZRST, "Set")
    field(ZRVL, "0")
    field(ONST, "XOR")
    field(ONVL, "1")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:5:Red")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,4,1)OVERLAY_RED")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:5:Red_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,4,1)OVERLAY_RED")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:5:Green")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,4,1)OVERLAY_GREEN")
    field(VAL,  "65535")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:5:Green_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,4,1)OVERLAY_GREEN")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:5:Blue")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,4,1)OVERLAY_BLUE")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:5:Blue_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,4,1)OVERLAY_BLUE")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records set the HOPR and LOPR values for the position    #
#  and size to the maximum for the input array                    #
###################################################################

record(longin, "$(CAM):Over1:5:MaxSizeX")
{
    field(INP,  "$(CAM):Over1:MaxSizeX_RBV CP")
    field(FLNK, "$(CAM):Over1:5:SetXHOPR.PROC PP")
}

record(dfanout, "$(CAM):Over1:5:SetXHOPR")
{
    field(DOL,  "$(CAM):Over1:5:MaxSizeX NPP")
    field(OMSL, "closed_loop")
    field(OUTA, "$(CAM):Over1:5:PositionX.HOPR NPP")
    field(OUTB, "$(CAM):Over1:5:CenterX.HOPR NPP")
    field(OUTC, "$(CAM):Over1:5:SizeX.HOPR NPP")
}

record(longin, "$(CAM):Over1:5:MaxSizeY")
{
    field(INP,  "$(CAM):Over1:MaxSizeY_RBV CP")
    field(FLNK, "$(CAM):Over1:5:SetYHOPR.PROC PP")
}

record(dfanout, "$(CAM):Over1:5:SetYHOPR")
{
    field(DOL,  "$(CAM):Over1:5:MaxSizeY NPP")
    field(OMSL, "closed_loop")
    field(OUTA, "$(CAM):Over1:5:PositionY.HOPR NPP")
    field(OUTB, "$(CAM):Over1:5:CenterY.HOPR NPP")
    field(OUTC, "$(CAM):Over1:5:SizeY.HOPR NPP")
}

###################################################################
#  Text overlay (Keith Brister 2014-06-26)
###################################################################

record(waveform, "$(CAM):Over1:5:DisplayText")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(Over1,4,1)OVERLAY_DISPLAY_TEXT")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

record(waveform, "$(CAM):Over1:5:DisplayText_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Over1,4,1)OVERLAY_DISPLAY_TEXT")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

record(stringout, "$(CAM):Over1:5:TimeStampFormat")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(OUT,  "@asyn(Over1,4,1)OVERLAY_TIMESTAMP_FORMAT")
    field(VAL,  "%Y-%m-%d %H:%M:%S.%03f")
    info(autosaveFields, "VAL")
}

record(stringin, "$(CAM):Over1:5:TimeStampFormat_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Over1,4,1)OVERLAY_TIMESTAMP_FORMAT")
    field(SCAN, "I/O Intr")
}

record(mbbo, "$(CAM):Over1:5:Font")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,4,1)OVERLAY_FONT")
    field(ZRST, "6x13")
    field(ZRVL, "0")
    field(ONST, "6x13 Bold")
    field(ONVL, "1")
    field(TWST, "9x15")
    field(TWVL, "2")
    field(THST, "9x15 Bold")
    field(THVL, "3")
    info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Over1:5:Font_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,4,1)OVERLAY_FONT")
    field(ZRST, "6x13")
    field(ZRVL, "0")
    field(ONST, "6x13 Bold")
    field(ONVL, "1")
    field(TWST, "9x15")
    field(TWVL, "2")
    field(THST, "9x15 Bold")
    field(THVL, "3")
    field(SCAN, "I/O Intr")
}
#=================================================================#
# Template file: NDOverlayN.template
# Database for NDOverlays
# Mark Rivers
# March 22, 2010

###################################################################
#  These records control the label for the overlay                #
###################################################################
record(stringout, "$(CAM):Over1:6:Name")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(OUT,  "@asyn(Over1,5,1)NAME")
    field(VAL,  "Cursor2")
    info(autosaveFields, "VAL")
}

record(stringin, "$(CAM):Over1:6:Name_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Over1,5,1)NAME")
    field(SCAN, "I/O Intr")
}


###################################################################
#  These records control whether this overlay is used             #
###################################################################
record(bo, "$(CAM):Over1:6:Use")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,5,1)USE")
    field(VAL,  "0")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Over1:6:Use_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,5,1)USE")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(ZSV,  "NO_ALARM")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the overlay definition                   #
###################################################################

record(longout, "$(CAM):Over1:6:PositionXLink")
{
    field(DOL,  "junk CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:6:PositionX PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:6:PositionX")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,5,1)OVERLAY_POSITION_X")
    info(asyn:READBACK, "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:6:PositionX_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,5,1)OVERLAY_POSITION_X")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:6:PositionYLink")
{
    field(DOL,  "junk CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:6:PositionY PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:6:PositionY")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,5,1)OVERLAY_POSITION_Y")
    info(asyn:READBACK, "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:6:PositionY_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,5,1)OVERLAY_POSITION_Y")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:6:CenterXLink")
{
    field(DOL,  " CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:6:CenterX PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:6:CenterX")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,5,1)OVERLAY_CENTER_X")
    info(asyn:READBACK, "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:6:CenterX_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,5,1)OVERLAY_CENTER_X")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:6:CenterYLink")
{
    field(DOL,  " CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:6:CenterY PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:6:CenterY")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,5,1)OVERLAY_CENTER_Y")
    info(asyn:READBACK, "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:6:CenterY_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,5,1)OVERLAY_CENTER_Y")
    field(SCAN, "I/O Intr")
}
 
record(longout, "$(CAM):Over1:6:SizeXLink")
{
    field(DOL,  "junk CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:6:SizeX PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:6:SizeX")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,5,1)OVERLAY_SIZE_X")
    field(LOPR, "1")
    field(HOPR, "1024")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:6:SizeX_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,5,1)OVERLAY_SIZE_X")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:6:SizeYLink")
{
    field(DOL,  "junk CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:6:SizeY PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:6:SizeY")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,5,1)OVERLAY_SIZE_Y")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:6:SizeY_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,5,1)OVERLAY_SIZE_Y")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:6:WidthXLink")
{
    field(DOL,  " CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:6:WidthX PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:6:WidthX")
{
    field(DOL,  "1")
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,5,1)OVERLAY_WIDTH_X")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:6:WidthX_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,5,1)OVERLAY_WIDTH_X")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:6:WidthYLink")
{
    field(DOL,  " CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:6:WidthY PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:6:WidthY")
{
    field(DOL,  "1")
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,5,1)OVERLAY_WIDTH_Y")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:6:WidthY_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,5,1)OVERLAY_WIDTH_Y")
    field(SCAN, "I/O Intr")
}

record(mbbo, "$(CAM):Over1:6:Shape")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,5,1)OVERLAY_SHAPE")
    field(ZRST, "Cross")
    field(ZRVL, "0")
    field(ONST, "Rectangle")
    field(ONVL, "1")
    field(TWST, "Ellipse")
    field(TWVL, "3")
    field(THST, "Text")
    field(THVL, "2")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Over1:6:Shape_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,5,1)OVERLAY_SHAPE")
    field(ZRST, "Cross")
    field(ZRVL, "0")
    field(ONST, "Rectangle")
    field(ONVL, "1")
    field(TWST, "Ellipse")
    field(TWVL, "3")
    field(THST, "Text")
    field(THVL, "2")
    field(SCAN, "I/O Intr")
}

record(mbbo, "$(CAM):Over1:6:DrawMode")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,5,1)OVERLAY_DRAW_MODE")
    field(ZRST, "Set")
    field(ZRVL, "0")
    field(ONST, "XOR")
    field(ONVL, "1")
    info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Over1:6:DrawMode_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,5,1)OVERLAY_DRAW_MODE")
    field(ZRST, "Set")
    field(ZRVL, "0")
    field(ONST, "XOR")
    field(ONVL, "1")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:6:Red")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,5,1)OVERLAY_RED")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:6:Red_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,5,1)OVERLAY_RED")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:6:Green")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,5,1)OVERLAY_GREEN")
    field(VAL,  "65535")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:6:Green_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,5,1)OVERLAY_GREEN")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:6:Blue")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,5,1)OVERLAY_BLUE")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:6:Blue_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,5,1)OVERLAY_BLUE")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records set the HOPR and LOPR values for the position    #
#  and size to the maximum for the input array                    #
###################################################################

record(longin, "$(CAM):Over1:6:MaxSizeX")
{
    field(INP,  "$(CAM):Over1:MaxSizeX_RBV CP")
    field(FLNK, "$(CAM):Over1:6:SetXHOPR.PROC PP")
}

record(dfanout, "$(CAM):Over1:6:SetXHOPR")
{
    field(DOL,  "$(CAM):Over1:6:MaxSizeX NPP")
    field(OMSL, "closed_loop")
    field(OUTA, "$(CAM):Over1:6:PositionX.HOPR NPP")
    field(OUTB, "$(CAM):Over1:6:CenterX.HOPR NPP")
    field(OUTC, "$(CAM):Over1:6:SizeX.HOPR NPP")
}

record(longin, "$(CAM):Over1:6:MaxSizeY")
{
    field(INP,  "$(CAM):Over1:MaxSizeY_RBV CP")
    field(FLNK, "$(CAM):Over1:6:SetYHOPR.PROC PP")
}

record(dfanout, "$(CAM):Over1:6:SetYHOPR")
{
    field(DOL,  "$(CAM):Over1:6:MaxSizeY NPP")
    field(OMSL, "closed_loop")
    field(OUTA, "$(CAM):Over1:6:PositionY.HOPR NPP")
    field(OUTB, "$(CAM):Over1:6:CenterY.HOPR NPP")
    field(OUTC, "$(CAM):Over1:6:SizeY.HOPR NPP")
}

###################################################################
#  Text overlay (Keith Brister 2014-06-26)
###################################################################

record(waveform, "$(CAM):Over1:6:DisplayText")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(Over1,5,1)OVERLAY_DISPLAY_TEXT")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

record(waveform, "$(CAM):Over1:6:DisplayText_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Over1,5,1)OVERLAY_DISPLAY_TEXT")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

record(stringout, "$(CAM):Over1:6:TimeStampFormat")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(OUT,  "@asyn(Over1,5,1)OVERLAY_TIMESTAMP_FORMAT")
    field(VAL,  "%Y-%m-%d %H:%M:%S.%03f")
    info(autosaveFields, "VAL")
}

record(stringin, "$(CAM):Over1:6:TimeStampFormat_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Over1,5,1)OVERLAY_TIMESTAMP_FORMAT")
    field(SCAN, "I/O Intr")
}

record(mbbo, "$(CAM):Over1:6:Font")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,5,1)OVERLAY_FONT")
    field(ZRST, "6x13")
    field(ZRVL, "0")
    field(ONST, "6x13 Bold")
    field(ONVL, "1")
    field(TWST, "9x15")
    field(TWVL, "2")
    field(THST, "9x15 Bold")
    field(THVL, "3")
    info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Over1:6:Font_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,5,1)OVERLAY_FONT")
    field(ZRST, "6x13")
    field(ZRVL, "0")
    field(ONST, "6x13 Bold")
    field(ONVL, "1")
    field(TWST, "9x15")
    field(TWVL, "2")
    field(THST, "9x15 Bold")
    field(THVL, "3")
    field(SCAN, "I/O Intr")
}
#=================================================================#
# Template file: NDOverlayN.template
# Database for NDOverlays
# Mark Rivers
# March 22, 2010

###################################################################
#  These records control the label for the overlay                #
###################################################################
record(stringout, "$(CAM):Over1:7:Name")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(OUT,  "@asyn(Over1,6,1)NAME")
    field(VAL,  "Box1")
    info(autosaveFields, "VAL")
}

record(stringin, "$(CAM):Over1:7:Name_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Over1,6,1)NAME")
    field(SCAN, "I/O Intr")
}


###################################################################
#  These records control whether this overlay is used             #
###################################################################
record(bo, "$(CAM):Over1:7:Use")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,6,1)USE")
    field(VAL,  "0")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Over1:7:Use_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,6,1)USE")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(ZSV,  "NO_ALARM")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the overlay definition                   #
###################################################################

record(longout, "$(CAM):Over1:7:PositionXLink")
{
    field(DOL,  "junk CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:7:PositionX PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:7:PositionX")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,6,1)OVERLAY_POSITION_X")
    info(asyn:READBACK, "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:7:PositionX_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,6,1)OVERLAY_POSITION_X")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:7:PositionYLink")
{
    field(DOL,  "junk CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:7:PositionY PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:7:PositionY")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,6,1)OVERLAY_POSITION_Y")
    info(asyn:READBACK, "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:7:PositionY_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,6,1)OVERLAY_POSITION_Y")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:7:CenterXLink")
{
    field(DOL,  " CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:7:CenterX PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:7:CenterX")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,6,1)OVERLAY_CENTER_X")
    info(asyn:READBACK, "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:7:CenterX_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,6,1)OVERLAY_CENTER_X")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:7:CenterYLink")
{
    field(DOL,  " CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:7:CenterY PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:7:CenterY")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,6,1)OVERLAY_CENTER_Y")
    info(asyn:READBACK, "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:7:CenterY_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,6,1)OVERLAY_CENTER_Y")
    field(SCAN, "I/O Intr")
}
 
record(longout, "$(CAM):Over1:7:SizeXLink")
{
    field(DOL,  "junk CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:7:SizeX PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:7:SizeX")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,6,1)OVERLAY_SIZE_X")
    field(LOPR, "1")
    field(HOPR, "1024")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:7:SizeX_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,6,1)OVERLAY_SIZE_X")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:7:SizeYLink")
{
    field(DOL,  "junk CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:7:SizeY PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:7:SizeY")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,6,1)OVERLAY_SIZE_Y")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:7:SizeY_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,6,1)OVERLAY_SIZE_Y")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:7:WidthXLink")
{
    field(DOL,  " CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:7:WidthX PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:7:WidthX")
{
    field(DOL,  "1")
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,6,1)OVERLAY_WIDTH_X")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:7:WidthX_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,6,1)OVERLAY_WIDTH_X")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:7:WidthYLink")
{
    field(DOL,  " CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:7:WidthY PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:7:WidthY")
{
    field(DOL,  "1")
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,6,1)OVERLAY_WIDTH_Y")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:7:WidthY_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,6,1)OVERLAY_WIDTH_Y")
    field(SCAN, "I/O Intr")
}

record(mbbo, "$(CAM):Over1:7:Shape")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,6,1)OVERLAY_SHAPE")
    field(ZRST, "Cross")
    field(ZRVL, "0")
    field(ONST, "Rectangle")
    field(ONVL, "1")
    field(TWST, "Ellipse")
    field(TWVL, "3")
    field(THST, "Text")
    field(THVL, "2")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Over1:7:Shape_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,6,1)OVERLAY_SHAPE")
    field(ZRST, "Cross")
    field(ZRVL, "0")
    field(ONST, "Rectangle")
    field(ONVL, "1")
    field(TWST, "Ellipse")
    field(TWVL, "3")
    field(THST, "Text")
    field(THVL, "2")
    field(SCAN, "I/O Intr")
}

record(mbbo, "$(CAM):Over1:7:DrawMode")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,6,1)OVERLAY_DRAW_MODE")
    field(ZRST, "Set")
    field(ZRVL, "0")
    field(ONST, "XOR")
    field(ONVL, "1")
    info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Over1:7:DrawMode_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,6,1)OVERLAY_DRAW_MODE")
    field(ZRST, "Set")
    field(ZRVL, "0")
    field(ONST, "XOR")
    field(ONVL, "1")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:7:Red")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,6,1)OVERLAY_RED")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:7:Red_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,6,1)OVERLAY_RED")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:7:Green")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,6,1)OVERLAY_GREEN")
    field(VAL,  "65535")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:7:Green_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,6,1)OVERLAY_GREEN")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:7:Blue")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,6,1)OVERLAY_BLUE")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:7:Blue_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,6,1)OVERLAY_BLUE")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records set the HOPR and LOPR values for the position    #
#  and size to the maximum for the input array                    #
###################################################################

record(longin, "$(CAM):Over1:7:MaxSizeX")
{
    field(INP,  "$(CAM):Over1:MaxSizeX_RBV CP")
    field(FLNK, "$(CAM):Over1:7:SetXHOPR.PROC PP")
}

record(dfanout, "$(CAM):Over1:7:SetXHOPR")
{
    field(DOL,  "$(CAM):Over1:7:MaxSizeX NPP")
    field(OMSL, "closed_loop")
    field(OUTA, "$(CAM):Over1:7:PositionX.HOPR NPP")
    field(OUTB, "$(CAM):Over1:7:CenterX.HOPR NPP")
    field(OUTC, "$(CAM):Over1:7:SizeX.HOPR NPP")
}

record(longin, "$(CAM):Over1:7:MaxSizeY")
{
    field(INP,  "$(CAM):Over1:MaxSizeY_RBV CP")
    field(FLNK, "$(CAM):Over1:7:SetYHOPR.PROC PP")
}

record(dfanout, "$(CAM):Over1:7:SetYHOPR")
{
    field(DOL,  "$(CAM):Over1:7:MaxSizeY NPP")
    field(OMSL, "closed_loop")
    field(OUTA, "$(CAM):Over1:7:PositionY.HOPR NPP")
    field(OUTB, "$(CAM):Over1:7:CenterY.HOPR NPP")
    field(OUTC, "$(CAM):Over1:7:SizeY.HOPR NPP")
}

###################################################################
#  Text overlay (Keith Brister 2014-06-26)
###################################################################

record(waveform, "$(CAM):Over1:7:DisplayText")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(Over1,6,1)OVERLAY_DISPLAY_TEXT")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

record(waveform, "$(CAM):Over1:7:DisplayText_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Over1,6,1)OVERLAY_DISPLAY_TEXT")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

record(stringout, "$(CAM):Over1:7:TimeStampFormat")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(OUT,  "@asyn(Over1,6,1)OVERLAY_TIMESTAMP_FORMAT")
    field(VAL,  "%Y-%m-%d %H:%M:%S.%03f")
    info(autosaveFields, "VAL")
}

record(stringin, "$(CAM):Over1:7:TimeStampFormat_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Over1,6,1)OVERLAY_TIMESTAMP_FORMAT")
    field(SCAN, "I/O Intr")
}

record(mbbo, "$(CAM):Over1:7:Font")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,6,1)OVERLAY_FONT")
    field(ZRST, "6x13")
    field(ZRVL, "0")
    field(ONST, "6x13 Bold")
    field(ONVL, "1")
    field(TWST, "9x15")
    field(TWVL, "2")
    field(THST, "9x15 Bold")
    field(THVL, "3")
    info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Over1:7:Font_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,6,1)OVERLAY_FONT")
    field(ZRST, "6x13")
    field(ZRVL, "0")
    field(ONST, "6x13 Bold")
    field(ONVL, "1")
    field(TWST, "9x15")
    field(TWVL, "2")
    field(THST, "9x15 Bold")
    field(THVL, "3")
    field(SCAN, "I/O Intr")
}
#=================================================================#
# Template file: NDOverlayN.template
# Database for NDOverlays
# Mark Rivers
# March 22, 2010

###################################################################
#  These records control the label for the overlay                #
###################################################################
record(stringout, "$(CAM):Over1:8:Name")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(OUT,  "@asyn(Over1,7,1)NAME")
    field(VAL,  "Box2")
    info(autosaveFields, "VAL")
}

record(stringin, "$(CAM):Over1:8:Name_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Over1,7,1)NAME")
    field(SCAN, "I/O Intr")
}


###################################################################
#  These records control whether this overlay is used             #
###################################################################
record(bo, "$(CAM):Over1:8:Use")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,7,1)USE")
    field(VAL,  "0")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Over1:8:Use_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,7,1)USE")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(ZSV,  "NO_ALARM")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the overlay definition                   #
###################################################################

record(longout, "$(CAM):Over1:8:PositionXLink")
{
    field(DOL,  "junk CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:8:PositionX PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:8:PositionX")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,7,1)OVERLAY_POSITION_X")
    info(asyn:READBACK, "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:8:PositionX_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,7,1)OVERLAY_POSITION_X")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:8:PositionYLink")
{
    field(DOL,  "junk CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:8:PositionY PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:8:PositionY")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,7,1)OVERLAY_POSITION_Y")
    info(asyn:READBACK, "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:8:PositionY_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,7,1)OVERLAY_POSITION_Y")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:8:CenterXLink")
{
    field(DOL,  " CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:8:CenterX PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:8:CenterX")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,7,1)OVERLAY_CENTER_X")
    info(asyn:READBACK, "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:8:CenterX_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,7,1)OVERLAY_CENTER_X")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:8:CenterYLink")
{
    field(DOL,  " CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:8:CenterY PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:8:CenterY")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,7,1)OVERLAY_CENTER_Y")
    info(asyn:READBACK, "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:8:CenterY_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,7,1)OVERLAY_CENTER_Y")
    field(SCAN, "I/O Intr")
}
 
record(longout, "$(CAM):Over1:8:SizeXLink")
{
    field(DOL,  "junk CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:8:SizeX PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:8:SizeX")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,7,1)OVERLAY_SIZE_X")
    field(LOPR, "1")
    field(HOPR, "1024")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:8:SizeX_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,7,1)OVERLAY_SIZE_X")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:8:SizeYLink")
{
    field(DOL,  "junk CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:8:SizeY PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:8:SizeY")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,7,1)OVERLAY_SIZE_Y")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:8:SizeY_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,7,1)OVERLAY_SIZE_Y")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:8:WidthXLink")
{
    field(DOL,  " CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:8:WidthX PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:8:WidthX")
{
    field(DOL,  "1")
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,7,1)OVERLAY_WIDTH_X")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:8:WidthX_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,7,1)OVERLAY_WIDTH_X")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:8:WidthYLink")
{
    field(DOL,  " CP MS")
    field(OMSL, "closed_loop")
    field(OUT, "$(CAM):Over1:8:WidthY PP")
    info(autosaveFields, "DOL")
}

record(longout, "$(CAM):Over1:8:WidthY")
{
    field(DOL,  "1")
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,7,1)OVERLAY_WIDTH_Y")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:8:WidthY_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,7,1)OVERLAY_WIDTH_Y")
    field(SCAN, "I/O Intr")
}

record(mbbo, "$(CAM):Over1:8:Shape")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,7,1)OVERLAY_SHAPE")
    field(ZRST, "Cross")
    field(ZRVL, "0")
    field(ONST, "Rectangle")
    field(ONVL, "1")
    field(TWST, "Ellipse")
    field(TWVL, "3")
    field(THST, "Text")
    field(THVL, "2")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Over1:8:Shape_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,7,1)OVERLAY_SHAPE")
    field(ZRST, "Cross")
    field(ZRVL, "0")
    field(ONST, "Rectangle")
    field(ONVL, "1")
    field(TWST, "Ellipse")
    field(TWVL, "3")
    field(THST, "Text")
    field(THVL, "2")
    field(SCAN, "I/O Intr")
}

record(mbbo, "$(CAM):Over1:8:DrawMode")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,7,1)OVERLAY_DRAW_MODE")
    field(ZRST, "Set")
    field(ZRVL, "0")
    field(ONST, "XOR")
    field(ONVL, "1")
    info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Over1:8:DrawMode_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,7,1)OVERLAY_DRAW_MODE")
    field(ZRST, "Set")
    field(ZRVL, "0")
    field(ONST, "XOR")
    field(ONVL, "1")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:8:Red")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,7,1)OVERLAY_RED")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:8:Red_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,7,1)OVERLAY_RED")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:8:Green")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,7,1)OVERLAY_GREEN")
    field(VAL,  "65535")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:8:Green_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,7,1)OVERLAY_GREEN")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Over1:8:Blue")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,7,1)OVERLAY_BLUE")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Over1:8:Blue_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,7,1)OVERLAY_BLUE")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records set the HOPR and LOPR values for the position    #
#  and size to the maximum for the input array                    #
###################################################################

record(longin, "$(CAM):Over1:8:MaxSizeX")
{
    field(INP,  "$(CAM):Over1:MaxSizeX_RBV CP")
    field(FLNK, "$(CAM):Over1:8:SetXHOPR.PROC PP")
}

record(dfanout, "$(CAM):Over1:8:SetXHOPR")
{
    field(DOL,  "$(CAM):Over1:8:MaxSizeX NPP")
    field(OMSL, "closed_loop")
    field(OUTA, "$(CAM):Over1:8:PositionX.HOPR NPP")
    field(OUTB, "$(CAM):Over1:8:CenterX.HOPR NPP")
    field(OUTC, "$(CAM):Over1:8:SizeX.HOPR NPP")
}

record(longin, "$(CAM):Over1:8:MaxSizeY")
{
    field(INP,  "$(CAM):Over1:MaxSizeY_RBV CP")
    field(FLNK, "$(CAM):Over1:8:SetYHOPR.PROC PP")
}

record(dfanout, "$(CAM):Over1:8:SetYHOPR")
{
    field(DOL,  "$(CAM):Over1:8:MaxSizeY NPP")
    field(OMSL, "closed_loop")
    field(OUTA, "$(CAM):Over1:8:PositionY.HOPR NPP")
    field(OUTB, "$(CAM):Over1:8:CenterY.HOPR NPP")
    field(OUTC, "$(CAM):Over1:8:SizeY.HOPR NPP")
}

###################################################################
#  Text overlay (Keith Brister 2014-06-26)
###################################################################

record(waveform, "$(CAM):Over1:8:DisplayText")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(Over1,7,1)OVERLAY_DISPLAY_TEXT")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

record(waveform, "$(CAM):Over1:8:DisplayText_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Over1,7,1)OVERLAY_DISPLAY_TEXT")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

record(stringout, "$(CAM):Over1:8:TimeStampFormat")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(OUT,  "@asyn(Over1,7,1)OVERLAY_TIMESTAMP_FORMAT")
    field(VAL,  "%Y-%m-%d %H:%M:%S.%03f")
    info(autosaveFields, "VAL")
}

record(stringin, "$(CAM):Over1:8:TimeStampFormat_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Over1,7,1)OVERLAY_TIMESTAMP_FORMAT")
    field(SCAN, "I/O Intr")
}

record(mbbo, "$(CAM):Over1:8:Font")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Over1,7,1)OVERLAY_FONT")
    field(ZRST, "6x13")
    field(ZRVL, "0")
    field(ONST, "6x13 Bold")
    field(ONVL, "1")
    field(TWST, "9x15")
    field(TWVL, "2")
    field(THST, "9x15 Bold")
    field(THVL, "3")
    info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Over1:8:Font_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Over1,7,1)OVERLAY_FONT")
    field(ZRST, "6x13")
    field(ZRVL, "0")
    field(ONST, "6x13 Bold")
    field(ONVL, "1")
    field(TWST, "9x15")
    field(TWVL, "2")
    field(THST, "9x15 Bold")
    field(THVL, "3")
    field(SCAN, "I/O Intr")
}
#=================================================================#
# Template file: NDProcess.template
# Database for ND PluginProcess
# Mark Rivers
# March 14, 2010

#=================================================================#
# Template file: NDPluginBase.template
# Database for NDPluginBase, i.e. records common to all plugins
# Mark Rivers
# April 25, 2008

#=================================================================#
# Template file: NDArrayBase.template
# Database for area detector control using asyn driver and standard asyn device support
# Mark Rivers
# March 9, 2008

###################################################################
#  This record contains the version of ADCore                     #
###################################################################

record(stringin, "$(CAM):Proc1:ADCoreVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))ADCORE_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the version of the driver or plugin       #
###################################################################

record(stringin, "$(CAM):Proc1:DriverVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))DRIVER_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the asyn port name of this detector       #
###################################################################

record(stringin, "$(CAM):Proc1:PortName_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))PORT_NAME_SELF")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records contain basic information about the detector     # 
###################################################################

record(stringin, "$(CAM):Proc1:Manufacturer_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))MANUFACTURER")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):Proc1:Model_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))MODEL")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):Proc1:SerialNumber_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))SERIAL_NUMBER")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):Proc1:SDKVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))SDK_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):Proc1:FirmwareVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))FIRMWARE_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control acquisition start and stop               #
###################################################################

record(bo, "$(CAM):Proc1:Acquire") {
   field(DTYP, "asynInt32")
   field(OUT, "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))ACQUIRE")
   field(ZNAM, "Done")
   field(ONAM, "Acquire")
   field(VAL,  "0")
   field(FLNK, "$(CAM):Proc1:SetAcquireBusy")
   info(asyn:READBACK, "1")
}

record(bi, "$(CAM):Proc1:Acquire_RBV") {
   field(DTYP, "asynInt32")
   field(INP, "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))ACQUIRE")
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):Proc1:SetAcquireBusy")
{
    field(INPA, "$(CAM):Proc1:Acquire NPP")
    field(CALC, "A")
    field(OOPT, "Transition To Non-zero")
    field(OUT,  "$(CAM):Proc1:AcquireBusy PP")
}

record(busy, "$(CAM):Proc1:AcquireBusy") {
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(VAL,  "0")
}

record(bi, "$(CAM):Proc1:AcquireBusyCB") {
   field(DTYP, "asynInt32")
   field(INP, "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))ACQUIRE_BUSY")
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):Proc1:ClearAcquireBusy") {
    field(INPA, "$(CAM):Proc1:AcquireBusyCB CP")
    field(CALC, "A")
    field(OOPT, "Transition To Zero")
    field(OUT,  "$(CAM):Proc1:AcquireBusy PP")
}

record(bo, "$(CAM):Proc1:WaitForPlugins") {
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT, "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))WAIT_FOR_PLUGINS")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(VAL,  "0")
}

###################################################################
#  These records are the array size and data type                 #
###################################################################
# The number of dimensions
record(longout, "$(CAM):Proc1:NDimensions")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))ARRAY_NDIMENSIONS")
}

record(longin, "$(CAM):Proc1:NDimensions_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))ARRAY_NDIMENSIONS")
    field(SCAN, "I/O Intr")
}

# The array dimensions waveform records
record(waveform, "$(CAM):Proc1:Dimensions")
{
    field(DTYP, "asynInt32ArrayOut")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))ARRAY_DIMENSIONS")
    field(FTVL, "LONG")
    field(NELM, "10")
    field(FLNK, "$(CAM):Proc1:Dim0SA")
}

record(subArray, "$(CAM):Proc1:Dim0SA")
{
    field(INP,  "$(CAM):Proc1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "0")
    field(FLNK, "$(CAM):Proc1:ArraySize0")
}

record(longin, "$(CAM):Proc1:ArraySize0")
{
    field(INP,  "$(CAM):Proc1:Dim0SA")
    field(FLNK, "$(CAM):Proc1:Dim1SA")
}

record(subArray, "$(CAM):Proc1:Dim1SA")
{
    field(INP,  "$(CAM):Proc1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "1")
    field(FLNK, "$(CAM):Proc1:ArraySize1")
}

record(longin, "$(CAM):Proc1:ArraySize1")
{
    field(INP,  "$(CAM):Proc1:Dim1SA")
    field(FLNK, "$(CAM):Proc1:Dim2SA")
}

record(subArray, "$(CAM):Proc1:Dim2SA")
{
    field(INP,  "$(CAM):Proc1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "2")
    field(FLNK, "$(CAM):Proc1:ArraySize2")
}

record(longin, "$(CAM):Proc1:ArraySize2")
{
    field(INP,  "$(CAM):Proc1:Dim2SA")
    field(FLNK, "$(CAM):Proc1:Dim3SA")
}

record(subArray, "$(CAM):Proc1:Dim3SA")
{
    field(INP,  "$(CAM):Proc1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "3")
    field(FLNK, "$(CAM):Proc1:ArraySize3")
}

record(longin, "$(CAM):Proc1:ArraySize3")
{
    field(INP,  "$(CAM):Proc1:Dim3SA")
    field(FLNK, "$(CAM):Proc1:Dim4SA")
}

record(subArray, "$(CAM):Proc1:Dim4SA")
{
    field(INP,  "$(CAM):Proc1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "4")
    field(FLNK, "$(CAM):Proc1:ArraySize4")
}

record(longin, "$(CAM):Proc1:ArraySize4")
{
    field(INP,  "$(CAM):Proc1:Dim4SA")
    field(FLNK, "$(CAM):Proc1:Dim5SA")
}

record(subArray, "$(CAM):Proc1:Dim5SA")
{
    field(INP,  "$(CAM):Proc1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "5")
    field(FLNK, "$(CAM):Proc1:ArraySize5")
}

record(longin, "$(CAM):Proc1:ArraySize5")
{
    field(INP,  "$(CAM):Proc1:Dim5SA")
    field(FLNK, "$(CAM):Proc1:Dim6SA")
}

record(subArray, "$(CAM):Proc1:Dim6SA")
{
    field(INP,  "$(CAM):Proc1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "6")
    field(FLNK, "$(CAM):Proc1:ArraySize6")
}

record(longin, "$(CAM):Proc1:ArraySize6")
{
    field(INP,  "$(CAM):Proc1:Dim6SA")
    field(FLNK, "$(CAM):Proc1:Dim7SA")
}

record(subArray, "$(CAM):Proc1:Dim7SA")
{
    field(INP,  "$(CAM):Proc1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "7")
    field(FLNK, "$(CAM):Proc1:ArraySize7")
}

record(longin, "$(CAM):Proc1:ArraySize7")
{
    field(INP,  "$(CAM):Proc1:Dim7SA")
    field(FLNK, "$(CAM):Proc1:Dim8SA")
}

record(subArray, "$(CAM):Proc1:Dim8SA")
{
    field(INP,  "$(CAM):Proc1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "8")
    field(FLNK, "$(CAM):Proc1:ArraySize8")
}

record(longin, "$(CAM):Proc1:ArraySize8")
{
    field(INP,  "$(CAM):Proc1:Dim8SA")
    field(FLNK, "$(CAM):Proc1:Dim9SA")
}

record(subArray, "$(CAM):Proc1:Dim9SA")
{
    field(INP,  "$(CAM):Proc1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "9")
    field(FLNK, "$(CAM):Proc1:ArraySize9")
}

record(longin, "$(CAM):Proc1:ArraySize9")
{
    field(INP,  "$(CAM):Proc1:Dim9SA")
}


record(waveform, "$(CAM):Proc1:Dimensions_RBV")
{
    field(DTYP, "asynInt32ArrayIn")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))ARRAY_DIMENSIONS")
    field(FTVL, "LONG")
    field(NELM, "10")
    field(FLNK, "$(CAM):Proc1:Dim0SA_RBV")
    field(SCAN, "I/O Intr")
}

record(subArray, "$(CAM):Proc1:Dim0SA_RBV")
{
    field(INP,  "$(CAM):Proc1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "0")
    field(FLNK, "$(CAM):Proc1:ArraySize0_RBV")
}

record(longin, "$(CAM):Proc1:ArraySize0_RBV")
{
    field(INP,  "$(CAM):Proc1:Dim0SA_RBV")
    field(FLNK, "$(CAM):Proc1:Dim1SA_RBV")
}

record(subArray, "$(CAM):Proc1:Dim1SA_RBV")
{
    field(INP,  "$(CAM):Proc1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "1")
    field(FLNK, "$(CAM):Proc1:ArraySize1_RBV")
}

record(longin, "$(CAM):Proc1:ArraySize1_RBV")
{
    field(INP,  "$(CAM):Proc1:Dim1SA_RBV")
    field(FLNK, "$(CAM):Proc1:Dim2SA_RBV")
}

record(subArray, "$(CAM):Proc1:Dim2SA_RBV")
{
    field(INP,  "$(CAM):Proc1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "2")
    field(FLNK, "$(CAM):Proc1:ArraySize2_RBV")
}

record(longin, "$(CAM):Proc1:ArraySize2_RBV")
{
    field(INP,  "$(CAM):Proc1:Dim2SA_RBV")
    field(FLNK, "$(CAM):Proc1:Dim3SA_RBV")
}

record(subArray, "$(CAM):Proc1:Dim3SA_RBV")
{
    field(INP,  "$(CAM):Proc1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "3")
    field(FLNK, "$(CAM):Proc1:ArraySize3_RBV")
}

record(longin, "$(CAM):Proc1:ArraySize3_RBV")
{
    field(INP,  "$(CAM):Proc1:Dim3SA_RBV")
    field(FLNK, "$(CAM):Proc1:Dim4SA_RBV")
}

record(subArray, "$(CAM):Proc1:Dim4SA_RBV")
{
    field(INP,  "$(CAM):Proc1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "4")
    field(FLNK, "$(CAM):Proc1:ArraySize4_RBV")
}

record(longin, "$(CAM):Proc1:ArraySize4_RBV")
{
    field(INP,  "$(CAM):Proc1:Dim4SA_RBV")
    field(FLNK, "$(CAM):Proc1:Dim5SA_RBV")
}

record(subArray, "$(CAM):Proc1:Dim5SA_RBV")
{
    field(INP,  "$(CAM):Proc1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "5")
    field(FLNK, "$(CAM):Proc1:ArraySize5_RBV")
}

record(longin, "$(CAM):Proc1:ArraySize5_RBV")
{
    field(INP,  "$(CAM):Proc1:Dim5SA_RBV")
    field(FLNK, "$(CAM):Proc1:Dim6SA_RBV")
}

record(subArray, "$(CAM):Proc1:Dim6SA_RBV")
{
    field(INP,  "$(CAM):Proc1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "6")
    field(FLNK, "$(CAM):Proc1:ArraySize6_RBV")
}

record(longin, "$(CAM):Proc1:ArraySize6_RBV")
{
    field(INP,  "$(CAM):Proc1:Dim6SA_RBV")
    field(FLNK, "$(CAM):Proc1:Dim7SA_RBV")
}

record(subArray, "$(CAM):Proc1:Dim7SA_RBV")
{
    field(INP,  "$(CAM):Proc1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "7")
    field(FLNK, "$(CAM):Proc1:ArraySize7_RBV")
}

record(longin, "$(CAM):Proc1:ArraySize7_RBV")
{
    field(INP,  "$(CAM):Proc1:Dim7SA_RBV")
    field(FLNK, "$(CAM):Proc1:Dim8SA_RBV")
}

record(subArray, "$(CAM):Proc1:Dim8SA_RBV")
{
    field(INP,  "$(CAM):Proc1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "8")
    field(FLNK, "$(CAM):Proc1:ArraySize8_RBV")
}

record(longin, "$(CAM):Proc1:ArraySize8_RBV")
{
    field(INP,  "$(CAM):Proc1:Dim8SA_RBV")
    field(FLNK, "$(CAM):Proc1:Dim9SA_RBV")
}

record(subArray, "$(CAM):Proc1:Dim9SA_RBV")
{
    field(INP,  "$(CAM):Proc1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "9")
    field(FLNK, "$(CAM):Proc1:ArraySize9_RBV")
}

record(longin, "$(CAM):Proc1:ArraySize9_RBV")
{
    field(INP,  "$(CAM):Proc1:Dim9SA_RBV")
}


record(mbbi, "$(CAM):Proc1:BayerPattern_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))BAYER_PATTERN")
   field(ZRST, "RGGB")
   field(ZRVL, "0")
   field(ONST, "GBRG")
   field(ONVL, "1")
   field(TWST, "GRBG")
   field(TWVL, "2")
   field(THST, "BGGR")
   field(THVL, "3")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Proc1:ArraySizeX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_X")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Proc1:ArraySizeY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_Y")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Proc1:ArraySizeZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_Z")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Proc1:ArraySize_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records have information on the compression              # 
###################################################################
record(stringin, "$(CAM):Proc1:Codec_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))CODEC")
   field(VAL,  "")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Proc1:CompressedSize_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))COMPRESSED_SIZE")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the data type                            # 
###################################################################

record(mbbo, "$(CAM):Proc1:DataType")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))DATA_TYPE")
   field(ZRST, "Int8")
   field(ZRVL, "0")
   field(ONST, "UInt8")
   field(ONVL, "1")
   field(TWST, "Int16")
   field(TWVL, "2")
   field(THST, "UInt16")
   field(THVL, "3")
   field(FRST, "Int32")
   field(FRVL, "4")
   field(FVST, "UInt32")
   field(FVVL, "5")
   field(SXST, "Int64")
   field(SXVL, "6")
   field(SVST, "UInt64")
   field(SVVL, "7")
   field(EIST, "Float32")
   field(EIVL, "8")
   field(NIST, "Float64")
   field(NIVL, "9")
   field(VAL,  "0")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Proc1:DataType_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))DATA_TYPE")
   field(ZRST, "Int8")
   field(ZRVL, "0")
   field(ONST, "UInt8")
   field(ONVL, "1")
   field(TWST, "Int16")
   field(TWVL, "2")
   field(THST, "UInt16")
   field(THVL, "3")
   field(FRST, "Int32")
   field(FRVL, "4")
   field(FVST, "UInt32")
   field(FVVL, "5")
   field(SXST, "Int64")
   field(SXVL, "6")
   field(SVST, "UInt64")
   field(SVVL, "7")
   field(EIST, "Float32")
   field(EIVL, "8")
   field(NIST, "Float64")
   field(NIVL, "9")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Proc1:BitsPerPixel_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))BITS_PER_PIXEL")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the color mode                           #
#  These choices must agree with NDColorMode_t in NDArray.h       # 
###################################################################

record(mbbo, "$(CAM):Proc1:ColorMode")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))COLOR_MODE")
   field(ZRST, "Mono")
   field(ZRVL, "0")
   field(ONST, "Bayer")
   field(ONVL, "1")
   field(TWST, "RGB1")
   field(TWVL, "2")
   field(THST, "RGB2")
   field(THVL, "3")
   field(FRST, "RGB3")
   field(FRVL, "4")
   field(FVST, "YUV444")
   field(FVVL, "5")
   field(SXST, "YUV422")
   field(SXVL, "6")
   field(SVST, "YUV421")
   field(SVVL, "7")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Proc1:ColorMode_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))COLOR_MODE")
   field(ZRST, "Mono")
   field(ZRVL, "0")
   field(ONST, "Bayer")
   field(ONVL, "1")
   field(TWST, "RGB1")
   field(TWVL, "2")
   field(THST, "RGB2")
   field(THVL, "3")
   field(FRST, "RGB3")
   field(FRVL, "4")
   field(FVST, "YUV444")
   field(FVVL, "5")
   field(SXST, "YUV422")
   field(SXVL, "6")
   field(SVST, "YUV421")
   field(SVVL, "7")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records are the uniqueId and time stamps of the array     #
###################################################################
record(longin, "$(CAM):Proc1:UniqueId_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))UNIQUE_ID")
    field(SCAN, "I/O Intr")
}

record(ai, "$(CAM):Proc1:TimeStamp_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))TIME_STAMP")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Proc1:EpicsTSSec_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))EPICS_TS_SEC")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Proc1:EpicsTSNsec_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))EPICS_TS_NSEC")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records provide statistics on array callbacks and        #
#  array callback rates                                           # 
###################################################################
record(longout, "$(CAM):Proc1:ArrayCounter")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))ARRAY_COUNTER")
}

record(longin, "$(CAM):Proc1:ArrayCounter_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))ARRAY_COUNTER")
    field(SCAN, "I/O Intr")
    field(TSE,  "-2")
    field(LOW,  "0" )
    field(LSV,  "MINOR" )
    info(autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV TSE")
}

# Updated rate calculation to use a smoothing factor w/ guard against negative values
# 0 rate sets alarm state to MINOR
record(calc, "$(CAM):Proc1:ArrayRate_RBV")
{
    field(INPA, "$(CAM):Proc1:ArrayRate_RBV.LB NPP NMS")   # Previous counter (Last B value)
    field(INPB, "$(CAM):Proc1:ArrayCounter_RBV NPP NMS")   # Current counter value
    field(INPC, "1.0")                                # Delta time in seconds
    field(INPD, "$(CAM):Proc1:ArrayRate_RBV.VAL NPP NMS")  # Previous rate
    field(INPE, "0.0")                 # Smoothing factor
    field(CALC, "(D*E)/C+MAX(0,B-A)*(1-E)/C")
    field(PREC, "2" )
    field(EGU,  "Hz" )
    field(SCAN, "1 second")
    field(LOW,  "0")
    field(LSV,  "MINOR")
    field(ADEL, "0.1")
    info(autosaveFields, "ADEL DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV MDEL PREC C E SCAN EGU")
}

###################################################################
#  These records control NDArray callacks                         # 
###################################################################
record(bo, "$(CAM):Proc1:ArrayCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))ARRAY_CALLBACKS")
    field(ZNAM, "Disable")
    field(ZSV,  "MINOR")
    field(ONAM, "Enable")
    field(OSV,  "NO_ALARM")
    field(VAL, "1")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Proc1:ArrayCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))ARRAY_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ZSV,  "MINOR")
    field(ONAM, "Enabled")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains macro definitions for the attributes      # 
###################################################################

record(waveform, "$(CAM):Proc1:NDAttributesMacros")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_MACROS")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

###################################################################
#  This record is the name of a file defining attributes          # 
###################################################################

record(waveform, "$(CAM):Proc1:NDAttributesFile")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_FILE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

###################################################################
#  This record defines the status of reading attributes file      # 
###################################################################

record(mbbi, "$(CAM):Proc1:NDAttributesStatus")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_STATUS")
    field(ZRVL, "0")
    field(ZRST, "Attributes file OK")
    field(ZRSV, "NO_ALARM")
    field(ONVL, "1")
    field(ONST, "File not found")
    field(ONSV, "MINOR")
    field(TWVL, "2")
    field(TWST, "XML syntax error")
    field(TWSV, "MAJOR")
    field(THVL, "3")
    field(THST, "Macro substitution error")
    field(THSV, "MAJOR")
    field(SCAN, "I/O Intr")
}

###################################################################
#  Status of NDArrayPool - number of buffers, memory used etc.    # 
###################################################################

record(ai, "$(CAM):Proc1:PoolMaxMem")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))POOL_MAX_MEMORY")
   field(PREC, "1")
   field(EGU,  "MB")
   field(SCAN, "Passive")
   field(PINI, "YES")
}

record(ai, "$(CAM):Proc1:PoolUsedMem")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))POOL_USED_MEMORY")
   field(PREC, "1")
   field(EGU,  "MB")
   field(SCAN, "1 second")
   field(FLNK, "$(CAM):Proc1:PoolAllocBuffers")
   info(autosaveFields, "SCAN")
}

record(longin, "$(CAM):Proc1:PoolAllocBuffers")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))POOL_ALLOC_BUFFERS")
   field(FLNK, "$(CAM):Proc1:PoolFreeBuffers")
}

record(longin, "$(CAM):Proc1:PoolFreeBuffers")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))POOL_FREE_BUFFERS")
   field(FLNK, "$(CAM):Proc1:PoolUsedBuffers")
}

record(calc, "$(CAM):Proc1:PoolUsedBuffers")
{
    field(INPA, "$(CAM):Proc1:PoolAllocBuffers NPP MS")
    field(INPB, "$(CAM):Proc1:PoolFreeBuffers NPP MS")
    field(CALC, "A-B")
}

record(bo, "$(CAM):Proc1:EmptyFreeList")
{
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))POOL_EMPTY_FREELIST")
}

record(longin, "$(CAM):Proc1:NumQueuedArrays")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))NUM_QUEUED_ARRAYS")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the type of plugin                        #
###################################################################

record(stringin, "$(CAM):Proc1:PluginType_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))PLUGIN_TYPE")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the connection of the server to          #
#  an NDArray driver port and address                             #
###################################################################
# Array port name
record(stringout, "$(CAM):Proc1:NDArrayPort")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))NDARRAY_PORT")
    field(VAL,  "$(CAM_PORT)")
    info(autosaveFields, "DESC VAL")
}

record(stringin, "$(CAM):Proc1:NDArrayPort_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))NDARRAY_PORT")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Proc1:NDArrayAddress")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))NDARRAY_ADDR")
    field(VAL,  "$(NDARRAY_ADDR=0)")
    info(autosaveFields, "DESC VAL")
}

record(longin, "$(CAM):Proc1:NDArrayAddress_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))NDARRAY_ADDR")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control whether callbacks are enabled and        #
#  minimum time between callbacks                                 #
###################################################################
record(bo, "$(CAM):Proc1:EnableCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))ENABLE_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    field(VAL,  "0")
    info(autosaveFields, "DESC VAL")
}

record(bi, "$(CAM):Proc1:EnableCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))ENABLE_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    field(ZSV,  "MINOR")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Proc1:MinCallbackTime")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))MIN_CALLBACK_TIME")
    field(EGU,  "s")
    field(PREC, "3")
    field(VAL,  "0.0")
    field(DRVL, "0")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):Proc1:MinCallbackTime_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))MIN_CALLBACK_TIME")
    field(EGU,  "s")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Proc1:MaxArrayRate")
{
    field(DTYP, "Soft Channel")
    field(OUT,  "$(CAM):Proc1:MaxArrayRate_COUT PP")
    field(EGU,  "Hz")
    field(PREC, "3")
    field(VAL,  "0.0")
    info(autosaveFields, "VAL")
}

record(calcout, "$(CAM):Proc1:MaxArrayRate_COUT")
{
    field(INPA, "$(CAM):Proc1:MaxArrayRate")
    field(CALC, "A=0?0:1.0/A")
    field(OUT,  "$(CAM):Proc1:MinCallbackTime PP")
}

record(calc, "$(CAM):Proc1:MaxArrayRate_RBV")
{
    field(INPA, "$(CAM):Proc1:MinCallbackTime_RBV CP")
    field(CALC, "A=0?0:1.0/A")
    field(EGU,  "Hz")
    field(PREC, "3")
    field(SCAN, "Passive")
}

record(ao, "$(CAM):Proc1:MaxByteRate")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))MAX_BYTE_RATE")
    field(EGU,  "s")
    field(PREC, "3")
    field(VAL,  "0.0")
    field(DRVL, "0")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):Proc1:MaxByteRate_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))MAX_BYTE_RATE")
    field(EGU,  "s")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the last execution time of the plugin     #
###################################################################
record(ai, "$(CAM):Proc1:ExecutionTime_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))EXECUTION_TIME")
    field(EGU,  "ms")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record requests that the plugin execute again with the    #
#  same NDArray                                                   #
###################################################################
record(bo, "$(CAM):Proc1:ProcessPlugin")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))PROCESS_PLUGIN")
    field(VAL,  "1")
}

###################################################################
#  These records control whether callbacks block or not           #
###################################################################
record(bo, "$(CAM):Proc1:BlockingCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))BLOCKING_CALLBACKS")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(VAL,  "0")
    info(autosaveFields, "DESC ZSV OSV VAL")
}

record(bi, "$(CAM):Proc1:BlockingCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))BLOCKING_CALLBACKS")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(ZSV,  "NO_ALARM")
    field(OSV,  "MINOR")
    field(SCAN, "I/O Intr")
    info( autosaveFields, "DESC ZSV OSV" )
}


record(longout, "$(CAM):Proc1:DroppedArrays")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))DROPPED_ARRAYS")
    field(VAL,  "0")
    info( autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV EGU" )
}

record(longin, "$(CAM):Proc1:DroppedArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))DROPPED_ARRAYS")
    field(SCAN, "I/O Intr")
    field(HIGH, "1")
    field(HSV,  "MINOR")
    info( autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV EGU" )
}

record(longout, "$(CAM):Proc1:QueueSize")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))QUEUE_SIZE")
    field(PINI, "YES")
    info( autosaveFields, "DESC EGU" )
}

record(longin, "$(CAM):Proc1:QueueSize_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))QUEUE_SIZE")
    field(FLNK, "$(CAM):Proc1:QueueFreeLow")
    field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):Proc1:QueueFreeLow") {
    field(CALC, "A*0.25")
    field(INPA, "$(CAM):Proc1:QueueSize")
    field(OUT,  "$(CAM):Proc1:QueueFree.LOW")
    field(FLNK, "$(CAM):Proc1:QueueUseHIGH")
}

# Set a HIGH warning level for the input queue fill level to 75%
# of the full size of the queue
record(calcout, "$(CAM):Proc1:QueueUseHIGH") {
   field(CALC, "A*0.75")
   field(INPA, "$(CAM):Proc1:QueueSize")
   field(OUT,  "$(CAM):Proc1:QueueUse.HIGH")
   field(FLNK, "$(CAM):Proc1:QueueUseHIHI")
}

# Set a HIHI level for the input queue fill level to indicate an error
# (MAJOR alarm)  when it fills up to the full size of the queue (frames start dropping)
record(calcout, "$(CAM):Proc1:QueueUseHIHI") {
   field(CALC, "A*1.0")
   field(INPA, "$(CAM):Proc1:QueueSize")
   field(OUT,  "$(CAM):Proc1:QueueUse.HIHI")
}

record(longin, "$(CAM):Proc1:QueueFree")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))QUEUE_FREE")
    field(LLSV, "MAJOR")
    field(LSV,  "MINOR")
    field(LOLO, "0")
    field(HYST, "1")
    field(SCAN, "I/O Intr")
}

# Display the fill level on the plugins input queue
record(calc, "$(CAM):Proc1:QueueUse") {
    field(CALC, "A-B")
    field(INPA, "$(CAM):Proc1:QueueSize")
    field(INPB, "$(CAM):Proc1:QueueFree CP")
    field(SCAN, "Passive")
    field(HHSV, "MAJOR")
    field(HSV,  "MINOR")
    field(HYST, "1")
}

record(longout, "$(CAM):Proc1:NumThreads")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))NUM_THREADS")
    field(VAL,  "1")
    field(PINI, "YES")
    info(autosaveFields, "DESC VAL")
}

record(longin, "$(CAM):Proc1:NumThreads_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))NUM_THREADS")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Proc1:MaxThreads_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))MAX_THREADS")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control output array sorting                     #
###################################################################
record(mbbo, "$(CAM):Proc1:SortMode") {
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))SORT_MODE")
    field(ZRVL, "0")
    field(ZRST, "Unsorted")
    field(ONVL, "1")
    field(ONST, "Sorted")
}

record(mbbi, "$(CAM):Proc1:SortMode_RBV") {
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))SORT_MODE")
    field(ZRVL, "0")
    field(ZRST, "Unsorted")
    field(ONVL, "1")
    field(ONST, "Sorted")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Proc1:SortTime") {
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))SORT_TIME")
    field(PREC, "3")
    field(VAL, "0.1")
}

record(ai, "$(CAM):Proc1:SortTime_RBV") {
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))SORT_TIME")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Proc1:SortSize")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))SORT_SIZE")
    field(VAL,  "20")
    field(PINI, "YES")
}

record(longin, "$(CAM):Proc1:SortSize_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))SORT_SIZE")
    field(FLNK, "$(CAM):Proc1:SortFreeLow")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Proc1:SortFree") {
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))SORT_FREE")
    field(LLSV, "MAJOR")
    field(LSV,  "MINOR")
    field(LOLO, "0")
    field(HYST, "1")
    field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):Proc1:SortFreeLow") {
    field(CALC, "A*0.25")
    field(INPA, "$(CAM):Proc1:SortSize")
    field(OUT,  "$(CAM):Proc1:SortFree.LOW")
}

record(longout, "$(CAM):Proc1:DroppedOutputArrays")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))DROPPED_OUTPUT_ARRAYS")
    field(VAL,  "0")
}

record(longin, "$(CAM):Proc1:DroppedOutputArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))DROPPED_OUTPUT_ARRAYS")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Proc1:DisorderedArrays")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))DISORDERED_ARRAYS")
    field(PINI, "YES")
}

record(longin, "$(CAM):Proc1:DisorderedArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))DISORDERED_ARRAYS")
    field(SCAN, "I/O Intr")
}



###################################################################
#  The asynRecord is used for mainly for trace mask               # 
###################################################################
 
# Set ASYN_TRACEIO_HEX bit by default
record(asyn,"$(CAM):Proc1:AsynIO")
{
    field(PORT, "Proc1")
    field(TIB2,"1")
    info("ADType", "ADPlugin")
}


###################################################################
#  These records control the data type of the array data          # 
#  The last entry is "Automatic" meaning preserve the data type   #
#  of the input array.                                            # 
###################################################################

record(mbbo, "$(CAM):Proc1:DataTypeOut")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))PROCESS_DATA_TYPE")
    field(ZRST, "Int8")
    field(ZRVL, "0")
    field(ONST, "UInt8")
    field(ONVL, "1")
    field(TWST, "Int16")
    field(TWVL, "2")
    field(THST, "UInt16")
    field(THVL, "3")
    field(FRST, "Int32")
    field(FRVL, "4")
    field(FVST, "UInt32")
    field(FVVL, "5")
    field(SXST, "Int64")
    field(SXVL, "6")
    field(SVST, "UInt64")
    field(SVVL, "7")
    field(EIST, "Float32")
    field(EIVL, "8")
    field(NIST, "Float64")
    field(NIVL, "9")
    field(TEST, "Automatic")
    field(TEVL, "-1")
    field(VAL,  "10")
    info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Proc1:DataTypeOut_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))PROCESS_DATA_TYPE")
    field(ZRST, "Int8")
    field(ZRVL, "0")
    field(ONST, "UInt8")
    field(ONVL, "1")
    field(TWST, "Int16")
    field(TWVL, "2")
    field(THST, "UInt16")
    field(THVL, "3")
    field(FRST, "Int32")
    field(FRVL, "4")
    field(FVST, "UInt32")
    field(FVVL, "5")
    field(SXST, "Int64")
    field(SXVL, "6")
    field(SVST, "UInt64")
    field(SVVL, "7")
    field(EIST, "Float32")
    field(EIVL, "8")
    field(NIST, "Float64")
    field(NIVL, "9")
    field(TEST, "Automatic")
    field(TEVL, "-1")
    field(SCAN, "I/O Intr")
}

###################################################################
# These records control the background array processing           #
###################################################################
record(bo, "$(CAM):Proc1:SaveBackground")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))SAVE_BACKGROUND")
    field(VAL,  "1")
    field(ZNAM, "No")
    field(ONAM, "Yes")
}

record(bi, "$(CAM):Proc1:SaveBackground_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))SAVE_BACKGROUND")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):Proc1:EnableBackground")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))ENABLE_BACKGROUND")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Proc1:EnableBackground_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))ENABLE_BACKGROUND")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    field(ZSV,  "NO_ALARM")
    field(OSV,  "MINOR")
    field(SCAN, "I/O Intr")
}

record(bi, "$(CAM):Proc1:ValidBackground_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))VALID_BACKGROUND")
    field(ZNAM, "Invalid")
    field(ONAM, "Valid")
    field(SCAN, "I/O Intr")
}

record(sseq, "$(CAM):Proc1:ReadBackgroundTIFFSeq")
{
    # Make a backup copy of the NDArrayPort field
    field(DOL1, "$(CAM):Proc1:NDArrayPort")
    field(LNK1, "$(CAM):Proc1:PortBackup PP MS")
    # Set the NDArrayPort field to the TIFF plugin
    field(DOL2, "$(CAM):Proc1:TIFF:PortName_RBV")
    field(LNK2, "$(CAM):Proc1:NDArrayPort PP MS")
    # Enable array callbacks in the TIFF plugin
    field(STR3, "Enable")
    field(LNK3, "$(CAM):Proc1:TIFF:ArrayCallbacks PP MS")
    # Read the TIFF file
    field(DLY4, "0.1")
    field(DO4, "1")
    field(LNK4, "$(CAM):Proc1:TIFF:ReadFile PP MS")
    # Save background TIFF
    field(DLY5, "0.5")
    field(DO5, "1")
    field(LNK5, "$(CAM):Proc1:SaveBackground PP MS")
    # Restore the NDArrayPort field
    field(DOL6, "$(CAM):Proc1:PortBackup")
    field(LNK6, "$(CAM):Proc1:NDArrayPort PP MS")
}

record(stringout, "$(CAM):Proc1:PortBackup")
{
}

###################################################################
# These records control the flat field array processing           #
###################################################################
record(bo, "$(CAM):Proc1:SaveFlatField")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))SAVE_FLAT_FIELD")
    field(VAL,  "1")
    field(ZNAM, "No")
    field(ONAM, "Yes")
}

record(bi, "$(CAM):Proc1:SaveFlatField_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))SAVE_FLAT_FIELD")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):Proc1:EnableFlatField")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))ENABLE_FLAT_FIELD")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Proc1:EnableFlatField_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))ENABLE_FLAT_FIELD")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    field(ZSV,  "NO_ALARM")
    field(OSV,  "MINOR")
    field(SCAN, "I/O Intr")
}

record(bi, "$(CAM):Proc1:ValidFlatField_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))VALID_FLAT_FIELD")
    field(ZNAM, "Invalid")
    field(ONAM, "Valid")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Proc1:ScaleFlatField")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))SCALE_FLAT_FIELD")
    field(VAL,  "255.")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):Proc1:ScaleFlatField_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))SCALE_FLAT_FIELD")
    field(SCAN, "I/O Intr")
}

record(sseq, "$(CAM):Proc1:ReadFlatFieldTIFFSeq")
{
    # Make a backup copy of the NDArrayPort field
    field(DOL1, "$(CAM):Proc1:NDArrayPort")
    field(LNK1, "$(CAM):Proc1:PortBackup PP MS")
    # Set the NDArrayPort field to the TIFF plugin
    field(DOL2, "$(CAM):Proc1:TIFF:PortName_RBV")
    field(LNK2, "$(CAM):Proc1:NDArrayPort PP MS")
    # Enable array callbacks in the TIFF plugin
    field(STR3, "Enable")
    field(LNK3, "$(CAM):Proc1:TIFF:ArrayCallbacks PP MS")
    # Read the TIFF file
    field(DLY4, "0.1")
    field(DO4, "1")
    field(LNK4, "$(CAM):Proc1:TIFF:ReadFile PP MS")
    # Save background TIFF
    field(DLY5, "0.5")
    field(DO5, "1")
    field(LNK5, "$(CAM):Proc1:SaveFlatField PP MS")
    # Restore the NDArrayPort field
    field(DOL6, "$(CAM):Proc1:PortBackup")
    field(LNK6, "$(CAM):Proc1:NDArrayPort PP MS")
}

###################################################################
# These records control the offset and scale                      #
###################################################################
record(bo, "$(CAM):Proc1:EnableOffsetScale")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))ENABLE_OFFSET_SCALE")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    info(autosaveFields, "VAL")
}

# Oneshot record for calculating scale and offset
record(busy, "$(CAM):Proc1:AutoOffsetScale")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))AUTO_OFFSET_SCALE")
    field(ZNAM, "Done")
    field(ONAM, "Calculating")
}

record(bi, "$(CAM):Proc1:EnableOffsetScale_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))ENABLE_OFFSET_SCALE")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    field(ZSV,  "NO_ALARM")
    field(OSV,  "MINOR")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Proc1:Offset")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))OFFSET")
    field(PREC, "2")
    field(VAL,  "0.0")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):Proc1:Offset_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))OFFSET")
    field(PREC, "2")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Proc1:Scale")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))SCALE")
    field(PREC, "2")
    field(VAL,  "1.0")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):Proc1:Scale_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))SCALE")
    field(PREC, "2")
    field(SCAN, "I/O Intr")
}

###################################################################
# These records control the high and low clipping                 #
###################################################################
record(bo, "$(CAM):Proc1:EnableLowClip")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))ENABLE_LOW_CLIP")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Proc1:EnableLowClip_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))ENABLE_LOW_CLIP")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    field(ZSV,  "NO_ALARM")
    field(OSV,  "MINOR")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Proc1:LowClip")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))LOW_CLIP")
    field(VAL,  "0.0")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):Proc1:LowClip_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))LOW_CLIP")
    field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):Proc1:EnableHighClip")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))ENABLE_HIGH_CLIP")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Proc1:EnableHighClip_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))ENABLE_HIGH_CLIP")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    field(ZSV,  "NO_ALARM")
    field(OSV,  "MINOR")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Proc1:HighClip")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))HIGH_CLIP")
    field(VAL,  "100.0")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):Proc1:HighClip_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))HIGH_CLIP")
    field(SCAN, "I/O Intr")
}

###################################################################
# These records control frame filtering                           #
###################################################################
record(bo, "$(CAM):Proc1:EnableFilter")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))ENABLE_FILTER")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Proc1:EnableFilter_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))ENABLE_FILTER")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    field(ZSV,  "NO_ALARM")
    field(OSV,  "MINOR")
    field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):Proc1:ResetFilter")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))RESET_FILTER")
    field(VAL,  "1")
    field(ZNAM, "No")
    field(ONAM, "Yes")
}

record(bi, "$(CAM):Proc1:ResetFilter_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))RESET_FILTER")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):Proc1:AutoResetFilter")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))AUTO_RESET_FILTER")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Proc1:AutoResetFilter_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))AUTO_RESET_FILTER")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):Proc1:FilterCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))FILTER_CALLBACKS")
    field(ZNAM, "Every array")
    field(ONAM, "Array N only")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Proc1:FilterCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))FILTER_CALLBACKS")
    field(ZNAM, "Every array")
    field(ONAM, "Array N only")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Proc1:NumFilter")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))NUM_FILTER")
    field(VAL,  "1")
    field(FLNK, "$(CAM):Proc1:NumFilterRecip.PROC PP")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Proc1:NumFilter_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))NUM_FILTER")
    field(SCAN, "I/O Intr")
}

# This is 1/NumFilter, used in RecursiveSum filter
# If this value changes we need to process FilterType to make it update filter coefficients
record(calc, "$(CAM):Proc1:NumFilterRecip")
{
    field(INPA, "$(CAM):Proc1:NumFilter.VAL NPP")
    field(CALC, "1./A")
    field(FLNK, "$(CAM):Proc1:FilterType.PROC PP")
}

record(longin, "$(CAM):Proc1:NumFiltered_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))NUM_FILTERED")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Proc1:OOffset")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))FILTER_OOFFSET")
    field(VAL,  "0.0")
    field(PREC, "2")
    info(autosaveFields, "VAL")
}
record(ai, "$(CAM):Proc1:OOffset_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))FILTER_OOFFSET")
    field(PREC,  "2")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Proc1:OScale")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))FILTER_OSCALE")
    field(VAL,  "1.0")
    field(PREC, "2")
    info(autosaveFields, "VAL")
}
record(ai, "$(CAM):Proc1:OScale_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))FILTER_OSCALE")
    field(PREC,  "2")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Proc1:OC1")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))FILTER_OC1")
    field(VAL,  "1.0")
    field(PREC, "2")
    info(autosaveFields, "VAL")
}
record(ai, "$(CAM):Proc1:OC1_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))FILTER_OC1")
    field(PREC,  "2")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Proc1:OC2")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))FILTER_OC2")
    field(VAL,  "-1.0")
    field(PREC, "2")
    info(autosaveFields, "VAL")
}
record(ai, "$(CAM):Proc1:OC2_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))FILTER_OC2")
    field(PREC,  "2")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Proc1:OC3")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))FILTER_OC3")
    field(VAL,  "0.0")
    field(PREC, "2")
    info(autosaveFields, "VAL")
}
record(ai, "$(CAM):Proc1:OC3_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))FILTER_OC3")
    field(PREC,  "2")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Proc1:OC4")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))FILTER_OC4")
    field(VAL,  "1.0")
    field(PREC, "2")
    info(autosaveFields, "VAL")
}
record(ai, "$(CAM):Proc1:OC4_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))FILTER_OC4")
    field(PREC,  "2")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Proc1:FOffset")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))FILTER_FOFFSET")
    field(VAL,  "0.0")
    field(PREC, "2")
    info(autosaveFields, "VAL")
}
record(ai, "$(CAM):Proc1:FOffset_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))FILTER_FOFFSET")
    field(PREC,  "2")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Proc1:FScale")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))FILTER_FSCALE")
    field(VAL,  "1.0")
    field(PREC, "2")
    info(autosaveFields, "VAL")
}
record(ai, "$(CAM):Proc1:FScale_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))FILTER_FSCALE")
    field(PREC,  "2")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Proc1:FC1")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))FILTER_FC1")
    field(VAL,  "1.0")
    field(PREC, "2")
    info(autosaveFields, "VAL")
}
record(ai, "$(CAM):Proc1:FC1_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))FILTER_FC1")
    field(PREC,  "2")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Proc1:FC2")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))FILTER_FC2")
    field(VAL,  "-1.0")
    field(PREC, "2")
    info(autosaveFields, "VAL")
}
record(ai, "$(CAM):Proc1:FC2_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))FILTER_FC2")
    field(PREC,  "2")
    field(SCAN, "I/O Intr")
}
record(ao, "$(CAM):Proc1:FC3")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))FILTER_FC3")
    field(VAL,  "0.0")
    field(PREC, "2")
    info(autosaveFields, "VAL")
}
record(ai, "$(CAM):Proc1:FC3_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))FILTER_FC3")
    field(PREC,  "2")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Proc1:FC4")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))FILTER_FC4")
    field(VAL,  "1.0")
    field(PREC, "2")
    info(autosaveFields, "VAL")
}
record(ai, "$(CAM):Proc1:FC4_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))FILTER_FC4")
    field(PREC,  "2")
    field(SCAN, "I/O Intr")
}
record(ao, "$(CAM):Proc1:ROffset")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))FILTER_ROFFSET")
    field(VAL,  "0.0")
    field(PREC, "2")
    info(autosaveFields, "VAL")
}
record(ai, "$(CAM):Proc1:ROffset_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))FILTER_ROFFSET")
    field(PREC,  "2")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Proc1:RC1")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))FILTER_RC1")
    field(VAL,  "1.0")
    field(PREC, "2")
    info(autosaveFields, "VAL")
}
record(ai, "$(CAM):Proc1:RC1_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))FILTER_RC1")
    field(PREC,  "2")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Proc1:RC2")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))FILTER_RC2")
    field(VAL,  "1.0")
    field(PREC, "2")
    info(autosaveFields, "VAL")
}
record(ai, "$(CAM):Proc1:RC2_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Proc1,$(ADDR=0),$(TIMEOUT=1))FILTER_RC2")
    field(PREC,  "2")
    field(SCAN, "I/O Intr")
}

# We don't see PINI=YES for FilterType because we want to restore the actual coefficients
# We do restore this record, but we don't process it
record(mbbo, "$(CAM):Proc1:FilterType")
{
    field(ZRST, "RecursiveAve")
    field(ZRVL, "1")
    field(ONST, "Average")
    field(ONVL, "2")
    field(TWST, "Sum")
    field(TWVL, "3")
    field(THST, "Difference")
    field(THVL, "4")
    field(FRST, "RecursiveAveDiff")
    field(FRVL, "5")
    field(FVST, "CopyToFilter")
    field(FVVL, "6")
    field(FLNK, "$(CAM):Proc1:FilterTypeSeq PP MS")
    info(autosaveFields, "VAL")
}

record(seq, "$(CAM):Proc1:FilterTypeSeq")
{
    field(SELL, "$(CAM):Proc1:FilterType.RVAL NPP")
    field(SELM, "Specified")
    field(DOL1, "1")
    field(LNK1, "$(CAM):Proc1:RecursiveAveSeq.PROC PP MS")
    field(DOL2, "1")
    field(LNK2, "$(CAM):Proc1:AverageSeq.PROC PP MS")
    field(DOL3, "1")
    field(LNK3, "$(CAM):Proc1:SumSeq.PROC PP MS")
    field(DOL4, "1")
    field(LNK4, "$(CAM):Proc1:DifferenceSeq.PROC PP MS")
    field(DOL5, "1")
    field(LNK5, "$(CAM):Proc1:RecursiveAveDiffSeq.PROC PP MS")
    field(DOL6, "1")
    field(LNK6, "$(CAM):Proc1:CopyToFilterSeq.PROC PP MS")
}

record(seq, "$(CAM):Proc1:RecursiveAveSeq")
{
    field(DOL1, "1")
    field(LNK1, "$(CAM):Proc1:OC1 PP MS")
    field(DOL2, "-1")
    field(LNK2, "$(CAM):Proc1:OC2 PP MS")
    field(DOL3, "0")
    field(LNK3, "$(CAM):Proc1:OC3 PP MS")
    field(DOL4, "1")
    field(LNK4, "$(CAM):Proc1:OC4 PP MS")
    field(DOL5, "1")
    field(LNK5, "$(CAM):Proc1:FC1 PP MS")
    field(DOL6, "-1")
    field(LNK6, "$(CAM):Proc1:FC2 PP MS")
    field(DOL7, "0")
    field(LNK7, "$(CAM):Proc1:FC3 PP MS")
    field(DOL8, "1")
    field(LNK8, "$(CAM):Proc1:FC4 PP MS")
    field(DOL9, "0")
    field(LNK9, "$(CAM):Proc1:RC1 PP MS")
    field(DOLA, "1")
    field(LNKA, "$(CAM):Proc1:RC2 PP MS")
}

record(seq, "$(CAM):Proc1:AverageSeq")
{
    field(DOL1, "1")
    field(LNK1, "$(CAM):Proc1:OC1 PP MS")
    field(DOL2, "0")
    field(LNK2, "$(CAM):Proc1:OC2 PP MS")
    field(DOL3, "$(CAM):Proc1:NumFilterRecip NPP")
    field(LNK3, "$(CAM):Proc1:OC3 PP MS")
    field(DOL4, "0")
    field(LNK4, "$(CAM):Proc1:OC4 PP MS")
    field(DOL5, "1")
    field(LNK5, "$(CAM):Proc1:FC1 PP MS")
    field(DOL6, "0")
    field(LNK6, "$(CAM):Proc1:FC2 PP MS")
    field(DOL7, "$(CAM):Proc1:NumFilterRecip NPP")
    field(LNK7, "$(CAM):Proc1:FC3 PP MS")
    field(DOL8, "0")
    field(LNK8, "$(CAM):Proc1:FC4 PP MS")
    field(DOL9, "0")
    field(LNK9, "$(CAM):Proc1:RC1 PP MS")
    field(DOLA, "0")
    field(LNKA, "$(CAM):Proc1:RC2 PP MS")
}

record(seq, "$(CAM):Proc1:SumSeq")
{
    field(DOL1, "1")
    field(LNK1, "$(CAM):Proc1:OC1 PP MS")
    field(DOL2, "0")
    field(LNK2, "$(CAM):Proc1:OC2 PP MS")
    field(DOL3, "1")
    field(LNK3, "$(CAM):Proc1:OC3 PP MS")
    field(DOL4, "0")
    field(LNK4, "$(CAM):Proc1:OC4 PP MS")
    field(DOL5, "1")
    field(LNK5, "$(CAM):Proc1:FC1 PP MS")
    field(DOL6, "0")
    field(LNK6, "$(CAM):Proc1:FC2 PP MS")
    field(DOL7, "1")
    field(LNK7, "$(CAM):Proc1:FC3 PP MS")
    field(DOL8, "0")
    field(LNK8, "$(CAM):Proc1:FC4 PP MS")
    field(DOL9, "0")
    field(LNK9, "$(CAM):Proc1:RC1 PP MS")
    field(DOLA, "0")
    field(LNKA, "$(CAM):Proc1:RC2 PP MS")
}

record(seq, "$(CAM):Proc1:DifferenceSeq")
{
    field(DOL1, "-1")
    field(LNK1, "$(CAM):Proc1:OC1 PP MS")
    field(DOL2, "0")
    field(LNK2, "$(CAM):Proc1:OC2 PP MS")
    field(DOL3, "1")
    field(LNK3, "$(CAM):Proc1:OC3 PP MS")
    field(DOL4, "0")
    field(LNK4, "$(CAM):Proc1:OC4 PP MS")
    field(DOL5, "0")
    field(LNK5, "$(CAM):Proc1:FC1 PP MS")
    field(DOL6, "0")
    field(LNK6, "$(CAM):Proc1:FC2 PP MS")
    field(DOL7, "1")
    field(LNK7, "$(CAM):Proc1:FC3 PP MS")
    field(DOL8, "0")
    field(LNK8, "$(CAM):Proc1:FC4 PP MS")
    field(DOL9, "0")
    field(LNK9, "$(CAM):Proc1:RC1 PP MS")
    field(DOLA, "1")
    field(LNKA, "$(CAM):Proc1:RC2 PP MS")
}

record(seq, "$(CAM):Proc1:RecursiveAveDiffSeq")
{
    field(DOL1, "-1")
    field(LNK1, "$(CAM):Proc1:OC1 PP MS")
    field(DOL2, "0")
    field(LNK2, "$(CAM):Proc1:OC2 PP MS")
    field(DOL3, "1")
    field(LNK3, "$(CAM):Proc1:OC3 PP MS")
    field(DOL4, "0")
    field(LNK4, "$(CAM):Proc1:OC4 PP MS")
    field(DOL5, "1")
    field(LNK5, "$(CAM):Proc1:FC1 PP MS")
    field(DOL6, "-1")
    field(LNK6, "$(CAM):Proc1:FC2 PP MS")
    field(DOL7, "0")
    field(LNK7, "$(CAM):Proc1:FC3 PP MS")
    field(DOL8, "1")
    field(LNK8, "$(CAM):Proc1:FC4 PP MS")
    field(DOL9, "0")
    field(LNK9, "$(CAM):Proc1:RC1 PP MS")
    field(DOLA, "1")
    field(LNKA, "$(CAM):Proc1:RC2 PP MS")
}

record(seq, "$(CAM):Proc1:CopyToFilterSeq")
{
    field(DOL1, "0")
    field(LNK1, "$(CAM):Proc1:OC1 PP MS")
    field(DOL2, "0")
    field(LNK2, "$(CAM):Proc1:OC2 PP MS")
    field(DOL3, "1")
    field(LNK3, "$(CAM):Proc1:OC3 PP MS")
    field(DOL4, "0")
    field(LNK4, "$(CAM):Proc1:OC4 PP MS")
    field(DOL5, "0")
    field(LNK5, "$(CAM):Proc1:FC1 PP MS")
    field(DOL6, "0")
    field(LNK6, "$(CAM):Proc1:FC2 PP MS")
    field(DOL7, "1")
    field(LNK7, "$(CAM):Proc1:FC3 PP MS")
    field(DOL8, "0")
    field(LNK8, "$(CAM):Proc1:FC4 PP MS")
    field(DOL9, "0")
    field(LNK9, "$(CAM):Proc1:RC1 PP MS")
    field(DOLA, "1")
    field(LNKA, "$(CAM):Proc1:RC2 PP MS")
}
#=================================================================#
# Template file: NDROI.template
# Database for ND ROIs
# Mark Rivers
# April 22, 2008

#=================================================================#
# Template file: NDPluginBase.template
# Database for NDPluginBase, i.e. records common to all plugins
# Mark Rivers
# April 25, 2008

#=================================================================#
# Template file: NDArrayBase.template
# Database for area detector control using asyn driver and standard asyn device support
# Mark Rivers
# March 9, 2008

###################################################################
#  This record contains the version of ADCore                     #
###################################################################

record(stringin, "$(CAM):ROI1:ADCoreVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))ADCORE_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the version of the driver or plugin       #
###################################################################

record(stringin, "$(CAM):ROI1:DriverVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))DRIVER_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the asyn port name of this detector       #
###################################################################

record(stringin, "$(CAM):ROI1:PortName_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))PORT_NAME_SELF")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records contain basic information about the detector     # 
###################################################################

record(stringin, "$(CAM):ROI1:Manufacturer_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))MANUFACTURER")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):ROI1:Model_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))MODEL")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):ROI1:SerialNumber_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))SERIAL_NUMBER")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):ROI1:SDKVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))SDK_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):ROI1:FirmwareVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))FIRMWARE_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control acquisition start and stop               #
###################################################################

record(bo, "$(CAM):ROI1:Acquire") {
   field(DTYP, "asynInt32")
   field(OUT, "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))ACQUIRE")
   field(ZNAM, "Done")
   field(ONAM, "Acquire")
   field(VAL,  "0")
   field(FLNK, "$(CAM):ROI1:SetAcquireBusy")
   info(asyn:READBACK, "1")
}

record(bi, "$(CAM):ROI1:Acquire_RBV") {
   field(DTYP, "asynInt32")
   field(INP, "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))ACQUIRE")
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):ROI1:SetAcquireBusy")
{
    field(INPA, "$(CAM):ROI1:Acquire NPP")
    field(CALC, "A")
    field(OOPT, "Transition To Non-zero")
    field(OUT,  "$(CAM):ROI1:AcquireBusy PP")
}

record(busy, "$(CAM):ROI1:AcquireBusy") {
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(VAL,  "0")
}

record(bi, "$(CAM):ROI1:AcquireBusyCB") {
   field(DTYP, "asynInt32")
   field(INP, "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))ACQUIRE_BUSY")
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):ROI1:ClearAcquireBusy") {
    field(INPA, "$(CAM):ROI1:AcquireBusyCB CP")
    field(CALC, "A")
    field(OOPT, "Transition To Zero")
    field(OUT,  "$(CAM):ROI1:AcquireBusy PP")
}

record(bo, "$(CAM):ROI1:WaitForPlugins") {
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT, "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))WAIT_FOR_PLUGINS")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(VAL,  "0")
}

###################################################################
#  These records are the array size and data type                 #
###################################################################
# The number of dimensions
record(longout, "$(CAM):ROI1:NDimensions")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))ARRAY_NDIMENSIONS")
}

record(longin, "$(CAM):ROI1:NDimensions_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))ARRAY_NDIMENSIONS")
    field(SCAN, "I/O Intr")
}

# The array dimensions waveform records
record(waveform, "$(CAM):ROI1:Dimensions")
{
    field(DTYP, "asynInt32ArrayOut")
    field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))ARRAY_DIMENSIONS")
    field(FTVL, "LONG")
    field(NELM, "10")
    field(FLNK, "$(CAM):ROI1:Dim0SA")
}

record(subArray, "$(CAM):ROI1:Dim0SA")
{
    field(INP,  "$(CAM):ROI1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "0")
    field(FLNK, "$(CAM):ROI1:ArraySize0")
}

record(longin, "$(CAM):ROI1:ArraySize0")
{
    field(INP,  "$(CAM):ROI1:Dim0SA")
    field(FLNK, "$(CAM):ROI1:Dim1SA")
}

record(subArray, "$(CAM):ROI1:Dim1SA")
{
    field(INP,  "$(CAM):ROI1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "1")
    field(FLNK, "$(CAM):ROI1:ArraySize1")
}

record(longin, "$(CAM):ROI1:ArraySize1")
{
    field(INP,  "$(CAM):ROI1:Dim1SA")
    field(FLNK, "$(CAM):ROI1:Dim2SA")
}

record(subArray, "$(CAM):ROI1:Dim2SA")
{
    field(INP,  "$(CAM):ROI1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "2")
    field(FLNK, "$(CAM):ROI1:ArraySize2")
}

record(longin, "$(CAM):ROI1:ArraySize2")
{
    field(INP,  "$(CAM):ROI1:Dim2SA")
    field(FLNK, "$(CAM):ROI1:Dim3SA")
}

record(subArray, "$(CAM):ROI1:Dim3SA")
{
    field(INP,  "$(CAM):ROI1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "3")
    field(FLNK, "$(CAM):ROI1:ArraySize3")
}

record(longin, "$(CAM):ROI1:ArraySize3")
{
    field(INP,  "$(CAM):ROI1:Dim3SA")
    field(FLNK, "$(CAM):ROI1:Dim4SA")
}

record(subArray, "$(CAM):ROI1:Dim4SA")
{
    field(INP,  "$(CAM):ROI1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "4")
    field(FLNK, "$(CAM):ROI1:ArraySize4")
}

record(longin, "$(CAM):ROI1:ArraySize4")
{
    field(INP,  "$(CAM):ROI1:Dim4SA")
    field(FLNK, "$(CAM):ROI1:Dim5SA")
}

record(subArray, "$(CAM):ROI1:Dim5SA")
{
    field(INP,  "$(CAM):ROI1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "5")
    field(FLNK, "$(CAM):ROI1:ArraySize5")
}

record(longin, "$(CAM):ROI1:ArraySize5")
{
    field(INP,  "$(CAM):ROI1:Dim5SA")
    field(FLNK, "$(CAM):ROI1:Dim6SA")
}

record(subArray, "$(CAM):ROI1:Dim6SA")
{
    field(INP,  "$(CAM):ROI1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "6")
    field(FLNK, "$(CAM):ROI1:ArraySize6")
}

record(longin, "$(CAM):ROI1:ArraySize6")
{
    field(INP,  "$(CAM):ROI1:Dim6SA")
    field(FLNK, "$(CAM):ROI1:Dim7SA")
}

record(subArray, "$(CAM):ROI1:Dim7SA")
{
    field(INP,  "$(CAM):ROI1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "7")
    field(FLNK, "$(CAM):ROI1:ArraySize7")
}

record(longin, "$(CAM):ROI1:ArraySize7")
{
    field(INP,  "$(CAM):ROI1:Dim7SA")
    field(FLNK, "$(CAM):ROI1:Dim8SA")
}

record(subArray, "$(CAM):ROI1:Dim8SA")
{
    field(INP,  "$(CAM):ROI1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "8")
    field(FLNK, "$(CAM):ROI1:ArraySize8")
}

record(longin, "$(CAM):ROI1:ArraySize8")
{
    field(INP,  "$(CAM):ROI1:Dim8SA")
    field(FLNK, "$(CAM):ROI1:Dim9SA")
}

record(subArray, "$(CAM):ROI1:Dim9SA")
{
    field(INP,  "$(CAM):ROI1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "9")
    field(FLNK, "$(CAM):ROI1:ArraySize9")
}

record(longin, "$(CAM):ROI1:ArraySize9")
{
    field(INP,  "$(CAM):ROI1:Dim9SA")
}


record(waveform, "$(CAM):ROI1:Dimensions_RBV")
{
    field(DTYP, "asynInt32ArrayIn")
    field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))ARRAY_DIMENSIONS")
    field(FTVL, "LONG")
    field(NELM, "10")
    field(FLNK, "$(CAM):ROI1:Dim0SA_RBV")
    field(SCAN, "I/O Intr")
}

record(subArray, "$(CAM):ROI1:Dim0SA_RBV")
{
    field(INP,  "$(CAM):ROI1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "0")
    field(FLNK, "$(CAM):ROI1:ArraySize0_RBV")
}

record(longin, "$(CAM):ROI1:ArraySize0_RBV")
{
    field(INP,  "$(CAM):ROI1:Dim0SA_RBV")
    field(FLNK, "$(CAM):ROI1:Dim1SA_RBV")
}

record(subArray, "$(CAM):ROI1:Dim1SA_RBV")
{
    field(INP,  "$(CAM):ROI1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "1")
    field(FLNK, "$(CAM):ROI1:ArraySize1_RBV")
}

record(longin, "$(CAM):ROI1:ArraySize1_RBV")
{
    field(INP,  "$(CAM):ROI1:Dim1SA_RBV")
    field(FLNK, "$(CAM):ROI1:Dim2SA_RBV")
}

record(subArray, "$(CAM):ROI1:Dim2SA_RBV")
{
    field(INP,  "$(CAM):ROI1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "2")
    field(FLNK, "$(CAM):ROI1:ArraySize2_RBV")
}

record(longin, "$(CAM):ROI1:ArraySize2_RBV")
{
    field(INP,  "$(CAM):ROI1:Dim2SA_RBV")
    field(FLNK, "$(CAM):ROI1:Dim3SA_RBV")
}

record(subArray, "$(CAM):ROI1:Dim3SA_RBV")
{
    field(INP,  "$(CAM):ROI1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "3")
    field(FLNK, "$(CAM):ROI1:ArraySize3_RBV")
}

record(longin, "$(CAM):ROI1:ArraySize3_RBV")
{
    field(INP,  "$(CAM):ROI1:Dim3SA_RBV")
    field(FLNK, "$(CAM):ROI1:Dim4SA_RBV")
}

record(subArray, "$(CAM):ROI1:Dim4SA_RBV")
{
    field(INP,  "$(CAM):ROI1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "4")
    field(FLNK, "$(CAM):ROI1:ArraySize4_RBV")
}

record(longin, "$(CAM):ROI1:ArraySize4_RBV")
{
    field(INP,  "$(CAM):ROI1:Dim4SA_RBV")
    field(FLNK, "$(CAM):ROI1:Dim5SA_RBV")
}

record(subArray, "$(CAM):ROI1:Dim5SA_RBV")
{
    field(INP,  "$(CAM):ROI1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "5")
    field(FLNK, "$(CAM):ROI1:ArraySize5_RBV")
}

record(longin, "$(CAM):ROI1:ArraySize5_RBV")
{
    field(INP,  "$(CAM):ROI1:Dim5SA_RBV")
    field(FLNK, "$(CAM):ROI1:Dim6SA_RBV")
}

record(subArray, "$(CAM):ROI1:Dim6SA_RBV")
{
    field(INP,  "$(CAM):ROI1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "6")
    field(FLNK, "$(CAM):ROI1:ArraySize6_RBV")
}

record(longin, "$(CAM):ROI1:ArraySize6_RBV")
{
    field(INP,  "$(CAM):ROI1:Dim6SA_RBV")
    field(FLNK, "$(CAM):ROI1:Dim7SA_RBV")
}

record(subArray, "$(CAM):ROI1:Dim7SA_RBV")
{
    field(INP,  "$(CAM):ROI1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "7")
    field(FLNK, "$(CAM):ROI1:ArraySize7_RBV")
}

record(longin, "$(CAM):ROI1:ArraySize7_RBV")
{
    field(INP,  "$(CAM):ROI1:Dim7SA_RBV")
    field(FLNK, "$(CAM):ROI1:Dim8SA_RBV")
}

record(subArray, "$(CAM):ROI1:Dim8SA_RBV")
{
    field(INP,  "$(CAM):ROI1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "8")
    field(FLNK, "$(CAM):ROI1:ArraySize8_RBV")
}

record(longin, "$(CAM):ROI1:ArraySize8_RBV")
{
    field(INP,  "$(CAM):ROI1:Dim8SA_RBV")
    field(FLNK, "$(CAM):ROI1:Dim9SA_RBV")
}

record(subArray, "$(CAM):ROI1:Dim9SA_RBV")
{
    field(INP,  "$(CAM):ROI1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "9")
    field(FLNK, "$(CAM):ROI1:ArraySize9_RBV")
}

record(longin, "$(CAM):ROI1:ArraySize9_RBV")
{
    field(INP,  "$(CAM):ROI1:Dim9SA_RBV")
}


record(mbbi, "$(CAM):ROI1:BayerPattern_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))BAYER_PATTERN")
   field(ZRST, "RGGB")
   field(ZRVL, "0")
   field(ONST, "GBRG")
   field(ONVL, "1")
   field(TWST, "GRBG")
   field(TWVL, "2")
   field(THST, "BGGR")
   field(THVL, "3")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI1:ArraySizeX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_X")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI1:ArraySizeY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_Y")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI1:ArraySizeZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_Z")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI1:ArraySize_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records have information on the compression              # 
###################################################################
record(stringin, "$(CAM):ROI1:Codec_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))CODEC")
   field(VAL,  "")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI1:CompressedSize_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))COMPRESSED_SIZE")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the data type                            # 
###################################################################

record(mbbo, "$(CAM):ROI1:DataType")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))DATA_TYPE")
   field(ZRST, "Int8")
   field(ZRVL, "0")
   field(ONST, "UInt8")
   field(ONVL, "1")
   field(TWST, "Int16")
   field(TWVL, "2")
   field(THST, "UInt16")
   field(THVL, "3")
   field(FRST, "Int32")
   field(FRVL, "4")
   field(FVST, "UInt32")
   field(FVVL, "5")
   field(SXST, "Int64")
   field(SXVL, "6")
   field(SVST, "UInt64")
   field(SVVL, "7")
   field(EIST, "Float32")
   field(EIVL, "8")
   field(NIST, "Float64")
   field(NIVL, "9")
   field(VAL,  "0")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):ROI1:DataType_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))DATA_TYPE")
   field(ZRST, "Int8")
   field(ZRVL, "0")
   field(ONST, "UInt8")
   field(ONVL, "1")
   field(TWST, "Int16")
   field(TWVL, "2")
   field(THST, "UInt16")
   field(THVL, "3")
   field(FRST, "Int32")
   field(FRVL, "4")
   field(FVST, "UInt32")
   field(FVVL, "5")
   field(SXST, "Int64")
   field(SXVL, "6")
   field(SVST, "UInt64")
   field(SVVL, "7")
   field(EIST, "Float32")
   field(EIVL, "8")
   field(NIST, "Float64")
   field(NIVL, "9")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI1:BitsPerPixel_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))BITS_PER_PIXEL")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the color mode                           #
#  These choices must agree with NDColorMode_t in NDArray.h       # 
###################################################################

record(mbbo, "$(CAM):ROI1:ColorMode")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))COLOR_MODE")
   field(ZRST, "Mono")
   field(ZRVL, "0")
   field(ONST, "Bayer")
   field(ONVL, "1")
   field(TWST, "RGB1")
   field(TWVL, "2")
   field(THST, "RGB2")
   field(THVL, "3")
   field(FRST, "RGB3")
   field(FRVL, "4")
   field(FVST, "YUV444")
   field(FVVL, "5")
   field(SXST, "YUV422")
   field(SXVL, "6")
   field(SVST, "YUV421")
   field(SVVL, "7")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):ROI1:ColorMode_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))COLOR_MODE")
   field(ZRST, "Mono")
   field(ZRVL, "0")
   field(ONST, "Bayer")
   field(ONVL, "1")
   field(TWST, "RGB1")
   field(TWVL, "2")
   field(THST, "RGB2")
   field(THVL, "3")
   field(FRST, "RGB3")
   field(FRVL, "4")
   field(FVST, "YUV444")
   field(FVVL, "5")
   field(SXST, "YUV422")
   field(SXVL, "6")
   field(SVST, "YUV421")
   field(SVVL, "7")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records are the uniqueId and time stamps of the array     #
###################################################################
record(longin, "$(CAM):ROI1:UniqueId_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))UNIQUE_ID")
    field(SCAN, "I/O Intr")
}

record(ai, "$(CAM):ROI1:TimeStamp_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))TIME_STAMP")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI1:EpicsTSSec_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))EPICS_TS_SEC")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI1:EpicsTSNsec_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))EPICS_TS_NSEC")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records provide statistics on array callbacks and        #
#  array callback rates                                           # 
###################################################################
record(longout, "$(CAM):ROI1:ArrayCounter")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))ARRAY_COUNTER")
}

record(longin, "$(CAM):ROI1:ArrayCounter_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))ARRAY_COUNTER")
    field(SCAN, "I/O Intr")
    field(TSE,  "-2")
    field(LOW,  "0" )
    field(LSV,  "MINOR" )
    info(autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV TSE")
}

# Updated rate calculation to use a smoothing factor w/ guard against negative values
# 0 rate sets alarm state to MINOR
record(calc, "$(CAM):ROI1:ArrayRate_RBV")
{
    field(INPA, "$(CAM):ROI1:ArrayRate_RBV.LB NPP NMS")   # Previous counter (Last B value)
    field(INPB, "$(CAM):ROI1:ArrayCounter_RBV NPP NMS")   # Current counter value
    field(INPC, "1.0")                                # Delta time in seconds
    field(INPD, "$(CAM):ROI1:ArrayRate_RBV.VAL NPP NMS")  # Previous rate
    field(INPE, "0.0")                 # Smoothing factor
    field(CALC, "(D*E)/C+MAX(0,B-A)*(1-E)/C")
    field(PREC, "2" )
    field(EGU,  "Hz" )
    field(SCAN, "1 second")
    field(LOW,  "0")
    field(LSV,  "MINOR")
    field(ADEL, "0.1")
    info(autosaveFields, "ADEL DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV MDEL PREC C E SCAN EGU")
}

###################################################################
#  These records control NDArray callacks                         # 
###################################################################
record(bo, "$(CAM):ROI1:ArrayCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))ARRAY_CALLBACKS")
    field(ZNAM, "Disable")
    field(ZSV,  "MINOR")
    field(ONAM, "Enable")
    field(OSV,  "NO_ALARM")
    field(VAL, "1")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):ROI1:ArrayCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))ARRAY_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ZSV,  "MINOR")
    field(ONAM, "Enabled")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains macro definitions for the attributes      # 
###################################################################

record(waveform, "$(CAM):ROI1:NDAttributesMacros")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_MACROS")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

###################################################################
#  This record is the name of a file defining attributes          # 
###################################################################

record(waveform, "$(CAM):ROI1:NDAttributesFile")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_FILE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

###################################################################
#  This record defines the status of reading attributes file      # 
###################################################################

record(mbbi, "$(CAM):ROI1:NDAttributesStatus")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_STATUS")
    field(ZRVL, "0")
    field(ZRST, "Attributes file OK")
    field(ZRSV, "NO_ALARM")
    field(ONVL, "1")
    field(ONST, "File not found")
    field(ONSV, "MINOR")
    field(TWVL, "2")
    field(TWST, "XML syntax error")
    field(TWSV, "MAJOR")
    field(THVL, "3")
    field(THST, "Macro substitution error")
    field(THSV, "MAJOR")
    field(SCAN, "I/O Intr")
}

###################################################################
#  Status of NDArrayPool - number of buffers, memory used etc.    # 
###################################################################

record(ai, "$(CAM):ROI1:PoolMaxMem")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))POOL_MAX_MEMORY")
   field(PREC, "1")
   field(EGU,  "MB")
   field(SCAN, "Passive")
   field(PINI, "YES")
}

record(ai, "$(CAM):ROI1:PoolUsedMem")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))POOL_USED_MEMORY")
   field(PREC, "1")
   field(EGU,  "MB")
   field(SCAN, "1 second")
   field(FLNK, "$(CAM):ROI1:PoolAllocBuffers")
   info(autosaveFields, "SCAN")
}

record(longin, "$(CAM):ROI1:PoolAllocBuffers")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))POOL_ALLOC_BUFFERS")
   field(FLNK, "$(CAM):ROI1:PoolFreeBuffers")
}

record(longin, "$(CAM):ROI1:PoolFreeBuffers")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))POOL_FREE_BUFFERS")
   field(FLNK, "$(CAM):ROI1:PoolUsedBuffers")
}

record(calc, "$(CAM):ROI1:PoolUsedBuffers")
{
    field(INPA, "$(CAM):ROI1:PoolAllocBuffers NPP MS")
    field(INPB, "$(CAM):ROI1:PoolFreeBuffers NPP MS")
    field(CALC, "A-B")
}

record(bo, "$(CAM):ROI1:EmptyFreeList")
{
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))POOL_EMPTY_FREELIST")
}

record(longin, "$(CAM):ROI1:NumQueuedArrays")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))NUM_QUEUED_ARRAYS")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the type of plugin                        #
###################################################################

record(stringin, "$(CAM):ROI1:PluginType_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))PLUGIN_TYPE")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the connection of the server to          #
#  an NDArray driver port and address                             #
###################################################################
# Array port name
record(stringout, "$(CAM):ROI1:NDArrayPort")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(OUT,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))NDARRAY_PORT")
    field(VAL,  "$(CAM_PORT)")
    info(autosaveFields, "DESC VAL")
}

record(stringin, "$(CAM):ROI1:NDArrayPort_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))NDARRAY_PORT")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):ROI1:NDArrayAddress")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))NDARRAY_ADDR")
    field(VAL,  "$(NDARRAY_ADDR=0)")
    info(autosaveFields, "DESC VAL")
}

record(longin, "$(CAM):ROI1:NDArrayAddress_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))NDARRAY_ADDR")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control whether callbacks are enabled and        #
#  minimum time between callbacks                                 #
###################################################################
record(bo, "$(CAM):ROI1:EnableCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))ENABLE_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    field(VAL,  "0")
    info(autosaveFields, "DESC VAL")
}

record(bi, "$(CAM):ROI1:EnableCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))ENABLE_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    field(ZSV,  "MINOR")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):ROI1:MinCallbackTime")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))MIN_CALLBACK_TIME")
    field(EGU,  "s")
    field(PREC, "3")
    field(VAL,  "0.0")
    field(DRVL, "0")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):ROI1:MinCallbackTime_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))MIN_CALLBACK_TIME")
    field(EGU,  "s")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):ROI1:MaxArrayRate")
{
    field(DTYP, "Soft Channel")
    field(OUT,  "$(CAM):ROI1:MaxArrayRate_COUT PP")
    field(EGU,  "Hz")
    field(PREC, "3")
    field(VAL,  "0.0")
    info(autosaveFields, "VAL")
}

record(calcout, "$(CAM):ROI1:MaxArrayRate_COUT")
{
    field(INPA, "$(CAM):ROI1:MaxArrayRate")
    field(CALC, "A=0?0:1.0/A")
    field(OUT,  "$(CAM):ROI1:MinCallbackTime PP")
}

record(calc, "$(CAM):ROI1:MaxArrayRate_RBV")
{
    field(INPA, "$(CAM):ROI1:MinCallbackTime_RBV CP")
    field(CALC, "A=0?0:1.0/A")
    field(EGU,  "Hz")
    field(PREC, "3")
    field(SCAN, "Passive")
}

record(ao, "$(CAM):ROI1:MaxByteRate")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))MAX_BYTE_RATE")
    field(EGU,  "s")
    field(PREC, "3")
    field(VAL,  "0.0")
    field(DRVL, "0")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):ROI1:MaxByteRate_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))MAX_BYTE_RATE")
    field(EGU,  "s")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the last execution time of the plugin     #
###################################################################
record(ai, "$(CAM):ROI1:ExecutionTime_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))EXECUTION_TIME")
    field(EGU,  "ms")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record requests that the plugin execute again with the    #
#  same NDArray                                                   #
###################################################################
record(bo, "$(CAM):ROI1:ProcessPlugin")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))PROCESS_PLUGIN")
    field(VAL,  "1")
}

###################################################################
#  These records control whether callbacks block or not           #
###################################################################
record(bo, "$(CAM):ROI1:BlockingCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))BLOCKING_CALLBACKS")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(VAL,  "0")
    info(autosaveFields, "DESC ZSV OSV VAL")
}

record(bi, "$(CAM):ROI1:BlockingCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))BLOCKING_CALLBACKS")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(ZSV,  "NO_ALARM")
    field(OSV,  "MINOR")
    field(SCAN, "I/O Intr")
    info( autosaveFields, "DESC ZSV OSV" )
}


record(longout, "$(CAM):ROI1:DroppedArrays")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))DROPPED_ARRAYS")
    field(VAL,  "0")
    info( autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV EGU" )
}

record(longin, "$(CAM):ROI1:DroppedArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))DROPPED_ARRAYS")
    field(SCAN, "I/O Intr")
    field(HIGH, "1")
    field(HSV,  "MINOR")
    info( autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV EGU" )
}

record(longout, "$(CAM):ROI1:QueueSize")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))QUEUE_SIZE")
    field(PINI, "YES")
    info( autosaveFields, "DESC EGU" )
}

record(longin, "$(CAM):ROI1:QueueSize_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))QUEUE_SIZE")
    field(FLNK, "$(CAM):ROI1:QueueFreeLow")
    field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):ROI1:QueueFreeLow") {
    field(CALC, "A*0.25")
    field(INPA, "$(CAM):ROI1:QueueSize")
    field(OUT,  "$(CAM):ROI1:QueueFree.LOW")
    field(FLNK, "$(CAM):ROI1:QueueUseHIGH")
}

# Set a HIGH warning level for the input queue fill level to 75%
# of the full size of the queue
record(calcout, "$(CAM):ROI1:QueueUseHIGH") {
   field(CALC, "A*0.75")
   field(INPA, "$(CAM):ROI1:QueueSize")
   field(OUT,  "$(CAM):ROI1:QueueUse.HIGH")
   field(FLNK, "$(CAM):ROI1:QueueUseHIHI")
}

# Set a HIHI level for the input queue fill level to indicate an error
# (MAJOR alarm)  when it fills up to the full size of the queue (frames start dropping)
record(calcout, "$(CAM):ROI1:QueueUseHIHI") {
   field(CALC, "A*1.0")
   field(INPA, "$(CAM):ROI1:QueueSize")
   field(OUT,  "$(CAM):ROI1:QueueUse.HIHI")
}

record(longin, "$(CAM):ROI1:QueueFree")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))QUEUE_FREE")
    field(LLSV, "MAJOR")
    field(LSV,  "MINOR")
    field(LOLO, "0")
    field(HYST, "1")
    field(SCAN, "I/O Intr")
}

# Display the fill level on the plugins input queue
record(calc, "$(CAM):ROI1:QueueUse") {
    field(CALC, "A-B")
    field(INPA, "$(CAM):ROI1:QueueSize")
    field(INPB, "$(CAM):ROI1:QueueFree CP")
    field(SCAN, "Passive")
    field(HHSV, "MAJOR")
    field(HSV,  "MINOR")
    field(HYST, "1")
}

record(longout, "$(CAM):ROI1:NumThreads")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))NUM_THREADS")
    field(VAL,  "1")
    field(PINI, "YES")
    info(autosaveFields, "DESC VAL")
}

record(longin, "$(CAM):ROI1:NumThreads_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))NUM_THREADS")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI1:MaxThreads_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))MAX_THREADS")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control output array sorting                     #
###################################################################
record(mbbo, "$(CAM):ROI1:SortMode") {
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))SORT_MODE")
    field(ZRVL, "0")
    field(ZRST, "Unsorted")
    field(ONVL, "1")
    field(ONST, "Sorted")
}

record(mbbi, "$(CAM):ROI1:SortMode_RBV") {
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))SORT_MODE")
    field(ZRVL, "0")
    field(ZRST, "Unsorted")
    field(ONVL, "1")
    field(ONST, "Sorted")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):ROI1:SortTime") {
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))SORT_TIME")
    field(PREC, "3")
    field(VAL, "0.1")
}

record(ai, "$(CAM):ROI1:SortTime_RBV") {
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))SORT_TIME")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):ROI1:SortSize")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))SORT_SIZE")
    field(VAL,  "20")
    field(PINI, "YES")
}

record(longin, "$(CAM):ROI1:SortSize_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))SORT_SIZE")
    field(FLNK, "$(CAM):ROI1:SortFreeLow")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI1:SortFree") {
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))SORT_FREE")
    field(LLSV, "MAJOR")
    field(LSV,  "MINOR")
    field(LOLO, "0")
    field(HYST, "1")
    field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):ROI1:SortFreeLow") {
    field(CALC, "A*0.25")
    field(INPA, "$(CAM):ROI1:SortSize")
    field(OUT,  "$(CAM):ROI1:SortFree.LOW")
}

record(longout, "$(CAM):ROI1:DroppedOutputArrays")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))DROPPED_OUTPUT_ARRAYS")
    field(VAL,  "0")
}

record(longin, "$(CAM):ROI1:DroppedOutputArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))DROPPED_OUTPUT_ARRAYS")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):ROI1:DisorderedArrays")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))DISORDERED_ARRAYS")
    field(PINI, "YES")
}

record(longin, "$(CAM):ROI1:DisorderedArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))DISORDERED_ARRAYS")
    field(SCAN, "I/O Intr")
}



###################################################################
#  The asynRecord is used for mainly for trace mask               # 
###################################################################
 
# Set ASYN_TRACEIO_HEX bit by default
record(asyn,"$(CAM):ROI1:AsynIO")
{
    field(PORT, "ROI1")
    field(TIB2,"1")
    info("ADType", "ADPlugin")
}


###################################################################
#  These records control the label for the ROI                    #
###################################################################
record(stringout, "$(CAM):ROI1:Name")
{
   field(PINI, "YES")
   field(DTYP, "asynOctetWrite")
   field(OUT,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))NAME")
   info(autosaveFields, "VAL")
}

record(stringin, "$(CAM):ROI1:Name_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))NAME")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the ROI definition                       #
#  including binning, region start and size                       # 
###################################################################

record(longout, "$(CAM):ROI1:BinX")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))DIM0_BIN")
   field(VAL,  "1")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):ROI1:BinX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))DIM0_BIN")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):ROI1:BinY")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))DIM1_BIN")
   field(VAL,  "1")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):ROI1:BinY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))DIM1_BIN")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):ROI1:BinZ")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))DIM2_BIN")
   field(VAL,  "1")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):ROI1:BinZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))DIM2_BIN")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):ROI1:MinX")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))DIM0_MIN")
   field(LOPR, "0")
   field(VAL,  "0")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):ROI1:MinX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))DIM0_MIN")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):ROI1:MinY")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))DIM1_MIN")
   field(LOPR, "0")
   field(VAL,  "0")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):ROI1:MinY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))DIM1_MIN")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):ROI1:MinZ")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))DIM2_MIN")
   field(LOPR, "1")
   field(VAL,  "0")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):ROI1:MinZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))DIM2_MIN")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):ROI1:SizeX")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))DIM0_SIZE")
   field(VAL,  "1000000")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):ROI1:SizeX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))DIM0_SIZE")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):ROI1:SizeY")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))DIM1_SIZE")
   field(VAL,  "1000000")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):ROI1:SizeY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))DIM1_SIZE")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):ROI1:SizeZ")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))DIM2_SIZE")
   field(VAL,  "1000000")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):ROI1:SizeZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))DIM2_SIZE")
   field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):ROI1:AutoSizeX")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))DIM0_AUTO_SIZE")
   field(VAL,  "0")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):ROI1:AutoSizeX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))DIM0_AUTO_SIZE")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):ROI1:AutoSizeY")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))DIM1_AUTO_SIZE")
   field(VAL,  "0")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):ROI1:AutoSizeY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))DIM1_AUTO_SIZE")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):ROI1:AutoSizeZ")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))DIM2_AUTO_SIZE")
   field(VAL,  "0")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):ROI1:AutoSizeZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))DIM2_AUTO_SIZE")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI1:MaxSizeX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))DIM0_MAX_SIZE")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI1:MaxSizeY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))DIM1_MAX_SIZE")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI1:MaxSizeZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))DIM2_MAX_SIZE")
   field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):ROI1:ReverseX")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))DIM0_REVERSE")
   field(VAL,  "0")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):ROI1:ReverseX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))DIM0_REVERSE")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):ROI1:ReverseY")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))DIM1_REVERSE")
   field(VAL,  "0")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):ROI1:ReverseY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))DIM1_REVERSE")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):ROI1:ReverseZ")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))DIM2_REVERSE")
   field(VAL,  "0")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):ROI1:ReverseZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))DIM2_REVERSE")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI1:ArraySizeX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_X")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI1:ArraySizeY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_Y")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI1:ArraySizeZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_Z")
   field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):ROI1:EnableX")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))DIM0_ENABLE")
   field(VAL,  "1")
   field(ZNAM, "Disabled")
   field(ONAM, "Enabled")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):ROI1:EnableX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))DIM0_ENABLE")
   field(ZNAM, "Disabled")
   field(ONAM, "Enabled")
   field(ZSV,  "NO_ALARM")
   field(OSV,  "NO_ALARM")
   field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):ROI1:EnableY")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))DIM1_ENABLE")
   field(VAL,  "1")
   field(ZNAM, "Disabled")
   field(ONAM, "Enabled")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):ROI1:EnableY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))DIM1_ENABLE")
   field(ZNAM, "Disabled")
   field(ONAM, "Enabled")
   field(ZSV,  "NO_ALARM")
   field(OSV,  "NO_ALARM")
   field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):ROI1:EnableZ")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))DIM2_ENABLE")
   field(VAL,  "1")
   field(ZNAM, "Disabled")
   field(ONAM, "Enabled")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):ROI1:EnableZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))DIM2_ENABLE")
   field(ZNAM, "Disabled")
   field(ONAM, "Enabled")
   field(ZSV,  "NO_ALARM")
   field(OSV,  "NO_ALARM")
   field(SCAN, "I/O Intr")
}


###################################################################
#  These records control the scaling of the data.  Useful when    #
#  binning or converting data types                               # 
###################################################################

record(bo, "$(CAM):ROI1:EnableScale")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))ENABLE_SCALE")
   field(VAL,  "0")
   field(ZNAM, "Disabled")
   field(ONAM, "Enabled")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):ROI1:EnableScale_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))ENABLE_SCALE")
   field(ZNAM, "Disabled")
   field(ONAM, "Enabled")
   field(ZSV,  "NO_ALARM")
   field(OSV,  "MINOR")
   field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):ROI1:Scale")
{
   field(PINI, "YES")
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))SCALE_VALUE")
   field(VAL,  "1")
   info(autosaveFields, "VAL")
}

record(ai, "$(CAM):ROI1:Scale_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))SCALE_VALUE")
   field(SCAN, "I/O Intr")
}


###################################################################
#  These records control the data type of the array data          # 
#  The last entry is "Automatic" meaning preserve the data type   #
#  of the input array.                                            # 
###################################################################

record(mbbo, "$(CAM):ROI1:DataTypeOut")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))ROI_DATA_TYPE")
   field(ZRST, "Int8")
   field(ZRVL, "0")
   field(ONST, "UInt8")
   field(ONVL, "1")
   field(TWST, "Int16")
   field(TWVL, "2")
   field(THST, "UInt16")
   field(THVL, "3")
   field(FRST, "Int32")
   field(FRVL, "4")
   field(FVST, "UInt32")
   field(FVVL, "5")
   field(SXST, "Int64")
   field(SXVL, "6")
   field(SVST, "UInt64")
   field(SVVL, "7")
   field(EIST, "Float32")
   field(EIVL, "8")
   field(NIST, "Float64")
   field(NIVL, "9")
   field(TEST, "Automatic")
   field(TEVL, "-1")
   field(VAL,  "10")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):ROI1:DataTypeOut_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))ROI_DATA_TYPE")
   field(ZRST, "Int8")
   field(ZRVL, "0")
   field(ONST, "UInt8")
   field(ONVL, "1")
   field(TWST, "Int16")
   field(TWVL, "2")
   field(THST, "UInt16")
   field(THVL, "3")
   field(FRST, "Int32")
   field(FRVL, "4")
   field(FVST, "UInt32")
   field(FVVL, "5")
   field(SXST, "Int64")
   field(SXVL, "6")
   field(SVST, "UInt64")
   field(SVVL, "7")
   field(EIST, "Float32")
   field(EIVL, "8")
   field(NIST, "Float64")
   field(NIVL, "9")
   field(TEST, "Automatic")
   field(TEVL, "-1")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records set the HOPR and LOPR values for the position    #
#  and size to the maximum for the input array                    #
###################################################################

record(longin, "$(CAM):ROI1:MaxX")
{
    field(INP,  "$(CAM):ROI1:MaxSizeX_RBV CP")
    field(FLNK, "$(CAM):ROI1:SetXHOPR.PROC PP")
}

record(dfanout, "$(CAM):ROI1:SetXHOPR")
{
    field(DOL,  "$(CAM):ROI1:MaxX NPP")
    field(OMSL, "closed_loop")
    field(OUTA, "$(CAM):ROI1:MinX.HOPR NPP")
    field(OUTB, "$(CAM):ROI1:SizeX.HOPR NPP")
}

record(longin, "$(CAM):ROI1:MaxY")
{
    field(INP,  "$(CAM):ROI1:MaxSizeY_RBV CP")
    field(FLNK, "$(CAM):ROI1:SetYHOPR.PROC PP")
}

record(dfanout, "$(CAM):ROI1:SetYHOPR")
{
    field(DOL,  "$(CAM):ROI1:MaxY NPP")
    field(OMSL, "closed_loop")
    field(OUTA, "$(CAM):ROI1:MinY.HOPR NPP")
    field(OUTB, "$(CAM):ROI1:SizeY.HOPR NPP")
}

###################################################################
#  These records whether dimensions of 1 are collapsed (removed)  #                               # 
###################################################################

record(bo, "$(CAM):ROI1:CollapseDims")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))COLLAPSE_DIMS")
   field(VAL,  "0")
   field(ZNAM, "Disabled")
   field(ONAM, "Enabled")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):ROI1:CollapseDims_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI1,$(ADDR=0),$(TIMEOUT=1))COLLAPSE_DIMS")
   field(ZNAM, "Disabled")
   field(ONAM, "Enabled")
   field(ZSV,  "NO_ALARM")
   field(OSV,  "MINOR")
   field(SCAN, "I/O Intr")
}


#=================================================================#
# Template file: NDROI.template
# Database for ND ROIs
# Mark Rivers
# April 22, 2008

#=================================================================#
# Template file: NDPluginBase.template
# Database for NDPluginBase, i.e. records common to all plugins
# Mark Rivers
# April 25, 2008

#=================================================================#
# Template file: NDArrayBase.template
# Database for area detector control using asyn driver and standard asyn device support
# Mark Rivers
# March 9, 2008

###################################################################
#  This record contains the version of ADCore                     #
###################################################################

record(stringin, "$(CAM):ROI2:ADCoreVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))ADCORE_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the version of the driver or plugin       #
###################################################################

record(stringin, "$(CAM):ROI2:DriverVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))DRIVER_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the asyn port name of this detector       #
###################################################################

record(stringin, "$(CAM):ROI2:PortName_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))PORT_NAME_SELF")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records contain basic information about the detector     # 
###################################################################

record(stringin, "$(CAM):ROI2:Manufacturer_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))MANUFACTURER")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):ROI2:Model_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))MODEL")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):ROI2:SerialNumber_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))SERIAL_NUMBER")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):ROI2:SDKVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))SDK_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):ROI2:FirmwareVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))FIRMWARE_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control acquisition start and stop               #
###################################################################

record(bo, "$(CAM):ROI2:Acquire") {
   field(DTYP, "asynInt32")
   field(OUT, "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))ACQUIRE")
   field(ZNAM, "Done")
   field(ONAM, "Acquire")
   field(VAL,  "0")
   field(FLNK, "$(CAM):ROI2:SetAcquireBusy")
   info(asyn:READBACK, "1")
}

record(bi, "$(CAM):ROI2:Acquire_RBV") {
   field(DTYP, "asynInt32")
   field(INP, "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))ACQUIRE")
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):ROI2:SetAcquireBusy")
{
    field(INPA, "$(CAM):ROI2:Acquire NPP")
    field(CALC, "A")
    field(OOPT, "Transition To Non-zero")
    field(OUT,  "$(CAM):ROI2:AcquireBusy PP")
}

record(busy, "$(CAM):ROI2:AcquireBusy") {
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(VAL,  "0")
}

record(bi, "$(CAM):ROI2:AcquireBusyCB") {
   field(DTYP, "asynInt32")
   field(INP, "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))ACQUIRE_BUSY")
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):ROI2:ClearAcquireBusy") {
    field(INPA, "$(CAM):ROI2:AcquireBusyCB CP")
    field(CALC, "A")
    field(OOPT, "Transition To Zero")
    field(OUT,  "$(CAM):ROI2:AcquireBusy PP")
}

record(bo, "$(CAM):ROI2:WaitForPlugins") {
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT, "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))WAIT_FOR_PLUGINS")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(VAL,  "0")
}

###################################################################
#  These records are the array size and data type                 #
###################################################################
# The number of dimensions
record(longout, "$(CAM):ROI2:NDimensions")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))ARRAY_NDIMENSIONS")
}

record(longin, "$(CAM):ROI2:NDimensions_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))ARRAY_NDIMENSIONS")
    field(SCAN, "I/O Intr")
}

# The array dimensions waveform records
record(waveform, "$(CAM):ROI2:Dimensions")
{
    field(DTYP, "asynInt32ArrayOut")
    field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))ARRAY_DIMENSIONS")
    field(FTVL, "LONG")
    field(NELM, "10")
    field(FLNK, "$(CAM):ROI2:Dim0SA")
}

record(subArray, "$(CAM):ROI2:Dim0SA")
{
    field(INP,  "$(CAM):ROI2:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "0")
    field(FLNK, "$(CAM):ROI2:ArraySize0")
}

record(longin, "$(CAM):ROI2:ArraySize0")
{
    field(INP,  "$(CAM):ROI2:Dim0SA")
    field(FLNK, "$(CAM):ROI2:Dim1SA")
}

record(subArray, "$(CAM):ROI2:Dim1SA")
{
    field(INP,  "$(CAM):ROI2:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "1")
    field(FLNK, "$(CAM):ROI2:ArraySize1")
}

record(longin, "$(CAM):ROI2:ArraySize1")
{
    field(INP,  "$(CAM):ROI2:Dim1SA")
    field(FLNK, "$(CAM):ROI2:Dim2SA")
}

record(subArray, "$(CAM):ROI2:Dim2SA")
{
    field(INP,  "$(CAM):ROI2:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "2")
    field(FLNK, "$(CAM):ROI2:ArraySize2")
}

record(longin, "$(CAM):ROI2:ArraySize2")
{
    field(INP,  "$(CAM):ROI2:Dim2SA")
    field(FLNK, "$(CAM):ROI2:Dim3SA")
}

record(subArray, "$(CAM):ROI2:Dim3SA")
{
    field(INP,  "$(CAM):ROI2:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "3")
    field(FLNK, "$(CAM):ROI2:ArraySize3")
}

record(longin, "$(CAM):ROI2:ArraySize3")
{
    field(INP,  "$(CAM):ROI2:Dim3SA")
    field(FLNK, "$(CAM):ROI2:Dim4SA")
}

record(subArray, "$(CAM):ROI2:Dim4SA")
{
    field(INP,  "$(CAM):ROI2:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "4")
    field(FLNK, "$(CAM):ROI2:ArraySize4")
}

record(longin, "$(CAM):ROI2:ArraySize4")
{
    field(INP,  "$(CAM):ROI2:Dim4SA")
    field(FLNK, "$(CAM):ROI2:Dim5SA")
}

record(subArray, "$(CAM):ROI2:Dim5SA")
{
    field(INP,  "$(CAM):ROI2:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "5")
    field(FLNK, "$(CAM):ROI2:ArraySize5")
}

record(longin, "$(CAM):ROI2:ArraySize5")
{
    field(INP,  "$(CAM):ROI2:Dim5SA")
    field(FLNK, "$(CAM):ROI2:Dim6SA")
}

record(subArray, "$(CAM):ROI2:Dim6SA")
{
    field(INP,  "$(CAM):ROI2:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "6")
    field(FLNK, "$(CAM):ROI2:ArraySize6")
}

record(longin, "$(CAM):ROI2:ArraySize6")
{
    field(INP,  "$(CAM):ROI2:Dim6SA")
    field(FLNK, "$(CAM):ROI2:Dim7SA")
}

record(subArray, "$(CAM):ROI2:Dim7SA")
{
    field(INP,  "$(CAM):ROI2:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "7")
    field(FLNK, "$(CAM):ROI2:ArraySize7")
}

record(longin, "$(CAM):ROI2:ArraySize7")
{
    field(INP,  "$(CAM):ROI2:Dim7SA")
    field(FLNK, "$(CAM):ROI2:Dim8SA")
}

record(subArray, "$(CAM):ROI2:Dim8SA")
{
    field(INP,  "$(CAM):ROI2:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "8")
    field(FLNK, "$(CAM):ROI2:ArraySize8")
}

record(longin, "$(CAM):ROI2:ArraySize8")
{
    field(INP,  "$(CAM):ROI2:Dim8SA")
    field(FLNK, "$(CAM):ROI2:Dim9SA")
}

record(subArray, "$(CAM):ROI2:Dim9SA")
{
    field(INP,  "$(CAM):ROI2:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "9")
    field(FLNK, "$(CAM):ROI2:ArraySize9")
}

record(longin, "$(CAM):ROI2:ArraySize9")
{
    field(INP,  "$(CAM):ROI2:Dim9SA")
}


record(waveform, "$(CAM):ROI2:Dimensions_RBV")
{
    field(DTYP, "asynInt32ArrayIn")
    field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))ARRAY_DIMENSIONS")
    field(FTVL, "LONG")
    field(NELM, "10")
    field(FLNK, "$(CAM):ROI2:Dim0SA_RBV")
    field(SCAN, "I/O Intr")
}

record(subArray, "$(CAM):ROI2:Dim0SA_RBV")
{
    field(INP,  "$(CAM):ROI2:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "0")
    field(FLNK, "$(CAM):ROI2:ArraySize0_RBV")
}

record(longin, "$(CAM):ROI2:ArraySize0_RBV")
{
    field(INP,  "$(CAM):ROI2:Dim0SA_RBV")
    field(FLNK, "$(CAM):ROI2:Dim1SA_RBV")
}

record(subArray, "$(CAM):ROI2:Dim1SA_RBV")
{
    field(INP,  "$(CAM):ROI2:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "1")
    field(FLNK, "$(CAM):ROI2:ArraySize1_RBV")
}

record(longin, "$(CAM):ROI2:ArraySize1_RBV")
{
    field(INP,  "$(CAM):ROI2:Dim1SA_RBV")
    field(FLNK, "$(CAM):ROI2:Dim2SA_RBV")
}

record(subArray, "$(CAM):ROI2:Dim2SA_RBV")
{
    field(INP,  "$(CAM):ROI2:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "2")
    field(FLNK, "$(CAM):ROI2:ArraySize2_RBV")
}

record(longin, "$(CAM):ROI2:ArraySize2_RBV")
{
    field(INP,  "$(CAM):ROI2:Dim2SA_RBV")
    field(FLNK, "$(CAM):ROI2:Dim3SA_RBV")
}

record(subArray, "$(CAM):ROI2:Dim3SA_RBV")
{
    field(INP,  "$(CAM):ROI2:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "3")
    field(FLNK, "$(CAM):ROI2:ArraySize3_RBV")
}

record(longin, "$(CAM):ROI2:ArraySize3_RBV")
{
    field(INP,  "$(CAM):ROI2:Dim3SA_RBV")
    field(FLNK, "$(CAM):ROI2:Dim4SA_RBV")
}

record(subArray, "$(CAM):ROI2:Dim4SA_RBV")
{
    field(INP,  "$(CAM):ROI2:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "4")
    field(FLNK, "$(CAM):ROI2:ArraySize4_RBV")
}

record(longin, "$(CAM):ROI2:ArraySize4_RBV")
{
    field(INP,  "$(CAM):ROI2:Dim4SA_RBV")
    field(FLNK, "$(CAM):ROI2:Dim5SA_RBV")
}

record(subArray, "$(CAM):ROI2:Dim5SA_RBV")
{
    field(INP,  "$(CAM):ROI2:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "5")
    field(FLNK, "$(CAM):ROI2:ArraySize5_RBV")
}

record(longin, "$(CAM):ROI2:ArraySize5_RBV")
{
    field(INP,  "$(CAM):ROI2:Dim5SA_RBV")
    field(FLNK, "$(CAM):ROI2:Dim6SA_RBV")
}

record(subArray, "$(CAM):ROI2:Dim6SA_RBV")
{
    field(INP,  "$(CAM):ROI2:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "6")
    field(FLNK, "$(CAM):ROI2:ArraySize6_RBV")
}

record(longin, "$(CAM):ROI2:ArraySize6_RBV")
{
    field(INP,  "$(CAM):ROI2:Dim6SA_RBV")
    field(FLNK, "$(CAM):ROI2:Dim7SA_RBV")
}

record(subArray, "$(CAM):ROI2:Dim7SA_RBV")
{
    field(INP,  "$(CAM):ROI2:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "7")
    field(FLNK, "$(CAM):ROI2:ArraySize7_RBV")
}

record(longin, "$(CAM):ROI2:ArraySize7_RBV")
{
    field(INP,  "$(CAM):ROI2:Dim7SA_RBV")
    field(FLNK, "$(CAM):ROI2:Dim8SA_RBV")
}

record(subArray, "$(CAM):ROI2:Dim8SA_RBV")
{
    field(INP,  "$(CAM):ROI2:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "8")
    field(FLNK, "$(CAM):ROI2:ArraySize8_RBV")
}

record(longin, "$(CAM):ROI2:ArraySize8_RBV")
{
    field(INP,  "$(CAM):ROI2:Dim8SA_RBV")
    field(FLNK, "$(CAM):ROI2:Dim9SA_RBV")
}

record(subArray, "$(CAM):ROI2:Dim9SA_RBV")
{
    field(INP,  "$(CAM):ROI2:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "9")
    field(FLNK, "$(CAM):ROI2:ArraySize9_RBV")
}

record(longin, "$(CAM):ROI2:ArraySize9_RBV")
{
    field(INP,  "$(CAM):ROI2:Dim9SA_RBV")
}


record(mbbi, "$(CAM):ROI2:BayerPattern_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))BAYER_PATTERN")
   field(ZRST, "RGGB")
   field(ZRVL, "0")
   field(ONST, "GBRG")
   field(ONVL, "1")
   field(TWST, "GRBG")
   field(TWVL, "2")
   field(THST, "BGGR")
   field(THVL, "3")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI2:ArraySizeX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_X")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI2:ArraySizeY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_Y")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI2:ArraySizeZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_Z")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI2:ArraySize_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records have information on the compression              # 
###################################################################
record(stringin, "$(CAM):ROI2:Codec_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))CODEC")
   field(VAL,  "")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI2:CompressedSize_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))COMPRESSED_SIZE")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the data type                            # 
###################################################################

record(mbbo, "$(CAM):ROI2:DataType")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))DATA_TYPE")
   field(ZRST, "Int8")
   field(ZRVL, "0")
   field(ONST, "UInt8")
   field(ONVL, "1")
   field(TWST, "Int16")
   field(TWVL, "2")
   field(THST, "UInt16")
   field(THVL, "3")
   field(FRST, "Int32")
   field(FRVL, "4")
   field(FVST, "UInt32")
   field(FVVL, "5")
   field(SXST, "Int64")
   field(SXVL, "6")
   field(SVST, "UInt64")
   field(SVVL, "7")
   field(EIST, "Float32")
   field(EIVL, "8")
   field(NIST, "Float64")
   field(NIVL, "9")
   field(VAL,  "0")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):ROI2:DataType_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))DATA_TYPE")
   field(ZRST, "Int8")
   field(ZRVL, "0")
   field(ONST, "UInt8")
   field(ONVL, "1")
   field(TWST, "Int16")
   field(TWVL, "2")
   field(THST, "UInt16")
   field(THVL, "3")
   field(FRST, "Int32")
   field(FRVL, "4")
   field(FVST, "UInt32")
   field(FVVL, "5")
   field(SXST, "Int64")
   field(SXVL, "6")
   field(SVST, "UInt64")
   field(SVVL, "7")
   field(EIST, "Float32")
   field(EIVL, "8")
   field(NIST, "Float64")
   field(NIVL, "9")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI2:BitsPerPixel_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))BITS_PER_PIXEL")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the color mode                           #
#  These choices must agree with NDColorMode_t in NDArray.h       # 
###################################################################

record(mbbo, "$(CAM):ROI2:ColorMode")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))COLOR_MODE")
   field(ZRST, "Mono")
   field(ZRVL, "0")
   field(ONST, "Bayer")
   field(ONVL, "1")
   field(TWST, "RGB1")
   field(TWVL, "2")
   field(THST, "RGB2")
   field(THVL, "3")
   field(FRST, "RGB3")
   field(FRVL, "4")
   field(FVST, "YUV444")
   field(FVVL, "5")
   field(SXST, "YUV422")
   field(SXVL, "6")
   field(SVST, "YUV421")
   field(SVVL, "7")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):ROI2:ColorMode_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))COLOR_MODE")
   field(ZRST, "Mono")
   field(ZRVL, "0")
   field(ONST, "Bayer")
   field(ONVL, "1")
   field(TWST, "RGB1")
   field(TWVL, "2")
   field(THST, "RGB2")
   field(THVL, "3")
   field(FRST, "RGB3")
   field(FRVL, "4")
   field(FVST, "YUV444")
   field(FVVL, "5")
   field(SXST, "YUV422")
   field(SXVL, "6")
   field(SVST, "YUV421")
   field(SVVL, "7")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records are the uniqueId and time stamps of the array     #
###################################################################
record(longin, "$(CAM):ROI2:UniqueId_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))UNIQUE_ID")
    field(SCAN, "I/O Intr")
}

record(ai, "$(CAM):ROI2:TimeStamp_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))TIME_STAMP")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI2:EpicsTSSec_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))EPICS_TS_SEC")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI2:EpicsTSNsec_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))EPICS_TS_NSEC")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records provide statistics on array callbacks and        #
#  array callback rates                                           # 
###################################################################
record(longout, "$(CAM):ROI2:ArrayCounter")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))ARRAY_COUNTER")
}

record(longin, "$(CAM):ROI2:ArrayCounter_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))ARRAY_COUNTER")
    field(SCAN, "I/O Intr")
    field(TSE,  "-2")
    field(LOW,  "0" )
    field(LSV,  "MINOR" )
    info(autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV TSE")
}

# Updated rate calculation to use a smoothing factor w/ guard against negative values
# 0 rate sets alarm state to MINOR
record(calc, "$(CAM):ROI2:ArrayRate_RBV")
{
    field(INPA, "$(CAM):ROI2:ArrayRate_RBV.LB NPP NMS")   # Previous counter (Last B value)
    field(INPB, "$(CAM):ROI2:ArrayCounter_RBV NPP NMS")   # Current counter value
    field(INPC, "1.0")                                # Delta time in seconds
    field(INPD, "$(CAM):ROI2:ArrayRate_RBV.VAL NPP NMS")  # Previous rate
    field(INPE, "0.0")                 # Smoothing factor
    field(CALC, "(D*E)/C+MAX(0,B-A)*(1-E)/C")
    field(PREC, "2" )
    field(EGU,  "Hz" )
    field(SCAN, "1 second")
    field(LOW,  "0")
    field(LSV,  "MINOR")
    field(ADEL, "0.1")
    info(autosaveFields, "ADEL DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV MDEL PREC C E SCAN EGU")
}

###################################################################
#  These records control NDArray callacks                         # 
###################################################################
record(bo, "$(CAM):ROI2:ArrayCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))ARRAY_CALLBACKS")
    field(ZNAM, "Disable")
    field(ZSV,  "MINOR")
    field(ONAM, "Enable")
    field(OSV,  "NO_ALARM")
    field(VAL, "1")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):ROI2:ArrayCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))ARRAY_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ZSV,  "MINOR")
    field(ONAM, "Enabled")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains macro definitions for the attributes      # 
###################################################################

record(waveform, "$(CAM):ROI2:NDAttributesMacros")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_MACROS")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

###################################################################
#  This record is the name of a file defining attributes          # 
###################################################################

record(waveform, "$(CAM):ROI2:NDAttributesFile")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_FILE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

###################################################################
#  This record defines the status of reading attributes file      # 
###################################################################

record(mbbi, "$(CAM):ROI2:NDAttributesStatus")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_STATUS")
    field(ZRVL, "0")
    field(ZRST, "Attributes file OK")
    field(ZRSV, "NO_ALARM")
    field(ONVL, "1")
    field(ONST, "File not found")
    field(ONSV, "MINOR")
    field(TWVL, "2")
    field(TWST, "XML syntax error")
    field(TWSV, "MAJOR")
    field(THVL, "3")
    field(THST, "Macro substitution error")
    field(THSV, "MAJOR")
    field(SCAN, "I/O Intr")
}

###################################################################
#  Status of NDArrayPool - number of buffers, memory used etc.    # 
###################################################################

record(ai, "$(CAM):ROI2:PoolMaxMem")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))POOL_MAX_MEMORY")
   field(PREC, "1")
   field(EGU,  "MB")
   field(SCAN, "Passive")
   field(PINI, "YES")
}

record(ai, "$(CAM):ROI2:PoolUsedMem")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))POOL_USED_MEMORY")
   field(PREC, "1")
   field(EGU,  "MB")
   field(SCAN, "1 second")
   field(FLNK, "$(CAM):ROI2:PoolAllocBuffers")
   info(autosaveFields, "SCAN")
}

record(longin, "$(CAM):ROI2:PoolAllocBuffers")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))POOL_ALLOC_BUFFERS")
   field(FLNK, "$(CAM):ROI2:PoolFreeBuffers")
}

record(longin, "$(CAM):ROI2:PoolFreeBuffers")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))POOL_FREE_BUFFERS")
   field(FLNK, "$(CAM):ROI2:PoolUsedBuffers")
}

record(calc, "$(CAM):ROI2:PoolUsedBuffers")
{
    field(INPA, "$(CAM):ROI2:PoolAllocBuffers NPP MS")
    field(INPB, "$(CAM):ROI2:PoolFreeBuffers NPP MS")
    field(CALC, "A-B")
}

record(bo, "$(CAM):ROI2:EmptyFreeList")
{
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))POOL_EMPTY_FREELIST")
}

record(longin, "$(CAM):ROI2:NumQueuedArrays")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))NUM_QUEUED_ARRAYS")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the type of plugin                        #
###################################################################

record(stringin, "$(CAM):ROI2:PluginType_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))PLUGIN_TYPE")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the connection of the server to          #
#  an NDArray driver port and address                             #
###################################################################
# Array port name
record(stringout, "$(CAM):ROI2:NDArrayPort")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(OUT,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))NDARRAY_PORT")
    field(VAL,  "$(CAM_PORT)")
    info(autosaveFields, "DESC VAL")
}

record(stringin, "$(CAM):ROI2:NDArrayPort_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))NDARRAY_PORT")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):ROI2:NDArrayAddress")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))NDARRAY_ADDR")
    field(VAL,  "$(NDARRAY_ADDR=0)")
    info(autosaveFields, "DESC VAL")
}

record(longin, "$(CAM):ROI2:NDArrayAddress_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))NDARRAY_ADDR")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control whether callbacks are enabled and        #
#  minimum time between callbacks                                 #
###################################################################
record(bo, "$(CAM):ROI2:EnableCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))ENABLE_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    field(VAL,  "0")
    info(autosaveFields, "DESC VAL")
}

record(bi, "$(CAM):ROI2:EnableCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))ENABLE_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    field(ZSV,  "MINOR")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):ROI2:MinCallbackTime")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))MIN_CALLBACK_TIME")
    field(EGU,  "s")
    field(PREC, "3")
    field(VAL,  "0.0")
    field(DRVL, "0")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):ROI2:MinCallbackTime_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))MIN_CALLBACK_TIME")
    field(EGU,  "s")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):ROI2:MaxArrayRate")
{
    field(DTYP, "Soft Channel")
    field(OUT,  "$(CAM):ROI2:MaxArrayRate_COUT PP")
    field(EGU,  "Hz")
    field(PREC, "3")
    field(VAL,  "0.0")
    info(autosaveFields, "VAL")
}

record(calcout, "$(CAM):ROI2:MaxArrayRate_COUT")
{
    field(INPA, "$(CAM):ROI2:MaxArrayRate")
    field(CALC, "A=0?0:1.0/A")
    field(OUT,  "$(CAM):ROI2:MinCallbackTime PP")
}

record(calc, "$(CAM):ROI2:MaxArrayRate_RBV")
{
    field(INPA, "$(CAM):ROI2:MinCallbackTime_RBV CP")
    field(CALC, "A=0?0:1.0/A")
    field(EGU,  "Hz")
    field(PREC, "3")
    field(SCAN, "Passive")
}

record(ao, "$(CAM):ROI2:MaxByteRate")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))MAX_BYTE_RATE")
    field(EGU,  "s")
    field(PREC, "3")
    field(VAL,  "0.0")
    field(DRVL, "0")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):ROI2:MaxByteRate_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))MAX_BYTE_RATE")
    field(EGU,  "s")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the last execution time of the plugin     #
###################################################################
record(ai, "$(CAM):ROI2:ExecutionTime_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))EXECUTION_TIME")
    field(EGU,  "ms")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record requests that the plugin execute again with the    #
#  same NDArray                                                   #
###################################################################
record(bo, "$(CAM):ROI2:ProcessPlugin")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))PROCESS_PLUGIN")
    field(VAL,  "1")
}

###################################################################
#  These records control whether callbacks block or not           #
###################################################################
record(bo, "$(CAM):ROI2:BlockingCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))BLOCKING_CALLBACKS")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(VAL,  "0")
    info(autosaveFields, "DESC ZSV OSV VAL")
}

record(bi, "$(CAM):ROI2:BlockingCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))BLOCKING_CALLBACKS")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(ZSV,  "NO_ALARM")
    field(OSV,  "MINOR")
    field(SCAN, "I/O Intr")
    info( autosaveFields, "DESC ZSV OSV" )
}


record(longout, "$(CAM):ROI2:DroppedArrays")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))DROPPED_ARRAYS")
    field(VAL,  "0")
    info( autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV EGU" )
}

record(longin, "$(CAM):ROI2:DroppedArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))DROPPED_ARRAYS")
    field(SCAN, "I/O Intr")
    field(HIGH, "1")
    field(HSV,  "MINOR")
    info( autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV EGU" )
}

record(longout, "$(CAM):ROI2:QueueSize")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))QUEUE_SIZE")
    field(PINI, "YES")
    info( autosaveFields, "DESC EGU" )
}

record(longin, "$(CAM):ROI2:QueueSize_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))QUEUE_SIZE")
    field(FLNK, "$(CAM):ROI2:QueueFreeLow")
    field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):ROI2:QueueFreeLow") {
    field(CALC, "A*0.25")
    field(INPA, "$(CAM):ROI2:QueueSize")
    field(OUT,  "$(CAM):ROI2:QueueFree.LOW")
    field(FLNK, "$(CAM):ROI2:QueueUseHIGH")
}

# Set a HIGH warning level for the input queue fill level to 75%
# of the full size of the queue
record(calcout, "$(CAM):ROI2:QueueUseHIGH") {
   field(CALC, "A*0.75")
   field(INPA, "$(CAM):ROI2:QueueSize")
   field(OUT,  "$(CAM):ROI2:QueueUse.HIGH")
   field(FLNK, "$(CAM):ROI2:QueueUseHIHI")
}

# Set a HIHI level for the input queue fill level to indicate an error
# (MAJOR alarm)  when it fills up to the full size of the queue (frames start dropping)
record(calcout, "$(CAM):ROI2:QueueUseHIHI") {
   field(CALC, "A*1.0")
   field(INPA, "$(CAM):ROI2:QueueSize")
   field(OUT,  "$(CAM):ROI2:QueueUse.HIHI")
}

record(longin, "$(CAM):ROI2:QueueFree")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))QUEUE_FREE")
    field(LLSV, "MAJOR")
    field(LSV,  "MINOR")
    field(LOLO, "0")
    field(HYST, "1")
    field(SCAN, "I/O Intr")
}

# Display the fill level on the plugins input queue
record(calc, "$(CAM):ROI2:QueueUse") {
    field(CALC, "A-B")
    field(INPA, "$(CAM):ROI2:QueueSize")
    field(INPB, "$(CAM):ROI2:QueueFree CP")
    field(SCAN, "Passive")
    field(HHSV, "MAJOR")
    field(HSV,  "MINOR")
    field(HYST, "1")
}

record(longout, "$(CAM):ROI2:NumThreads")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))NUM_THREADS")
    field(VAL,  "1")
    field(PINI, "YES")
    info(autosaveFields, "DESC VAL")
}

record(longin, "$(CAM):ROI2:NumThreads_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))NUM_THREADS")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI2:MaxThreads_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))MAX_THREADS")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control output array sorting                     #
###################################################################
record(mbbo, "$(CAM):ROI2:SortMode") {
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))SORT_MODE")
    field(ZRVL, "0")
    field(ZRST, "Unsorted")
    field(ONVL, "1")
    field(ONST, "Sorted")
}

record(mbbi, "$(CAM):ROI2:SortMode_RBV") {
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))SORT_MODE")
    field(ZRVL, "0")
    field(ZRST, "Unsorted")
    field(ONVL, "1")
    field(ONST, "Sorted")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):ROI2:SortTime") {
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))SORT_TIME")
    field(PREC, "3")
    field(VAL, "0.1")
}

record(ai, "$(CAM):ROI2:SortTime_RBV") {
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))SORT_TIME")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):ROI2:SortSize")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))SORT_SIZE")
    field(VAL,  "20")
    field(PINI, "YES")
}

record(longin, "$(CAM):ROI2:SortSize_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))SORT_SIZE")
    field(FLNK, "$(CAM):ROI2:SortFreeLow")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI2:SortFree") {
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))SORT_FREE")
    field(LLSV, "MAJOR")
    field(LSV,  "MINOR")
    field(LOLO, "0")
    field(HYST, "1")
    field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):ROI2:SortFreeLow") {
    field(CALC, "A*0.25")
    field(INPA, "$(CAM):ROI2:SortSize")
    field(OUT,  "$(CAM):ROI2:SortFree.LOW")
}

record(longout, "$(CAM):ROI2:DroppedOutputArrays")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))DROPPED_OUTPUT_ARRAYS")
    field(VAL,  "0")
}

record(longin, "$(CAM):ROI2:DroppedOutputArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))DROPPED_OUTPUT_ARRAYS")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):ROI2:DisorderedArrays")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))DISORDERED_ARRAYS")
    field(PINI, "YES")
}

record(longin, "$(CAM):ROI2:DisorderedArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))DISORDERED_ARRAYS")
    field(SCAN, "I/O Intr")
}



###################################################################
#  The asynRecord is used for mainly for trace mask               # 
###################################################################
 
# Set ASYN_TRACEIO_HEX bit by default
record(asyn,"$(CAM):ROI2:AsynIO")
{
    field(PORT, "ROI2")
    field(TIB2,"1")
    info("ADType", "ADPlugin")
}


###################################################################
#  These records control the label for the ROI                    #
###################################################################
record(stringout, "$(CAM):ROI2:Name")
{
   field(PINI, "YES")
   field(DTYP, "asynOctetWrite")
   field(OUT,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))NAME")
   info(autosaveFields, "VAL")
}

record(stringin, "$(CAM):ROI2:Name_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))NAME")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the ROI definition                       #
#  including binning, region start and size                       # 
###################################################################

record(longout, "$(CAM):ROI2:BinX")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))DIM0_BIN")
   field(VAL,  "1")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):ROI2:BinX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))DIM0_BIN")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):ROI2:BinY")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))DIM1_BIN")
   field(VAL,  "1")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):ROI2:BinY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))DIM1_BIN")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):ROI2:BinZ")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))DIM2_BIN")
   field(VAL,  "1")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):ROI2:BinZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))DIM2_BIN")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):ROI2:MinX")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))DIM0_MIN")
   field(LOPR, "0")
   field(VAL,  "0")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):ROI2:MinX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))DIM0_MIN")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):ROI2:MinY")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))DIM1_MIN")
   field(LOPR, "0")
   field(VAL,  "0")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):ROI2:MinY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))DIM1_MIN")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):ROI2:MinZ")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))DIM2_MIN")
   field(LOPR, "1")
   field(VAL,  "0")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):ROI2:MinZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))DIM2_MIN")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):ROI2:SizeX")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))DIM0_SIZE")
   field(VAL,  "1000000")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):ROI2:SizeX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))DIM0_SIZE")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):ROI2:SizeY")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))DIM1_SIZE")
   field(VAL,  "1000000")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):ROI2:SizeY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))DIM1_SIZE")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):ROI2:SizeZ")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))DIM2_SIZE")
   field(VAL,  "1000000")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):ROI2:SizeZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))DIM2_SIZE")
   field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):ROI2:AutoSizeX")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))DIM0_AUTO_SIZE")
   field(VAL,  "0")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):ROI2:AutoSizeX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))DIM0_AUTO_SIZE")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):ROI2:AutoSizeY")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))DIM1_AUTO_SIZE")
   field(VAL,  "0")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):ROI2:AutoSizeY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))DIM1_AUTO_SIZE")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):ROI2:AutoSizeZ")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))DIM2_AUTO_SIZE")
   field(VAL,  "0")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):ROI2:AutoSizeZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))DIM2_AUTO_SIZE")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI2:MaxSizeX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))DIM0_MAX_SIZE")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI2:MaxSizeY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))DIM1_MAX_SIZE")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI2:MaxSizeZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))DIM2_MAX_SIZE")
   field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):ROI2:ReverseX")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))DIM0_REVERSE")
   field(VAL,  "0")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):ROI2:ReverseX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))DIM0_REVERSE")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):ROI2:ReverseY")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))DIM1_REVERSE")
   field(VAL,  "0")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):ROI2:ReverseY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))DIM1_REVERSE")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):ROI2:ReverseZ")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))DIM2_REVERSE")
   field(VAL,  "0")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):ROI2:ReverseZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))DIM2_REVERSE")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI2:ArraySizeX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_X")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI2:ArraySizeY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_Y")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI2:ArraySizeZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_Z")
   field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):ROI2:EnableX")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))DIM0_ENABLE")
   field(VAL,  "1")
   field(ZNAM, "Disabled")
   field(ONAM, "Enabled")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):ROI2:EnableX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))DIM0_ENABLE")
   field(ZNAM, "Disabled")
   field(ONAM, "Enabled")
   field(ZSV,  "NO_ALARM")
   field(OSV,  "NO_ALARM")
   field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):ROI2:EnableY")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))DIM1_ENABLE")
   field(VAL,  "1")
   field(ZNAM, "Disabled")
   field(ONAM, "Enabled")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):ROI2:EnableY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))DIM1_ENABLE")
   field(ZNAM, "Disabled")
   field(ONAM, "Enabled")
   field(ZSV,  "NO_ALARM")
   field(OSV,  "NO_ALARM")
   field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):ROI2:EnableZ")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))DIM2_ENABLE")
   field(VAL,  "1")
   field(ZNAM, "Disabled")
   field(ONAM, "Enabled")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):ROI2:EnableZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))DIM2_ENABLE")
   field(ZNAM, "Disabled")
   field(ONAM, "Enabled")
   field(ZSV,  "NO_ALARM")
   field(OSV,  "NO_ALARM")
   field(SCAN, "I/O Intr")
}


###################################################################
#  These records control the scaling of the data.  Useful when    #
#  binning or converting data types                               # 
###################################################################

record(bo, "$(CAM):ROI2:EnableScale")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))ENABLE_SCALE")
   field(VAL,  "0")
   field(ZNAM, "Disabled")
   field(ONAM, "Enabled")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):ROI2:EnableScale_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))ENABLE_SCALE")
   field(ZNAM, "Disabled")
   field(ONAM, "Enabled")
   field(ZSV,  "NO_ALARM")
   field(OSV,  "MINOR")
   field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):ROI2:Scale")
{
   field(PINI, "YES")
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))SCALE_VALUE")
   field(VAL,  "1")
   info(autosaveFields, "VAL")
}

record(ai, "$(CAM):ROI2:Scale_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))SCALE_VALUE")
   field(SCAN, "I/O Intr")
}


###################################################################
#  These records control the data type of the array data          # 
#  The last entry is "Automatic" meaning preserve the data type   #
#  of the input array.                                            # 
###################################################################

record(mbbo, "$(CAM):ROI2:DataTypeOut")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))ROI_DATA_TYPE")
   field(ZRST, "Int8")
   field(ZRVL, "0")
   field(ONST, "UInt8")
   field(ONVL, "1")
   field(TWST, "Int16")
   field(TWVL, "2")
   field(THST, "UInt16")
   field(THVL, "3")
   field(FRST, "Int32")
   field(FRVL, "4")
   field(FVST, "UInt32")
   field(FVVL, "5")
   field(SXST, "Int64")
   field(SXVL, "6")
   field(SVST, "UInt64")
   field(SVVL, "7")
   field(EIST, "Float32")
   field(EIVL, "8")
   field(NIST, "Float64")
   field(NIVL, "9")
   field(TEST, "Automatic")
   field(TEVL, "-1")
   field(VAL,  "10")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):ROI2:DataTypeOut_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))ROI_DATA_TYPE")
   field(ZRST, "Int8")
   field(ZRVL, "0")
   field(ONST, "UInt8")
   field(ONVL, "1")
   field(TWST, "Int16")
   field(TWVL, "2")
   field(THST, "UInt16")
   field(THVL, "3")
   field(FRST, "Int32")
   field(FRVL, "4")
   field(FVST, "UInt32")
   field(FVVL, "5")
   field(SXST, "Int64")
   field(SXVL, "6")
   field(SVST, "UInt64")
   field(SVVL, "7")
   field(EIST, "Float32")
   field(EIVL, "8")
   field(NIST, "Float64")
   field(NIVL, "9")
   field(TEST, "Automatic")
   field(TEVL, "-1")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records set the HOPR and LOPR values for the position    #
#  and size to the maximum for the input array                    #
###################################################################

record(longin, "$(CAM):ROI2:MaxX")
{
    field(INP,  "$(CAM):ROI2:MaxSizeX_RBV CP")
    field(FLNK, "$(CAM):ROI2:SetXHOPR.PROC PP")
}

record(dfanout, "$(CAM):ROI2:SetXHOPR")
{
    field(DOL,  "$(CAM):ROI2:MaxX NPP")
    field(OMSL, "closed_loop")
    field(OUTA, "$(CAM):ROI2:MinX.HOPR NPP")
    field(OUTB, "$(CAM):ROI2:SizeX.HOPR NPP")
}

record(longin, "$(CAM):ROI2:MaxY")
{
    field(INP,  "$(CAM):ROI2:MaxSizeY_RBV CP")
    field(FLNK, "$(CAM):ROI2:SetYHOPR.PROC PP")
}

record(dfanout, "$(CAM):ROI2:SetYHOPR")
{
    field(DOL,  "$(CAM):ROI2:MaxY NPP")
    field(OMSL, "closed_loop")
    field(OUTA, "$(CAM):ROI2:MinY.HOPR NPP")
    field(OUTB, "$(CAM):ROI2:SizeY.HOPR NPP")
}

###################################################################
#  These records whether dimensions of 1 are collapsed (removed)  #                               # 
###################################################################

record(bo, "$(CAM):ROI2:CollapseDims")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))COLLAPSE_DIMS")
   field(VAL,  "0")
   field(ZNAM, "Disabled")
   field(ONAM, "Enabled")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):ROI2:CollapseDims_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI2,$(ADDR=0),$(TIMEOUT=1))COLLAPSE_DIMS")
   field(ZNAM, "Disabled")
   field(ONAM, "Enabled")
   field(ZSV,  "NO_ALARM")
   field(OSV,  "MINOR")
   field(SCAN, "I/O Intr")
}


#=================================================================#
# Template file: NDROI.template
# Database for ND ROIs
# Mark Rivers
# April 22, 2008

#=================================================================#
# Template file: NDPluginBase.template
# Database for NDPluginBase, i.e. records common to all plugins
# Mark Rivers
# April 25, 2008

#=================================================================#
# Template file: NDArrayBase.template
# Database for area detector control using asyn driver and standard asyn device support
# Mark Rivers
# March 9, 2008

###################################################################
#  This record contains the version of ADCore                     #
###################################################################

record(stringin, "$(CAM):ROI3:ADCoreVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))ADCORE_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the version of the driver or plugin       #
###################################################################

record(stringin, "$(CAM):ROI3:DriverVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))DRIVER_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the asyn port name of this detector       #
###################################################################

record(stringin, "$(CAM):ROI3:PortName_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))PORT_NAME_SELF")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records contain basic information about the detector     # 
###################################################################

record(stringin, "$(CAM):ROI3:Manufacturer_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))MANUFACTURER")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):ROI3:Model_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))MODEL")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):ROI3:SerialNumber_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))SERIAL_NUMBER")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):ROI3:SDKVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))SDK_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):ROI3:FirmwareVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))FIRMWARE_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control acquisition start and stop               #
###################################################################

record(bo, "$(CAM):ROI3:Acquire") {
   field(DTYP, "asynInt32")
   field(OUT, "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))ACQUIRE")
   field(ZNAM, "Done")
   field(ONAM, "Acquire")
   field(VAL,  "0")
   field(FLNK, "$(CAM):ROI3:SetAcquireBusy")
   info(asyn:READBACK, "1")
}

record(bi, "$(CAM):ROI3:Acquire_RBV") {
   field(DTYP, "asynInt32")
   field(INP, "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))ACQUIRE")
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):ROI3:SetAcquireBusy")
{
    field(INPA, "$(CAM):ROI3:Acquire NPP")
    field(CALC, "A")
    field(OOPT, "Transition To Non-zero")
    field(OUT,  "$(CAM):ROI3:AcquireBusy PP")
}

record(busy, "$(CAM):ROI3:AcquireBusy") {
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(VAL,  "0")
}

record(bi, "$(CAM):ROI3:AcquireBusyCB") {
   field(DTYP, "asynInt32")
   field(INP, "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))ACQUIRE_BUSY")
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):ROI3:ClearAcquireBusy") {
    field(INPA, "$(CAM):ROI3:AcquireBusyCB CP")
    field(CALC, "A")
    field(OOPT, "Transition To Zero")
    field(OUT,  "$(CAM):ROI3:AcquireBusy PP")
}

record(bo, "$(CAM):ROI3:WaitForPlugins") {
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT, "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))WAIT_FOR_PLUGINS")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(VAL,  "0")
}

###################################################################
#  These records are the array size and data type                 #
###################################################################
# The number of dimensions
record(longout, "$(CAM):ROI3:NDimensions")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))ARRAY_NDIMENSIONS")
}

record(longin, "$(CAM):ROI3:NDimensions_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))ARRAY_NDIMENSIONS")
    field(SCAN, "I/O Intr")
}

# The array dimensions waveform records
record(waveform, "$(CAM):ROI3:Dimensions")
{
    field(DTYP, "asynInt32ArrayOut")
    field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))ARRAY_DIMENSIONS")
    field(FTVL, "LONG")
    field(NELM, "10")
    field(FLNK, "$(CAM):ROI3:Dim0SA")
}

record(subArray, "$(CAM):ROI3:Dim0SA")
{
    field(INP,  "$(CAM):ROI3:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "0")
    field(FLNK, "$(CAM):ROI3:ArraySize0")
}

record(longin, "$(CAM):ROI3:ArraySize0")
{
    field(INP,  "$(CAM):ROI3:Dim0SA")
    field(FLNK, "$(CAM):ROI3:Dim1SA")
}

record(subArray, "$(CAM):ROI3:Dim1SA")
{
    field(INP,  "$(CAM):ROI3:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "1")
    field(FLNK, "$(CAM):ROI3:ArraySize1")
}

record(longin, "$(CAM):ROI3:ArraySize1")
{
    field(INP,  "$(CAM):ROI3:Dim1SA")
    field(FLNK, "$(CAM):ROI3:Dim2SA")
}

record(subArray, "$(CAM):ROI3:Dim2SA")
{
    field(INP,  "$(CAM):ROI3:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "2")
    field(FLNK, "$(CAM):ROI3:ArraySize2")
}

record(longin, "$(CAM):ROI3:ArraySize2")
{
    field(INP,  "$(CAM):ROI3:Dim2SA")
    field(FLNK, "$(CAM):ROI3:Dim3SA")
}

record(subArray, "$(CAM):ROI3:Dim3SA")
{
    field(INP,  "$(CAM):ROI3:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "3")
    field(FLNK, "$(CAM):ROI3:ArraySize3")
}

record(longin, "$(CAM):ROI3:ArraySize3")
{
    field(INP,  "$(CAM):ROI3:Dim3SA")
    field(FLNK, "$(CAM):ROI3:Dim4SA")
}

record(subArray, "$(CAM):ROI3:Dim4SA")
{
    field(INP,  "$(CAM):ROI3:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "4")
    field(FLNK, "$(CAM):ROI3:ArraySize4")
}

record(longin, "$(CAM):ROI3:ArraySize4")
{
    field(INP,  "$(CAM):ROI3:Dim4SA")
    field(FLNK, "$(CAM):ROI3:Dim5SA")
}

record(subArray, "$(CAM):ROI3:Dim5SA")
{
    field(INP,  "$(CAM):ROI3:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "5")
    field(FLNK, "$(CAM):ROI3:ArraySize5")
}

record(longin, "$(CAM):ROI3:ArraySize5")
{
    field(INP,  "$(CAM):ROI3:Dim5SA")
    field(FLNK, "$(CAM):ROI3:Dim6SA")
}

record(subArray, "$(CAM):ROI3:Dim6SA")
{
    field(INP,  "$(CAM):ROI3:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "6")
    field(FLNK, "$(CAM):ROI3:ArraySize6")
}

record(longin, "$(CAM):ROI3:ArraySize6")
{
    field(INP,  "$(CAM):ROI3:Dim6SA")
    field(FLNK, "$(CAM):ROI3:Dim7SA")
}

record(subArray, "$(CAM):ROI3:Dim7SA")
{
    field(INP,  "$(CAM):ROI3:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "7")
    field(FLNK, "$(CAM):ROI3:ArraySize7")
}

record(longin, "$(CAM):ROI3:ArraySize7")
{
    field(INP,  "$(CAM):ROI3:Dim7SA")
    field(FLNK, "$(CAM):ROI3:Dim8SA")
}

record(subArray, "$(CAM):ROI3:Dim8SA")
{
    field(INP,  "$(CAM):ROI3:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "8")
    field(FLNK, "$(CAM):ROI3:ArraySize8")
}

record(longin, "$(CAM):ROI3:ArraySize8")
{
    field(INP,  "$(CAM):ROI3:Dim8SA")
    field(FLNK, "$(CAM):ROI3:Dim9SA")
}

record(subArray, "$(CAM):ROI3:Dim9SA")
{
    field(INP,  "$(CAM):ROI3:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "9")
    field(FLNK, "$(CAM):ROI3:ArraySize9")
}

record(longin, "$(CAM):ROI3:ArraySize9")
{
    field(INP,  "$(CAM):ROI3:Dim9SA")
}


record(waveform, "$(CAM):ROI3:Dimensions_RBV")
{
    field(DTYP, "asynInt32ArrayIn")
    field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))ARRAY_DIMENSIONS")
    field(FTVL, "LONG")
    field(NELM, "10")
    field(FLNK, "$(CAM):ROI3:Dim0SA_RBV")
    field(SCAN, "I/O Intr")
}

record(subArray, "$(CAM):ROI3:Dim0SA_RBV")
{
    field(INP,  "$(CAM):ROI3:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "0")
    field(FLNK, "$(CAM):ROI3:ArraySize0_RBV")
}

record(longin, "$(CAM):ROI3:ArraySize0_RBV")
{
    field(INP,  "$(CAM):ROI3:Dim0SA_RBV")
    field(FLNK, "$(CAM):ROI3:Dim1SA_RBV")
}

record(subArray, "$(CAM):ROI3:Dim1SA_RBV")
{
    field(INP,  "$(CAM):ROI3:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "1")
    field(FLNK, "$(CAM):ROI3:ArraySize1_RBV")
}

record(longin, "$(CAM):ROI3:ArraySize1_RBV")
{
    field(INP,  "$(CAM):ROI3:Dim1SA_RBV")
    field(FLNK, "$(CAM):ROI3:Dim2SA_RBV")
}

record(subArray, "$(CAM):ROI3:Dim2SA_RBV")
{
    field(INP,  "$(CAM):ROI3:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "2")
    field(FLNK, "$(CAM):ROI3:ArraySize2_RBV")
}

record(longin, "$(CAM):ROI3:ArraySize2_RBV")
{
    field(INP,  "$(CAM):ROI3:Dim2SA_RBV")
    field(FLNK, "$(CAM):ROI3:Dim3SA_RBV")
}

record(subArray, "$(CAM):ROI3:Dim3SA_RBV")
{
    field(INP,  "$(CAM):ROI3:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "3")
    field(FLNK, "$(CAM):ROI3:ArraySize3_RBV")
}

record(longin, "$(CAM):ROI3:ArraySize3_RBV")
{
    field(INP,  "$(CAM):ROI3:Dim3SA_RBV")
    field(FLNK, "$(CAM):ROI3:Dim4SA_RBV")
}

record(subArray, "$(CAM):ROI3:Dim4SA_RBV")
{
    field(INP,  "$(CAM):ROI3:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "4")
    field(FLNK, "$(CAM):ROI3:ArraySize4_RBV")
}

record(longin, "$(CAM):ROI3:ArraySize4_RBV")
{
    field(INP,  "$(CAM):ROI3:Dim4SA_RBV")
    field(FLNK, "$(CAM):ROI3:Dim5SA_RBV")
}

record(subArray, "$(CAM):ROI3:Dim5SA_RBV")
{
    field(INP,  "$(CAM):ROI3:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "5")
    field(FLNK, "$(CAM):ROI3:ArraySize5_RBV")
}

record(longin, "$(CAM):ROI3:ArraySize5_RBV")
{
    field(INP,  "$(CAM):ROI3:Dim5SA_RBV")
    field(FLNK, "$(CAM):ROI3:Dim6SA_RBV")
}

record(subArray, "$(CAM):ROI3:Dim6SA_RBV")
{
    field(INP,  "$(CAM):ROI3:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "6")
    field(FLNK, "$(CAM):ROI3:ArraySize6_RBV")
}

record(longin, "$(CAM):ROI3:ArraySize6_RBV")
{
    field(INP,  "$(CAM):ROI3:Dim6SA_RBV")
    field(FLNK, "$(CAM):ROI3:Dim7SA_RBV")
}

record(subArray, "$(CAM):ROI3:Dim7SA_RBV")
{
    field(INP,  "$(CAM):ROI3:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "7")
    field(FLNK, "$(CAM):ROI3:ArraySize7_RBV")
}

record(longin, "$(CAM):ROI3:ArraySize7_RBV")
{
    field(INP,  "$(CAM):ROI3:Dim7SA_RBV")
    field(FLNK, "$(CAM):ROI3:Dim8SA_RBV")
}

record(subArray, "$(CAM):ROI3:Dim8SA_RBV")
{
    field(INP,  "$(CAM):ROI3:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "8")
    field(FLNK, "$(CAM):ROI3:ArraySize8_RBV")
}

record(longin, "$(CAM):ROI3:ArraySize8_RBV")
{
    field(INP,  "$(CAM):ROI3:Dim8SA_RBV")
    field(FLNK, "$(CAM):ROI3:Dim9SA_RBV")
}

record(subArray, "$(CAM):ROI3:Dim9SA_RBV")
{
    field(INP,  "$(CAM):ROI3:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "9")
    field(FLNK, "$(CAM):ROI3:ArraySize9_RBV")
}

record(longin, "$(CAM):ROI3:ArraySize9_RBV")
{
    field(INP,  "$(CAM):ROI3:Dim9SA_RBV")
}


record(mbbi, "$(CAM):ROI3:BayerPattern_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))BAYER_PATTERN")
   field(ZRST, "RGGB")
   field(ZRVL, "0")
   field(ONST, "GBRG")
   field(ONVL, "1")
   field(TWST, "GRBG")
   field(TWVL, "2")
   field(THST, "BGGR")
   field(THVL, "3")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI3:ArraySizeX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_X")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI3:ArraySizeY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_Y")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI3:ArraySizeZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_Z")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI3:ArraySize_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records have information on the compression              # 
###################################################################
record(stringin, "$(CAM):ROI3:Codec_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))CODEC")
   field(VAL,  "")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI3:CompressedSize_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))COMPRESSED_SIZE")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the data type                            # 
###################################################################

record(mbbo, "$(CAM):ROI3:DataType")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))DATA_TYPE")
   field(ZRST, "Int8")
   field(ZRVL, "0")
   field(ONST, "UInt8")
   field(ONVL, "1")
   field(TWST, "Int16")
   field(TWVL, "2")
   field(THST, "UInt16")
   field(THVL, "3")
   field(FRST, "Int32")
   field(FRVL, "4")
   field(FVST, "UInt32")
   field(FVVL, "5")
   field(SXST, "Int64")
   field(SXVL, "6")
   field(SVST, "UInt64")
   field(SVVL, "7")
   field(EIST, "Float32")
   field(EIVL, "8")
   field(NIST, "Float64")
   field(NIVL, "9")
   field(VAL,  "0")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):ROI3:DataType_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))DATA_TYPE")
   field(ZRST, "Int8")
   field(ZRVL, "0")
   field(ONST, "UInt8")
   field(ONVL, "1")
   field(TWST, "Int16")
   field(TWVL, "2")
   field(THST, "UInt16")
   field(THVL, "3")
   field(FRST, "Int32")
   field(FRVL, "4")
   field(FVST, "UInt32")
   field(FVVL, "5")
   field(SXST, "Int64")
   field(SXVL, "6")
   field(SVST, "UInt64")
   field(SVVL, "7")
   field(EIST, "Float32")
   field(EIVL, "8")
   field(NIST, "Float64")
   field(NIVL, "9")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI3:BitsPerPixel_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))BITS_PER_PIXEL")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the color mode                           #
#  These choices must agree with NDColorMode_t in NDArray.h       # 
###################################################################

record(mbbo, "$(CAM):ROI3:ColorMode")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))COLOR_MODE")
   field(ZRST, "Mono")
   field(ZRVL, "0")
   field(ONST, "Bayer")
   field(ONVL, "1")
   field(TWST, "RGB1")
   field(TWVL, "2")
   field(THST, "RGB2")
   field(THVL, "3")
   field(FRST, "RGB3")
   field(FRVL, "4")
   field(FVST, "YUV444")
   field(FVVL, "5")
   field(SXST, "YUV422")
   field(SXVL, "6")
   field(SVST, "YUV421")
   field(SVVL, "7")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):ROI3:ColorMode_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))COLOR_MODE")
   field(ZRST, "Mono")
   field(ZRVL, "0")
   field(ONST, "Bayer")
   field(ONVL, "1")
   field(TWST, "RGB1")
   field(TWVL, "2")
   field(THST, "RGB2")
   field(THVL, "3")
   field(FRST, "RGB3")
   field(FRVL, "4")
   field(FVST, "YUV444")
   field(FVVL, "5")
   field(SXST, "YUV422")
   field(SXVL, "6")
   field(SVST, "YUV421")
   field(SVVL, "7")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records are the uniqueId and time stamps of the array     #
###################################################################
record(longin, "$(CAM):ROI3:UniqueId_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))UNIQUE_ID")
    field(SCAN, "I/O Intr")
}

record(ai, "$(CAM):ROI3:TimeStamp_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))TIME_STAMP")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI3:EpicsTSSec_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))EPICS_TS_SEC")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI3:EpicsTSNsec_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))EPICS_TS_NSEC")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records provide statistics on array callbacks and        #
#  array callback rates                                           # 
###################################################################
record(longout, "$(CAM):ROI3:ArrayCounter")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))ARRAY_COUNTER")
}

record(longin, "$(CAM):ROI3:ArrayCounter_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))ARRAY_COUNTER")
    field(SCAN, "I/O Intr")
    field(TSE,  "-2")
    field(LOW,  "0" )
    field(LSV,  "MINOR" )
    info(autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV TSE")
}

# Updated rate calculation to use a smoothing factor w/ guard against negative values
# 0 rate sets alarm state to MINOR
record(calc, "$(CAM):ROI3:ArrayRate_RBV")
{
    field(INPA, "$(CAM):ROI3:ArrayRate_RBV.LB NPP NMS")   # Previous counter (Last B value)
    field(INPB, "$(CAM):ROI3:ArrayCounter_RBV NPP NMS")   # Current counter value
    field(INPC, "1.0")                                # Delta time in seconds
    field(INPD, "$(CAM):ROI3:ArrayRate_RBV.VAL NPP NMS")  # Previous rate
    field(INPE, "0.0")                 # Smoothing factor
    field(CALC, "(D*E)/C+MAX(0,B-A)*(1-E)/C")
    field(PREC, "2" )
    field(EGU,  "Hz" )
    field(SCAN, "1 second")
    field(LOW,  "0")
    field(LSV,  "MINOR")
    field(ADEL, "0.1")
    info(autosaveFields, "ADEL DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV MDEL PREC C E SCAN EGU")
}

###################################################################
#  These records control NDArray callacks                         # 
###################################################################
record(bo, "$(CAM):ROI3:ArrayCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))ARRAY_CALLBACKS")
    field(ZNAM, "Disable")
    field(ZSV,  "MINOR")
    field(ONAM, "Enable")
    field(OSV,  "NO_ALARM")
    field(VAL, "1")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):ROI3:ArrayCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))ARRAY_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ZSV,  "MINOR")
    field(ONAM, "Enabled")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains macro definitions for the attributes      # 
###################################################################

record(waveform, "$(CAM):ROI3:NDAttributesMacros")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_MACROS")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

###################################################################
#  This record is the name of a file defining attributes          # 
###################################################################

record(waveform, "$(CAM):ROI3:NDAttributesFile")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_FILE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

###################################################################
#  This record defines the status of reading attributes file      # 
###################################################################

record(mbbi, "$(CAM):ROI3:NDAttributesStatus")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_STATUS")
    field(ZRVL, "0")
    field(ZRST, "Attributes file OK")
    field(ZRSV, "NO_ALARM")
    field(ONVL, "1")
    field(ONST, "File not found")
    field(ONSV, "MINOR")
    field(TWVL, "2")
    field(TWST, "XML syntax error")
    field(TWSV, "MAJOR")
    field(THVL, "3")
    field(THST, "Macro substitution error")
    field(THSV, "MAJOR")
    field(SCAN, "I/O Intr")
}

###################################################################
#  Status of NDArrayPool - number of buffers, memory used etc.    # 
###################################################################

record(ai, "$(CAM):ROI3:PoolMaxMem")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))POOL_MAX_MEMORY")
   field(PREC, "1")
   field(EGU,  "MB")
   field(SCAN, "Passive")
   field(PINI, "YES")
}

record(ai, "$(CAM):ROI3:PoolUsedMem")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))POOL_USED_MEMORY")
   field(PREC, "1")
   field(EGU,  "MB")
   field(SCAN, "1 second")
   field(FLNK, "$(CAM):ROI3:PoolAllocBuffers")
   info(autosaveFields, "SCAN")
}

record(longin, "$(CAM):ROI3:PoolAllocBuffers")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))POOL_ALLOC_BUFFERS")
   field(FLNK, "$(CAM):ROI3:PoolFreeBuffers")
}

record(longin, "$(CAM):ROI3:PoolFreeBuffers")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))POOL_FREE_BUFFERS")
   field(FLNK, "$(CAM):ROI3:PoolUsedBuffers")
}

record(calc, "$(CAM):ROI3:PoolUsedBuffers")
{
    field(INPA, "$(CAM):ROI3:PoolAllocBuffers NPP MS")
    field(INPB, "$(CAM):ROI3:PoolFreeBuffers NPP MS")
    field(CALC, "A-B")
}

record(bo, "$(CAM):ROI3:EmptyFreeList")
{
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))POOL_EMPTY_FREELIST")
}

record(longin, "$(CAM):ROI3:NumQueuedArrays")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))NUM_QUEUED_ARRAYS")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the type of plugin                        #
###################################################################

record(stringin, "$(CAM):ROI3:PluginType_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))PLUGIN_TYPE")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the connection of the server to          #
#  an NDArray driver port and address                             #
###################################################################
# Array port name
record(stringout, "$(CAM):ROI3:NDArrayPort")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(OUT,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))NDARRAY_PORT")
    field(VAL,  "$(CAM_PORT)")
    info(autosaveFields, "DESC VAL")
}

record(stringin, "$(CAM):ROI3:NDArrayPort_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))NDARRAY_PORT")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):ROI3:NDArrayAddress")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))NDARRAY_ADDR")
    field(VAL,  "$(NDARRAY_ADDR=0)")
    info(autosaveFields, "DESC VAL")
}

record(longin, "$(CAM):ROI3:NDArrayAddress_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))NDARRAY_ADDR")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control whether callbacks are enabled and        #
#  minimum time between callbacks                                 #
###################################################################
record(bo, "$(CAM):ROI3:EnableCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))ENABLE_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    field(VAL,  "0")
    info(autosaveFields, "DESC VAL")
}

record(bi, "$(CAM):ROI3:EnableCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))ENABLE_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    field(ZSV,  "MINOR")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):ROI3:MinCallbackTime")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))MIN_CALLBACK_TIME")
    field(EGU,  "s")
    field(PREC, "3")
    field(VAL,  "0.0")
    field(DRVL, "0")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):ROI3:MinCallbackTime_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))MIN_CALLBACK_TIME")
    field(EGU,  "s")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):ROI3:MaxArrayRate")
{
    field(DTYP, "Soft Channel")
    field(OUT,  "$(CAM):ROI3:MaxArrayRate_COUT PP")
    field(EGU,  "Hz")
    field(PREC, "3")
    field(VAL,  "0.0")
    info(autosaveFields, "VAL")
}

record(calcout, "$(CAM):ROI3:MaxArrayRate_COUT")
{
    field(INPA, "$(CAM):ROI3:MaxArrayRate")
    field(CALC, "A=0?0:1.0/A")
    field(OUT,  "$(CAM):ROI3:MinCallbackTime PP")
}

record(calc, "$(CAM):ROI3:MaxArrayRate_RBV")
{
    field(INPA, "$(CAM):ROI3:MinCallbackTime_RBV CP")
    field(CALC, "A=0?0:1.0/A")
    field(EGU,  "Hz")
    field(PREC, "3")
    field(SCAN, "Passive")
}

record(ao, "$(CAM):ROI3:MaxByteRate")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))MAX_BYTE_RATE")
    field(EGU,  "s")
    field(PREC, "3")
    field(VAL,  "0.0")
    field(DRVL, "0")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):ROI3:MaxByteRate_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))MAX_BYTE_RATE")
    field(EGU,  "s")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the last execution time of the plugin     #
###################################################################
record(ai, "$(CAM):ROI3:ExecutionTime_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))EXECUTION_TIME")
    field(EGU,  "ms")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record requests that the plugin execute again with the    #
#  same NDArray                                                   #
###################################################################
record(bo, "$(CAM):ROI3:ProcessPlugin")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))PROCESS_PLUGIN")
    field(VAL,  "1")
}

###################################################################
#  These records control whether callbacks block or not           #
###################################################################
record(bo, "$(CAM):ROI3:BlockingCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))BLOCKING_CALLBACKS")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(VAL,  "0")
    info(autosaveFields, "DESC ZSV OSV VAL")
}

record(bi, "$(CAM):ROI3:BlockingCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))BLOCKING_CALLBACKS")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(ZSV,  "NO_ALARM")
    field(OSV,  "MINOR")
    field(SCAN, "I/O Intr")
    info( autosaveFields, "DESC ZSV OSV" )
}


record(longout, "$(CAM):ROI3:DroppedArrays")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))DROPPED_ARRAYS")
    field(VAL,  "0")
    info( autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV EGU" )
}

record(longin, "$(CAM):ROI3:DroppedArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))DROPPED_ARRAYS")
    field(SCAN, "I/O Intr")
    field(HIGH, "1")
    field(HSV,  "MINOR")
    info( autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV EGU" )
}

record(longout, "$(CAM):ROI3:QueueSize")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))QUEUE_SIZE")
    field(PINI, "YES")
    info( autosaveFields, "DESC EGU" )
}

record(longin, "$(CAM):ROI3:QueueSize_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))QUEUE_SIZE")
    field(FLNK, "$(CAM):ROI3:QueueFreeLow")
    field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):ROI3:QueueFreeLow") {
    field(CALC, "A*0.25")
    field(INPA, "$(CAM):ROI3:QueueSize")
    field(OUT,  "$(CAM):ROI3:QueueFree.LOW")
    field(FLNK, "$(CAM):ROI3:QueueUseHIGH")
}

# Set a HIGH warning level for the input queue fill level to 75%
# of the full size of the queue
record(calcout, "$(CAM):ROI3:QueueUseHIGH") {
   field(CALC, "A*0.75")
   field(INPA, "$(CAM):ROI3:QueueSize")
   field(OUT,  "$(CAM):ROI3:QueueUse.HIGH")
   field(FLNK, "$(CAM):ROI3:QueueUseHIHI")
}

# Set a HIHI level for the input queue fill level to indicate an error
# (MAJOR alarm)  when it fills up to the full size of the queue (frames start dropping)
record(calcout, "$(CAM):ROI3:QueueUseHIHI") {
   field(CALC, "A*1.0")
   field(INPA, "$(CAM):ROI3:QueueSize")
   field(OUT,  "$(CAM):ROI3:QueueUse.HIHI")
}

record(longin, "$(CAM):ROI3:QueueFree")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))QUEUE_FREE")
    field(LLSV, "MAJOR")
    field(LSV,  "MINOR")
    field(LOLO, "0")
    field(HYST, "1")
    field(SCAN, "I/O Intr")
}

# Display the fill level on the plugins input queue
record(calc, "$(CAM):ROI3:QueueUse") {
    field(CALC, "A-B")
    field(INPA, "$(CAM):ROI3:QueueSize")
    field(INPB, "$(CAM):ROI3:QueueFree CP")
    field(SCAN, "Passive")
    field(HHSV, "MAJOR")
    field(HSV,  "MINOR")
    field(HYST, "1")
}

record(longout, "$(CAM):ROI3:NumThreads")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))NUM_THREADS")
    field(VAL,  "1")
    field(PINI, "YES")
    info(autosaveFields, "DESC VAL")
}

record(longin, "$(CAM):ROI3:NumThreads_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))NUM_THREADS")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI3:MaxThreads_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))MAX_THREADS")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control output array sorting                     #
###################################################################
record(mbbo, "$(CAM):ROI3:SortMode") {
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))SORT_MODE")
    field(ZRVL, "0")
    field(ZRST, "Unsorted")
    field(ONVL, "1")
    field(ONST, "Sorted")
}

record(mbbi, "$(CAM):ROI3:SortMode_RBV") {
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))SORT_MODE")
    field(ZRVL, "0")
    field(ZRST, "Unsorted")
    field(ONVL, "1")
    field(ONST, "Sorted")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):ROI3:SortTime") {
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))SORT_TIME")
    field(PREC, "3")
    field(VAL, "0.1")
}

record(ai, "$(CAM):ROI3:SortTime_RBV") {
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))SORT_TIME")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):ROI3:SortSize")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))SORT_SIZE")
    field(VAL,  "20")
    field(PINI, "YES")
}

record(longin, "$(CAM):ROI3:SortSize_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))SORT_SIZE")
    field(FLNK, "$(CAM):ROI3:SortFreeLow")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI3:SortFree") {
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))SORT_FREE")
    field(LLSV, "MAJOR")
    field(LSV,  "MINOR")
    field(LOLO, "0")
    field(HYST, "1")
    field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):ROI3:SortFreeLow") {
    field(CALC, "A*0.25")
    field(INPA, "$(CAM):ROI3:SortSize")
    field(OUT,  "$(CAM):ROI3:SortFree.LOW")
}

record(longout, "$(CAM):ROI3:DroppedOutputArrays")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))DROPPED_OUTPUT_ARRAYS")
    field(VAL,  "0")
}

record(longin, "$(CAM):ROI3:DroppedOutputArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))DROPPED_OUTPUT_ARRAYS")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):ROI3:DisorderedArrays")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))DISORDERED_ARRAYS")
    field(PINI, "YES")
}

record(longin, "$(CAM):ROI3:DisorderedArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))DISORDERED_ARRAYS")
    field(SCAN, "I/O Intr")
}



###################################################################
#  The asynRecord is used for mainly for trace mask               # 
###################################################################
 
# Set ASYN_TRACEIO_HEX bit by default
record(asyn,"$(CAM):ROI3:AsynIO")
{
    field(PORT, "ROI3")
    field(TIB2,"1")
    info("ADType", "ADPlugin")
}


###################################################################
#  These records control the label for the ROI                    #
###################################################################
record(stringout, "$(CAM):ROI3:Name")
{
   field(PINI, "YES")
   field(DTYP, "asynOctetWrite")
   field(OUT,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))NAME")
   info(autosaveFields, "VAL")
}

record(stringin, "$(CAM):ROI3:Name_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))NAME")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the ROI definition                       #
#  including binning, region start and size                       # 
###################################################################

record(longout, "$(CAM):ROI3:BinX")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))DIM0_BIN")
   field(VAL,  "1")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):ROI3:BinX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))DIM0_BIN")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):ROI3:BinY")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))DIM1_BIN")
   field(VAL,  "1")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):ROI3:BinY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))DIM1_BIN")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):ROI3:BinZ")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))DIM2_BIN")
   field(VAL,  "1")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):ROI3:BinZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))DIM2_BIN")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):ROI3:MinX")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))DIM0_MIN")
   field(LOPR, "0")
   field(VAL,  "0")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):ROI3:MinX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))DIM0_MIN")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):ROI3:MinY")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))DIM1_MIN")
   field(LOPR, "0")
   field(VAL,  "0")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):ROI3:MinY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))DIM1_MIN")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):ROI3:MinZ")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))DIM2_MIN")
   field(LOPR, "1")
   field(VAL,  "0")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):ROI3:MinZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))DIM2_MIN")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):ROI3:SizeX")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))DIM0_SIZE")
   field(VAL,  "1000000")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):ROI3:SizeX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))DIM0_SIZE")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):ROI3:SizeY")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))DIM1_SIZE")
   field(VAL,  "1000000")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):ROI3:SizeY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))DIM1_SIZE")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):ROI3:SizeZ")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))DIM2_SIZE")
   field(VAL,  "1000000")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):ROI3:SizeZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))DIM2_SIZE")
   field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):ROI3:AutoSizeX")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))DIM0_AUTO_SIZE")
   field(VAL,  "0")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):ROI3:AutoSizeX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))DIM0_AUTO_SIZE")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):ROI3:AutoSizeY")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))DIM1_AUTO_SIZE")
   field(VAL,  "0")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):ROI3:AutoSizeY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))DIM1_AUTO_SIZE")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):ROI3:AutoSizeZ")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))DIM2_AUTO_SIZE")
   field(VAL,  "0")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):ROI3:AutoSizeZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))DIM2_AUTO_SIZE")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI3:MaxSizeX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))DIM0_MAX_SIZE")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI3:MaxSizeY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))DIM1_MAX_SIZE")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI3:MaxSizeZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))DIM2_MAX_SIZE")
   field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):ROI3:ReverseX")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))DIM0_REVERSE")
   field(VAL,  "0")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):ROI3:ReverseX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))DIM0_REVERSE")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):ROI3:ReverseY")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))DIM1_REVERSE")
   field(VAL,  "0")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):ROI3:ReverseY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))DIM1_REVERSE")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):ROI3:ReverseZ")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))DIM2_REVERSE")
   field(VAL,  "0")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):ROI3:ReverseZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))DIM2_REVERSE")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI3:ArraySizeX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_X")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI3:ArraySizeY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_Y")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI3:ArraySizeZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_Z")
   field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):ROI3:EnableX")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))DIM0_ENABLE")
   field(VAL,  "1")
   field(ZNAM, "Disabled")
   field(ONAM, "Enabled")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):ROI3:EnableX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))DIM0_ENABLE")
   field(ZNAM, "Disabled")
   field(ONAM, "Enabled")
   field(ZSV,  "NO_ALARM")
   field(OSV,  "NO_ALARM")
   field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):ROI3:EnableY")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))DIM1_ENABLE")
   field(VAL,  "1")
   field(ZNAM, "Disabled")
   field(ONAM, "Enabled")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):ROI3:EnableY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))DIM1_ENABLE")
   field(ZNAM, "Disabled")
   field(ONAM, "Enabled")
   field(ZSV,  "NO_ALARM")
   field(OSV,  "NO_ALARM")
   field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):ROI3:EnableZ")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))DIM2_ENABLE")
   field(VAL,  "1")
   field(ZNAM, "Disabled")
   field(ONAM, "Enabled")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):ROI3:EnableZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))DIM2_ENABLE")
   field(ZNAM, "Disabled")
   field(ONAM, "Enabled")
   field(ZSV,  "NO_ALARM")
   field(OSV,  "NO_ALARM")
   field(SCAN, "I/O Intr")
}


###################################################################
#  These records control the scaling of the data.  Useful when    #
#  binning or converting data types                               # 
###################################################################

record(bo, "$(CAM):ROI3:EnableScale")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))ENABLE_SCALE")
   field(VAL,  "0")
   field(ZNAM, "Disabled")
   field(ONAM, "Enabled")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):ROI3:EnableScale_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))ENABLE_SCALE")
   field(ZNAM, "Disabled")
   field(ONAM, "Enabled")
   field(ZSV,  "NO_ALARM")
   field(OSV,  "MINOR")
   field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):ROI3:Scale")
{
   field(PINI, "YES")
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))SCALE_VALUE")
   field(VAL,  "1")
   info(autosaveFields, "VAL")
}

record(ai, "$(CAM):ROI3:Scale_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))SCALE_VALUE")
   field(SCAN, "I/O Intr")
}


###################################################################
#  These records control the data type of the array data          # 
#  The last entry is "Automatic" meaning preserve the data type   #
#  of the input array.                                            # 
###################################################################

record(mbbo, "$(CAM):ROI3:DataTypeOut")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))ROI_DATA_TYPE")
   field(ZRST, "Int8")
   field(ZRVL, "0")
   field(ONST, "UInt8")
   field(ONVL, "1")
   field(TWST, "Int16")
   field(TWVL, "2")
   field(THST, "UInt16")
   field(THVL, "3")
   field(FRST, "Int32")
   field(FRVL, "4")
   field(FVST, "UInt32")
   field(FVVL, "5")
   field(SXST, "Int64")
   field(SXVL, "6")
   field(SVST, "UInt64")
   field(SVVL, "7")
   field(EIST, "Float32")
   field(EIVL, "8")
   field(NIST, "Float64")
   field(NIVL, "9")
   field(TEST, "Automatic")
   field(TEVL, "-1")
   field(VAL,  "10")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):ROI3:DataTypeOut_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))ROI_DATA_TYPE")
   field(ZRST, "Int8")
   field(ZRVL, "0")
   field(ONST, "UInt8")
   field(ONVL, "1")
   field(TWST, "Int16")
   field(TWVL, "2")
   field(THST, "UInt16")
   field(THVL, "3")
   field(FRST, "Int32")
   field(FRVL, "4")
   field(FVST, "UInt32")
   field(FVVL, "5")
   field(SXST, "Int64")
   field(SXVL, "6")
   field(SVST, "UInt64")
   field(SVVL, "7")
   field(EIST, "Float32")
   field(EIVL, "8")
   field(NIST, "Float64")
   field(NIVL, "9")
   field(TEST, "Automatic")
   field(TEVL, "-1")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records set the HOPR and LOPR values for the position    #
#  and size to the maximum for the input array                    #
###################################################################

record(longin, "$(CAM):ROI3:MaxX")
{
    field(INP,  "$(CAM):ROI3:MaxSizeX_RBV CP")
    field(FLNK, "$(CAM):ROI3:SetXHOPR.PROC PP")
}

record(dfanout, "$(CAM):ROI3:SetXHOPR")
{
    field(DOL,  "$(CAM):ROI3:MaxX NPP")
    field(OMSL, "closed_loop")
    field(OUTA, "$(CAM):ROI3:MinX.HOPR NPP")
    field(OUTB, "$(CAM):ROI3:SizeX.HOPR NPP")
}

record(longin, "$(CAM):ROI3:MaxY")
{
    field(INP,  "$(CAM):ROI3:MaxSizeY_RBV CP")
    field(FLNK, "$(CAM):ROI3:SetYHOPR.PROC PP")
}

record(dfanout, "$(CAM):ROI3:SetYHOPR")
{
    field(DOL,  "$(CAM):ROI3:MaxY NPP")
    field(OMSL, "closed_loop")
    field(OUTA, "$(CAM):ROI3:MinY.HOPR NPP")
    field(OUTB, "$(CAM):ROI3:SizeY.HOPR NPP")
}

###################################################################
#  These records whether dimensions of 1 are collapsed (removed)  #                               # 
###################################################################

record(bo, "$(CAM):ROI3:CollapseDims")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))COLLAPSE_DIMS")
   field(VAL,  "0")
   field(ZNAM, "Disabled")
   field(ONAM, "Enabled")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):ROI3:CollapseDims_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI3,$(ADDR=0),$(TIMEOUT=1))COLLAPSE_DIMS")
   field(ZNAM, "Disabled")
   field(ONAM, "Enabled")
   field(ZSV,  "NO_ALARM")
   field(OSV,  "MINOR")
   field(SCAN, "I/O Intr")
}


#=================================================================#
# Template file: NDROI.template
# Database for ND ROIs
# Mark Rivers
# April 22, 2008

#=================================================================#
# Template file: NDPluginBase.template
# Database for NDPluginBase, i.e. records common to all plugins
# Mark Rivers
# April 25, 2008

#=================================================================#
# Template file: NDArrayBase.template
# Database for area detector control using asyn driver and standard asyn device support
# Mark Rivers
# March 9, 2008

###################################################################
#  This record contains the version of ADCore                     #
###################################################################

record(stringin, "$(CAM):ROI4:ADCoreVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))ADCORE_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the version of the driver or plugin       #
###################################################################

record(stringin, "$(CAM):ROI4:DriverVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))DRIVER_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the asyn port name of this detector       #
###################################################################

record(stringin, "$(CAM):ROI4:PortName_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))PORT_NAME_SELF")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records contain basic information about the detector     # 
###################################################################

record(stringin, "$(CAM):ROI4:Manufacturer_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))MANUFACTURER")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):ROI4:Model_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))MODEL")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):ROI4:SerialNumber_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))SERIAL_NUMBER")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):ROI4:SDKVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))SDK_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):ROI4:FirmwareVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))FIRMWARE_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control acquisition start and stop               #
###################################################################

record(bo, "$(CAM):ROI4:Acquire") {
   field(DTYP, "asynInt32")
   field(OUT, "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))ACQUIRE")
   field(ZNAM, "Done")
   field(ONAM, "Acquire")
   field(VAL,  "0")
   field(FLNK, "$(CAM):ROI4:SetAcquireBusy")
   info(asyn:READBACK, "1")
}

record(bi, "$(CAM):ROI4:Acquire_RBV") {
   field(DTYP, "asynInt32")
   field(INP, "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))ACQUIRE")
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):ROI4:SetAcquireBusy")
{
    field(INPA, "$(CAM):ROI4:Acquire NPP")
    field(CALC, "A")
    field(OOPT, "Transition To Non-zero")
    field(OUT,  "$(CAM):ROI4:AcquireBusy PP")
}

record(busy, "$(CAM):ROI4:AcquireBusy") {
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(VAL,  "0")
}

record(bi, "$(CAM):ROI4:AcquireBusyCB") {
   field(DTYP, "asynInt32")
   field(INP, "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))ACQUIRE_BUSY")
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):ROI4:ClearAcquireBusy") {
    field(INPA, "$(CAM):ROI4:AcquireBusyCB CP")
    field(CALC, "A")
    field(OOPT, "Transition To Zero")
    field(OUT,  "$(CAM):ROI4:AcquireBusy PP")
}

record(bo, "$(CAM):ROI4:WaitForPlugins") {
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT, "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))WAIT_FOR_PLUGINS")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(VAL,  "0")
}

###################################################################
#  These records are the array size and data type                 #
###################################################################
# The number of dimensions
record(longout, "$(CAM):ROI4:NDimensions")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))ARRAY_NDIMENSIONS")
}

record(longin, "$(CAM):ROI4:NDimensions_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))ARRAY_NDIMENSIONS")
    field(SCAN, "I/O Intr")
}

# The array dimensions waveform records
record(waveform, "$(CAM):ROI4:Dimensions")
{
    field(DTYP, "asynInt32ArrayOut")
    field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))ARRAY_DIMENSIONS")
    field(FTVL, "LONG")
    field(NELM, "10")
    field(FLNK, "$(CAM):ROI4:Dim0SA")
}

record(subArray, "$(CAM):ROI4:Dim0SA")
{
    field(INP,  "$(CAM):ROI4:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "0")
    field(FLNK, "$(CAM):ROI4:ArraySize0")
}

record(longin, "$(CAM):ROI4:ArraySize0")
{
    field(INP,  "$(CAM):ROI4:Dim0SA")
    field(FLNK, "$(CAM):ROI4:Dim1SA")
}

record(subArray, "$(CAM):ROI4:Dim1SA")
{
    field(INP,  "$(CAM):ROI4:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "1")
    field(FLNK, "$(CAM):ROI4:ArraySize1")
}

record(longin, "$(CAM):ROI4:ArraySize1")
{
    field(INP,  "$(CAM):ROI4:Dim1SA")
    field(FLNK, "$(CAM):ROI4:Dim2SA")
}

record(subArray, "$(CAM):ROI4:Dim2SA")
{
    field(INP,  "$(CAM):ROI4:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "2")
    field(FLNK, "$(CAM):ROI4:ArraySize2")
}

record(longin, "$(CAM):ROI4:ArraySize2")
{
    field(INP,  "$(CAM):ROI4:Dim2SA")
    field(FLNK, "$(CAM):ROI4:Dim3SA")
}

record(subArray, "$(CAM):ROI4:Dim3SA")
{
    field(INP,  "$(CAM):ROI4:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "3")
    field(FLNK, "$(CAM):ROI4:ArraySize3")
}

record(longin, "$(CAM):ROI4:ArraySize3")
{
    field(INP,  "$(CAM):ROI4:Dim3SA")
    field(FLNK, "$(CAM):ROI4:Dim4SA")
}

record(subArray, "$(CAM):ROI4:Dim4SA")
{
    field(INP,  "$(CAM):ROI4:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "4")
    field(FLNK, "$(CAM):ROI4:ArraySize4")
}

record(longin, "$(CAM):ROI4:ArraySize4")
{
    field(INP,  "$(CAM):ROI4:Dim4SA")
    field(FLNK, "$(CAM):ROI4:Dim5SA")
}

record(subArray, "$(CAM):ROI4:Dim5SA")
{
    field(INP,  "$(CAM):ROI4:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "5")
    field(FLNK, "$(CAM):ROI4:ArraySize5")
}

record(longin, "$(CAM):ROI4:ArraySize5")
{
    field(INP,  "$(CAM):ROI4:Dim5SA")
    field(FLNK, "$(CAM):ROI4:Dim6SA")
}

record(subArray, "$(CAM):ROI4:Dim6SA")
{
    field(INP,  "$(CAM):ROI4:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "6")
    field(FLNK, "$(CAM):ROI4:ArraySize6")
}

record(longin, "$(CAM):ROI4:ArraySize6")
{
    field(INP,  "$(CAM):ROI4:Dim6SA")
    field(FLNK, "$(CAM):ROI4:Dim7SA")
}

record(subArray, "$(CAM):ROI4:Dim7SA")
{
    field(INP,  "$(CAM):ROI4:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "7")
    field(FLNK, "$(CAM):ROI4:ArraySize7")
}

record(longin, "$(CAM):ROI4:ArraySize7")
{
    field(INP,  "$(CAM):ROI4:Dim7SA")
    field(FLNK, "$(CAM):ROI4:Dim8SA")
}

record(subArray, "$(CAM):ROI4:Dim8SA")
{
    field(INP,  "$(CAM):ROI4:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "8")
    field(FLNK, "$(CAM):ROI4:ArraySize8")
}

record(longin, "$(CAM):ROI4:ArraySize8")
{
    field(INP,  "$(CAM):ROI4:Dim8SA")
    field(FLNK, "$(CAM):ROI4:Dim9SA")
}

record(subArray, "$(CAM):ROI4:Dim9SA")
{
    field(INP,  "$(CAM):ROI4:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "9")
    field(FLNK, "$(CAM):ROI4:ArraySize9")
}

record(longin, "$(CAM):ROI4:ArraySize9")
{
    field(INP,  "$(CAM):ROI4:Dim9SA")
}


record(waveform, "$(CAM):ROI4:Dimensions_RBV")
{
    field(DTYP, "asynInt32ArrayIn")
    field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))ARRAY_DIMENSIONS")
    field(FTVL, "LONG")
    field(NELM, "10")
    field(FLNK, "$(CAM):ROI4:Dim0SA_RBV")
    field(SCAN, "I/O Intr")
}

record(subArray, "$(CAM):ROI4:Dim0SA_RBV")
{
    field(INP,  "$(CAM):ROI4:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "0")
    field(FLNK, "$(CAM):ROI4:ArraySize0_RBV")
}

record(longin, "$(CAM):ROI4:ArraySize0_RBV")
{
    field(INP,  "$(CAM):ROI4:Dim0SA_RBV")
    field(FLNK, "$(CAM):ROI4:Dim1SA_RBV")
}

record(subArray, "$(CAM):ROI4:Dim1SA_RBV")
{
    field(INP,  "$(CAM):ROI4:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "1")
    field(FLNK, "$(CAM):ROI4:ArraySize1_RBV")
}

record(longin, "$(CAM):ROI4:ArraySize1_RBV")
{
    field(INP,  "$(CAM):ROI4:Dim1SA_RBV")
    field(FLNK, "$(CAM):ROI4:Dim2SA_RBV")
}

record(subArray, "$(CAM):ROI4:Dim2SA_RBV")
{
    field(INP,  "$(CAM):ROI4:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "2")
    field(FLNK, "$(CAM):ROI4:ArraySize2_RBV")
}

record(longin, "$(CAM):ROI4:ArraySize2_RBV")
{
    field(INP,  "$(CAM):ROI4:Dim2SA_RBV")
    field(FLNK, "$(CAM):ROI4:Dim3SA_RBV")
}

record(subArray, "$(CAM):ROI4:Dim3SA_RBV")
{
    field(INP,  "$(CAM):ROI4:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "3")
    field(FLNK, "$(CAM):ROI4:ArraySize3_RBV")
}

record(longin, "$(CAM):ROI4:ArraySize3_RBV")
{
    field(INP,  "$(CAM):ROI4:Dim3SA_RBV")
    field(FLNK, "$(CAM):ROI4:Dim4SA_RBV")
}

record(subArray, "$(CAM):ROI4:Dim4SA_RBV")
{
    field(INP,  "$(CAM):ROI4:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "4")
    field(FLNK, "$(CAM):ROI4:ArraySize4_RBV")
}

record(longin, "$(CAM):ROI4:ArraySize4_RBV")
{
    field(INP,  "$(CAM):ROI4:Dim4SA_RBV")
    field(FLNK, "$(CAM):ROI4:Dim5SA_RBV")
}

record(subArray, "$(CAM):ROI4:Dim5SA_RBV")
{
    field(INP,  "$(CAM):ROI4:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "5")
    field(FLNK, "$(CAM):ROI4:ArraySize5_RBV")
}

record(longin, "$(CAM):ROI4:ArraySize5_RBV")
{
    field(INP,  "$(CAM):ROI4:Dim5SA_RBV")
    field(FLNK, "$(CAM):ROI4:Dim6SA_RBV")
}

record(subArray, "$(CAM):ROI4:Dim6SA_RBV")
{
    field(INP,  "$(CAM):ROI4:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "6")
    field(FLNK, "$(CAM):ROI4:ArraySize6_RBV")
}

record(longin, "$(CAM):ROI4:ArraySize6_RBV")
{
    field(INP,  "$(CAM):ROI4:Dim6SA_RBV")
    field(FLNK, "$(CAM):ROI4:Dim7SA_RBV")
}

record(subArray, "$(CAM):ROI4:Dim7SA_RBV")
{
    field(INP,  "$(CAM):ROI4:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "7")
    field(FLNK, "$(CAM):ROI4:ArraySize7_RBV")
}

record(longin, "$(CAM):ROI4:ArraySize7_RBV")
{
    field(INP,  "$(CAM):ROI4:Dim7SA_RBV")
    field(FLNK, "$(CAM):ROI4:Dim8SA_RBV")
}

record(subArray, "$(CAM):ROI4:Dim8SA_RBV")
{
    field(INP,  "$(CAM):ROI4:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "8")
    field(FLNK, "$(CAM):ROI4:ArraySize8_RBV")
}

record(longin, "$(CAM):ROI4:ArraySize8_RBV")
{
    field(INP,  "$(CAM):ROI4:Dim8SA_RBV")
    field(FLNK, "$(CAM):ROI4:Dim9SA_RBV")
}

record(subArray, "$(CAM):ROI4:Dim9SA_RBV")
{
    field(INP,  "$(CAM):ROI4:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "9")
    field(FLNK, "$(CAM):ROI4:ArraySize9_RBV")
}

record(longin, "$(CAM):ROI4:ArraySize9_RBV")
{
    field(INP,  "$(CAM):ROI4:Dim9SA_RBV")
}


record(mbbi, "$(CAM):ROI4:BayerPattern_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))BAYER_PATTERN")
   field(ZRST, "RGGB")
   field(ZRVL, "0")
   field(ONST, "GBRG")
   field(ONVL, "1")
   field(TWST, "GRBG")
   field(TWVL, "2")
   field(THST, "BGGR")
   field(THVL, "3")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI4:ArraySizeX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_X")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI4:ArraySizeY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_Y")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI4:ArraySizeZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_Z")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI4:ArraySize_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records have information on the compression              # 
###################################################################
record(stringin, "$(CAM):ROI4:Codec_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))CODEC")
   field(VAL,  "")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI4:CompressedSize_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))COMPRESSED_SIZE")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the data type                            # 
###################################################################

record(mbbo, "$(CAM):ROI4:DataType")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))DATA_TYPE")
   field(ZRST, "Int8")
   field(ZRVL, "0")
   field(ONST, "UInt8")
   field(ONVL, "1")
   field(TWST, "Int16")
   field(TWVL, "2")
   field(THST, "UInt16")
   field(THVL, "3")
   field(FRST, "Int32")
   field(FRVL, "4")
   field(FVST, "UInt32")
   field(FVVL, "5")
   field(SXST, "Int64")
   field(SXVL, "6")
   field(SVST, "UInt64")
   field(SVVL, "7")
   field(EIST, "Float32")
   field(EIVL, "8")
   field(NIST, "Float64")
   field(NIVL, "9")
   field(VAL,  "0")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):ROI4:DataType_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))DATA_TYPE")
   field(ZRST, "Int8")
   field(ZRVL, "0")
   field(ONST, "UInt8")
   field(ONVL, "1")
   field(TWST, "Int16")
   field(TWVL, "2")
   field(THST, "UInt16")
   field(THVL, "3")
   field(FRST, "Int32")
   field(FRVL, "4")
   field(FVST, "UInt32")
   field(FVVL, "5")
   field(SXST, "Int64")
   field(SXVL, "6")
   field(SVST, "UInt64")
   field(SVVL, "7")
   field(EIST, "Float32")
   field(EIVL, "8")
   field(NIST, "Float64")
   field(NIVL, "9")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI4:BitsPerPixel_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))BITS_PER_PIXEL")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the color mode                           #
#  These choices must agree with NDColorMode_t in NDArray.h       # 
###################################################################

record(mbbo, "$(CAM):ROI4:ColorMode")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))COLOR_MODE")
   field(ZRST, "Mono")
   field(ZRVL, "0")
   field(ONST, "Bayer")
   field(ONVL, "1")
   field(TWST, "RGB1")
   field(TWVL, "2")
   field(THST, "RGB2")
   field(THVL, "3")
   field(FRST, "RGB3")
   field(FRVL, "4")
   field(FVST, "YUV444")
   field(FVVL, "5")
   field(SXST, "YUV422")
   field(SXVL, "6")
   field(SVST, "YUV421")
   field(SVVL, "7")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):ROI4:ColorMode_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))COLOR_MODE")
   field(ZRST, "Mono")
   field(ZRVL, "0")
   field(ONST, "Bayer")
   field(ONVL, "1")
   field(TWST, "RGB1")
   field(TWVL, "2")
   field(THST, "RGB2")
   field(THVL, "3")
   field(FRST, "RGB3")
   field(FRVL, "4")
   field(FVST, "YUV444")
   field(FVVL, "5")
   field(SXST, "YUV422")
   field(SXVL, "6")
   field(SVST, "YUV421")
   field(SVVL, "7")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records are the uniqueId and time stamps of the array     #
###################################################################
record(longin, "$(CAM):ROI4:UniqueId_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))UNIQUE_ID")
    field(SCAN, "I/O Intr")
}

record(ai, "$(CAM):ROI4:TimeStamp_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))TIME_STAMP")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI4:EpicsTSSec_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))EPICS_TS_SEC")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI4:EpicsTSNsec_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))EPICS_TS_NSEC")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records provide statistics on array callbacks and        #
#  array callback rates                                           # 
###################################################################
record(longout, "$(CAM):ROI4:ArrayCounter")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))ARRAY_COUNTER")
}

record(longin, "$(CAM):ROI4:ArrayCounter_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))ARRAY_COUNTER")
    field(SCAN, "I/O Intr")
    field(TSE,  "-2")
    field(LOW,  "0" )
    field(LSV,  "MINOR" )
    info(autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV TSE")
}

# Updated rate calculation to use a smoothing factor w/ guard against negative values
# 0 rate sets alarm state to MINOR
record(calc, "$(CAM):ROI4:ArrayRate_RBV")
{
    field(INPA, "$(CAM):ROI4:ArrayRate_RBV.LB NPP NMS")   # Previous counter (Last B value)
    field(INPB, "$(CAM):ROI4:ArrayCounter_RBV NPP NMS")   # Current counter value
    field(INPC, "1.0")                                # Delta time in seconds
    field(INPD, "$(CAM):ROI4:ArrayRate_RBV.VAL NPP NMS")  # Previous rate
    field(INPE, "0.0")                 # Smoothing factor
    field(CALC, "(D*E)/C+MAX(0,B-A)*(1-E)/C")
    field(PREC, "2" )
    field(EGU,  "Hz" )
    field(SCAN, "1 second")
    field(LOW,  "0")
    field(LSV,  "MINOR")
    field(ADEL, "0.1")
    info(autosaveFields, "ADEL DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV MDEL PREC C E SCAN EGU")
}

###################################################################
#  These records control NDArray callacks                         # 
###################################################################
record(bo, "$(CAM):ROI4:ArrayCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))ARRAY_CALLBACKS")
    field(ZNAM, "Disable")
    field(ZSV,  "MINOR")
    field(ONAM, "Enable")
    field(OSV,  "NO_ALARM")
    field(VAL, "1")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):ROI4:ArrayCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))ARRAY_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ZSV,  "MINOR")
    field(ONAM, "Enabled")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains macro definitions for the attributes      # 
###################################################################

record(waveform, "$(CAM):ROI4:NDAttributesMacros")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_MACROS")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

###################################################################
#  This record is the name of a file defining attributes          # 
###################################################################

record(waveform, "$(CAM):ROI4:NDAttributesFile")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_FILE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

###################################################################
#  This record defines the status of reading attributes file      # 
###################################################################

record(mbbi, "$(CAM):ROI4:NDAttributesStatus")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_STATUS")
    field(ZRVL, "0")
    field(ZRST, "Attributes file OK")
    field(ZRSV, "NO_ALARM")
    field(ONVL, "1")
    field(ONST, "File not found")
    field(ONSV, "MINOR")
    field(TWVL, "2")
    field(TWST, "XML syntax error")
    field(TWSV, "MAJOR")
    field(THVL, "3")
    field(THST, "Macro substitution error")
    field(THSV, "MAJOR")
    field(SCAN, "I/O Intr")
}

###################################################################
#  Status of NDArrayPool - number of buffers, memory used etc.    # 
###################################################################

record(ai, "$(CAM):ROI4:PoolMaxMem")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))POOL_MAX_MEMORY")
   field(PREC, "1")
   field(EGU,  "MB")
   field(SCAN, "Passive")
   field(PINI, "YES")
}

record(ai, "$(CAM):ROI4:PoolUsedMem")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))POOL_USED_MEMORY")
   field(PREC, "1")
   field(EGU,  "MB")
   field(SCAN, "1 second")
   field(FLNK, "$(CAM):ROI4:PoolAllocBuffers")
   info(autosaveFields, "SCAN")
}

record(longin, "$(CAM):ROI4:PoolAllocBuffers")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))POOL_ALLOC_BUFFERS")
   field(FLNK, "$(CAM):ROI4:PoolFreeBuffers")
}

record(longin, "$(CAM):ROI4:PoolFreeBuffers")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))POOL_FREE_BUFFERS")
   field(FLNK, "$(CAM):ROI4:PoolUsedBuffers")
}

record(calc, "$(CAM):ROI4:PoolUsedBuffers")
{
    field(INPA, "$(CAM):ROI4:PoolAllocBuffers NPP MS")
    field(INPB, "$(CAM):ROI4:PoolFreeBuffers NPP MS")
    field(CALC, "A-B")
}

record(bo, "$(CAM):ROI4:EmptyFreeList")
{
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))POOL_EMPTY_FREELIST")
}

record(longin, "$(CAM):ROI4:NumQueuedArrays")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))NUM_QUEUED_ARRAYS")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the type of plugin                        #
###################################################################

record(stringin, "$(CAM):ROI4:PluginType_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))PLUGIN_TYPE")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the connection of the server to          #
#  an NDArray driver port and address                             #
###################################################################
# Array port name
record(stringout, "$(CAM):ROI4:NDArrayPort")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(OUT,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))NDARRAY_PORT")
    field(VAL,  "$(CAM_PORT)")
    info(autosaveFields, "DESC VAL")
}

record(stringin, "$(CAM):ROI4:NDArrayPort_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))NDARRAY_PORT")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):ROI4:NDArrayAddress")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))NDARRAY_ADDR")
    field(VAL,  "$(NDARRAY_ADDR=0)")
    info(autosaveFields, "DESC VAL")
}

record(longin, "$(CAM):ROI4:NDArrayAddress_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))NDARRAY_ADDR")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control whether callbacks are enabled and        #
#  minimum time between callbacks                                 #
###################################################################
record(bo, "$(CAM):ROI4:EnableCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))ENABLE_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    field(VAL,  "0")
    info(autosaveFields, "DESC VAL")
}

record(bi, "$(CAM):ROI4:EnableCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))ENABLE_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    field(ZSV,  "MINOR")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):ROI4:MinCallbackTime")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))MIN_CALLBACK_TIME")
    field(EGU,  "s")
    field(PREC, "3")
    field(VAL,  "0.0")
    field(DRVL, "0")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):ROI4:MinCallbackTime_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))MIN_CALLBACK_TIME")
    field(EGU,  "s")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):ROI4:MaxArrayRate")
{
    field(DTYP, "Soft Channel")
    field(OUT,  "$(CAM):ROI4:MaxArrayRate_COUT PP")
    field(EGU,  "Hz")
    field(PREC, "3")
    field(VAL,  "0.0")
    info(autosaveFields, "VAL")
}

record(calcout, "$(CAM):ROI4:MaxArrayRate_COUT")
{
    field(INPA, "$(CAM):ROI4:MaxArrayRate")
    field(CALC, "A=0?0:1.0/A")
    field(OUT,  "$(CAM):ROI4:MinCallbackTime PP")
}

record(calc, "$(CAM):ROI4:MaxArrayRate_RBV")
{
    field(INPA, "$(CAM):ROI4:MinCallbackTime_RBV CP")
    field(CALC, "A=0?0:1.0/A")
    field(EGU,  "Hz")
    field(PREC, "3")
    field(SCAN, "Passive")
}

record(ao, "$(CAM):ROI4:MaxByteRate")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))MAX_BYTE_RATE")
    field(EGU,  "s")
    field(PREC, "3")
    field(VAL,  "0.0")
    field(DRVL, "0")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):ROI4:MaxByteRate_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))MAX_BYTE_RATE")
    field(EGU,  "s")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the last execution time of the plugin     #
###################################################################
record(ai, "$(CAM):ROI4:ExecutionTime_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))EXECUTION_TIME")
    field(EGU,  "ms")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record requests that the plugin execute again with the    #
#  same NDArray                                                   #
###################################################################
record(bo, "$(CAM):ROI4:ProcessPlugin")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))PROCESS_PLUGIN")
    field(VAL,  "1")
}

###################################################################
#  These records control whether callbacks block or not           #
###################################################################
record(bo, "$(CAM):ROI4:BlockingCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))BLOCKING_CALLBACKS")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(VAL,  "0")
    info(autosaveFields, "DESC ZSV OSV VAL")
}

record(bi, "$(CAM):ROI4:BlockingCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))BLOCKING_CALLBACKS")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(ZSV,  "NO_ALARM")
    field(OSV,  "MINOR")
    field(SCAN, "I/O Intr")
    info( autosaveFields, "DESC ZSV OSV" )
}


record(longout, "$(CAM):ROI4:DroppedArrays")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))DROPPED_ARRAYS")
    field(VAL,  "0")
    info( autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV EGU" )
}

record(longin, "$(CAM):ROI4:DroppedArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))DROPPED_ARRAYS")
    field(SCAN, "I/O Intr")
    field(HIGH, "1")
    field(HSV,  "MINOR")
    info( autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV EGU" )
}

record(longout, "$(CAM):ROI4:QueueSize")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))QUEUE_SIZE")
    field(PINI, "YES")
    info( autosaveFields, "DESC EGU" )
}

record(longin, "$(CAM):ROI4:QueueSize_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))QUEUE_SIZE")
    field(FLNK, "$(CAM):ROI4:QueueFreeLow")
    field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):ROI4:QueueFreeLow") {
    field(CALC, "A*0.25")
    field(INPA, "$(CAM):ROI4:QueueSize")
    field(OUT,  "$(CAM):ROI4:QueueFree.LOW")
    field(FLNK, "$(CAM):ROI4:QueueUseHIGH")
}

# Set a HIGH warning level for the input queue fill level to 75%
# of the full size of the queue
record(calcout, "$(CAM):ROI4:QueueUseHIGH") {
   field(CALC, "A*0.75")
   field(INPA, "$(CAM):ROI4:QueueSize")
   field(OUT,  "$(CAM):ROI4:QueueUse.HIGH")
   field(FLNK, "$(CAM):ROI4:QueueUseHIHI")
}

# Set a HIHI level for the input queue fill level to indicate an error
# (MAJOR alarm)  when it fills up to the full size of the queue (frames start dropping)
record(calcout, "$(CAM):ROI4:QueueUseHIHI") {
   field(CALC, "A*1.0")
   field(INPA, "$(CAM):ROI4:QueueSize")
   field(OUT,  "$(CAM):ROI4:QueueUse.HIHI")
}

record(longin, "$(CAM):ROI4:QueueFree")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))QUEUE_FREE")
    field(LLSV, "MAJOR")
    field(LSV,  "MINOR")
    field(LOLO, "0")
    field(HYST, "1")
    field(SCAN, "I/O Intr")
}

# Display the fill level on the plugins input queue
record(calc, "$(CAM):ROI4:QueueUse") {
    field(CALC, "A-B")
    field(INPA, "$(CAM):ROI4:QueueSize")
    field(INPB, "$(CAM):ROI4:QueueFree CP")
    field(SCAN, "Passive")
    field(HHSV, "MAJOR")
    field(HSV,  "MINOR")
    field(HYST, "1")
}

record(longout, "$(CAM):ROI4:NumThreads")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))NUM_THREADS")
    field(VAL,  "1")
    field(PINI, "YES")
    info(autosaveFields, "DESC VAL")
}

record(longin, "$(CAM):ROI4:NumThreads_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))NUM_THREADS")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI4:MaxThreads_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))MAX_THREADS")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control output array sorting                     #
###################################################################
record(mbbo, "$(CAM):ROI4:SortMode") {
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))SORT_MODE")
    field(ZRVL, "0")
    field(ZRST, "Unsorted")
    field(ONVL, "1")
    field(ONST, "Sorted")
}

record(mbbi, "$(CAM):ROI4:SortMode_RBV") {
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))SORT_MODE")
    field(ZRVL, "0")
    field(ZRST, "Unsorted")
    field(ONVL, "1")
    field(ONST, "Sorted")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):ROI4:SortTime") {
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))SORT_TIME")
    field(PREC, "3")
    field(VAL, "0.1")
}

record(ai, "$(CAM):ROI4:SortTime_RBV") {
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))SORT_TIME")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):ROI4:SortSize")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))SORT_SIZE")
    field(VAL,  "20")
    field(PINI, "YES")
}

record(longin, "$(CAM):ROI4:SortSize_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))SORT_SIZE")
    field(FLNK, "$(CAM):ROI4:SortFreeLow")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI4:SortFree") {
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))SORT_FREE")
    field(LLSV, "MAJOR")
    field(LSV,  "MINOR")
    field(LOLO, "0")
    field(HYST, "1")
    field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):ROI4:SortFreeLow") {
    field(CALC, "A*0.25")
    field(INPA, "$(CAM):ROI4:SortSize")
    field(OUT,  "$(CAM):ROI4:SortFree.LOW")
}

record(longout, "$(CAM):ROI4:DroppedOutputArrays")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))DROPPED_OUTPUT_ARRAYS")
    field(VAL,  "0")
}

record(longin, "$(CAM):ROI4:DroppedOutputArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))DROPPED_OUTPUT_ARRAYS")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):ROI4:DisorderedArrays")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))DISORDERED_ARRAYS")
    field(PINI, "YES")
}

record(longin, "$(CAM):ROI4:DisorderedArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))DISORDERED_ARRAYS")
    field(SCAN, "I/O Intr")
}



###################################################################
#  The asynRecord is used for mainly for trace mask               # 
###################################################################
 
# Set ASYN_TRACEIO_HEX bit by default
record(asyn,"$(CAM):ROI4:AsynIO")
{
    field(PORT, "ROI4")
    field(TIB2,"1")
    info("ADType", "ADPlugin")
}


###################################################################
#  These records control the label for the ROI                    #
###################################################################
record(stringout, "$(CAM):ROI4:Name")
{
   field(PINI, "YES")
   field(DTYP, "asynOctetWrite")
   field(OUT,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))NAME")
   info(autosaveFields, "VAL")
}

record(stringin, "$(CAM):ROI4:Name_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))NAME")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the ROI definition                       #
#  including binning, region start and size                       # 
###################################################################

record(longout, "$(CAM):ROI4:BinX")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))DIM0_BIN")
   field(VAL,  "1")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):ROI4:BinX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))DIM0_BIN")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):ROI4:BinY")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))DIM1_BIN")
   field(VAL,  "1")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):ROI4:BinY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))DIM1_BIN")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):ROI4:BinZ")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))DIM2_BIN")
   field(VAL,  "1")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):ROI4:BinZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))DIM2_BIN")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):ROI4:MinX")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))DIM0_MIN")
   field(LOPR, "0")
   field(VAL,  "0")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):ROI4:MinX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))DIM0_MIN")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):ROI4:MinY")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))DIM1_MIN")
   field(LOPR, "0")
   field(VAL,  "0")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):ROI4:MinY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))DIM1_MIN")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):ROI4:MinZ")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))DIM2_MIN")
   field(LOPR, "1")
   field(VAL,  "0")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):ROI4:MinZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))DIM2_MIN")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):ROI4:SizeX")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))DIM0_SIZE")
   field(VAL,  "1000000")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):ROI4:SizeX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))DIM0_SIZE")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):ROI4:SizeY")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))DIM1_SIZE")
   field(VAL,  "1000000")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):ROI4:SizeY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))DIM1_SIZE")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):ROI4:SizeZ")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))DIM2_SIZE")
   field(VAL,  "1000000")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):ROI4:SizeZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))DIM2_SIZE")
   field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):ROI4:AutoSizeX")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))DIM0_AUTO_SIZE")
   field(VAL,  "0")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):ROI4:AutoSizeX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))DIM0_AUTO_SIZE")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):ROI4:AutoSizeY")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))DIM1_AUTO_SIZE")
   field(VAL,  "0")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):ROI4:AutoSizeY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))DIM1_AUTO_SIZE")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):ROI4:AutoSizeZ")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))DIM2_AUTO_SIZE")
   field(VAL,  "0")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):ROI4:AutoSizeZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))DIM2_AUTO_SIZE")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI4:MaxSizeX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))DIM0_MAX_SIZE")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI4:MaxSizeY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))DIM1_MAX_SIZE")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI4:MaxSizeZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))DIM2_MAX_SIZE")
   field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):ROI4:ReverseX")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))DIM0_REVERSE")
   field(VAL,  "0")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):ROI4:ReverseX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))DIM0_REVERSE")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):ROI4:ReverseY")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))DIM1_REVERSE")
   field(VAL,  "0")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):ROI4:ReverseY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))DIM1_REVERSE")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):ROI4:ReverseZ")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))DIM2_REVERSE")
   field(VAL,  "0")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):ROI4:ReverseZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))DIM2_REVERSE")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI4:ArraySizeX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_X")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI4:ArraySizeY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_Y")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):ROI4:ArraySizeZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_Z")
   field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):ROI4:EnableX")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))DIM0_ENABLE")
   field(VAL,  "1")
   field(ZNAM, "Disabled")
   field(ONAM, "Enabled")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):ROI4:EnableX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))DIM0_ENABLE")
   field(ZNAM, "Disabled")
   field(ONAM, "Enabled")
   field(ZSV,  "NO_ALARM")
   field(OSV,  "NO_ALARM")
   field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):ROI4:EnableY")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))DIM1_ENABLE")
   field(VAL,  "1")
   field(ZNAM, "Disabled")
   field(ONAM, "Enabled")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):ROI4:EnableY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))DIM1_ENABLE")
   field(ZNAM, "Disabled")
   field(ONAM, "Enabled")
   field(ZSV,  "NO_ALARM")
   field(OSV,  "NO_ALARM")
   field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):ROI4:EnableZ")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))DIM2_ENABLE")
   field(VAL,  "1")
   field(ZNAM, "Disabled")
   field(ONAM, "Enabled")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):ROI4:EnableZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))DIM2_ENABLE")
   field(ZNAM, "Disabled")
   field(ONAM, "Enabled")
   field(ZSV,  "NO_ALARM")
   field(OSV,  "NO_ALARM")
   field(SCAN, "I/O Intr")
}


###################################################################
#  These records control the scaling of the data.  Useful when    #
#  binning or converting data types                               # 
###################################################################

record(bo, "$(CAM):ROI4:EnableScale")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))ENABLE_SCALE")
   field(VAL,  "0")
   field(ZNAM, "Disabled")
   field(ONAM, "Enabled")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):ROI4:EnableScale_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))ENABLE_SCALE")
   field(ZNAM, "Disabled")
   field(ONAM, "Enabled")
   field(ZSV,  "NO_ALARM")
   field(OSV,  "MINOR")
   field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):ROI4:Scale")
{
   field(PINI, "YES")
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))SCALE_VALUE")
   field(VAL,  "1")
   info(autosaveFields, "VAL")
}

record(ai, "$(CAM):ROI4:Scale_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))SCALE_VALUE")
   field(SCAN, "I/O Intr")
}


###################################################################
#  These records control the data type of the array data          # 
#  The last entry is "Automatic" meaning preserve the data type   #
#  of the input array.                                            # 
###################################################################

record(mbbo, "$(CAM):ROI4:DataTypeOut")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))ROI_DATA_TYPE")
   field(ZRST, "Int8")
   field(ZRVL, "0")
   field(ONST, "UInt8")
   field(ONVL, "1")
   field(TWST, "Int16")
   field(TWVL, "2")
   field(THST, "UInt16")
   field(THVL, "3")
   field(FRST, "Int32")
   field(FRVL, "4")
   field(FVST, "UInt32")
   field(FVVL, "5")
   field(SXST, "Int64")
   field(SXVL, "6")
   field(SVST, "UInt64")
   field(SVVL, "7")
   field(EIST, "Float32")
   field(EIVL, "8")
   field(NIST, "Float64")
   field(NIVL, "9")
   field(TEST, "Automatic")
   field(TEVL, "-1")
   field(VAL,  "10")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):ROI4:DataTypeOut_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))ROI_DATA_TYPE")
   field(ZRST, "Int8")
   field(ZRVL, "0")
   field(ONST, "UInt8")
   field(ONVL, "1")
   field(TWST, "Int16")
   field(TWVL, "2")
   field(THST, "UInt16")
   field(THVL, "3")
   field(FRST, "Int32")
   field(FRVL, "4")
   field(FVST, "UInt32")
   field(FVVL, "5")
   field(SXST, "Int64")
   field(SXVL, "6")
   field(SVST, "UInt64")
   field(SVVL, "7")
   field(EIST, "Float32")
   field(EIVL, "8")
   field(NIST, "Float64")
   field(NIVL, "9")
   field(TEST, "Automatic")
   field(TEVL, "-1")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records set the HOPR and LOPR values for the position    #
#  and size to the maximum for the input array                    #
###################################################################

record(longin, "$(CAM):ROI4:MaxX")
{
    field(INP,  "$(CAM):ROI4:MaxSizeX_RBV CP")
    field(FLNK, "$(CAM):ROI4:SetXHOPR.PROC PP")
}

record(dfanout, "$(CAM):ROI4:SetXHOPR")
{
    field(DOL,  "$(CAM):ROI4:MaxX NPP")
    field(OMSL, "closed_loop")
    field(OUTA, "$(CAM):ROI4:MinX.HOPR NPP")
    field(OUTB, "$(CAM):ROI4:SizeX.HOPR NPP")
}

record(longin, "$(CAM):ROI4:MaxY")
{
    field(INP,  "$(CAM):ROI4:MaxSizeY_RBV CP")
    field(FLNK, "$(CAM):ROI4:SetYHOPR.PROC PP")
}

record(dfanout, "$(CAM):ROI4:SetYHOPR")
{
    field(DOL,  "$(CAM):ROI4:MaxY NPP")
    field(OMSL, "closed_loop")
    field(OUTA, "$(CAM):ROI4:MinY.HOPR NPP")
    field(OUTB, "$(CAM):ROI4:SizeY.HOPR NPP")
}

###################################################################
#  These records whether dimensions of 1 are collapsed (removed)  #                               # 
###################################################################

record(bo, "$(CAM):ROI4:CollapseDims")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))COLLAPSE_DIMS")
   field(VAL,  "0")
   field(ZNAM, "Disabled")
   field(ONAM, "Enabled")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):ROI4:CollapseDims_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(ROI4,$(ADDR=0),$(TIMEOUT=1))COLLAPSE_DIMS")
   field(ZNAM, "Disabled")
   field(ONAM, "Enabled")
   field(ZSV,  "NO_ALARM")
   field(OSV,  "MINOR")
   field(SCAN, "I/O Intr")
}


#=================================================================#
# Template file: NDStats.template

#=================================================================#
# Template file: NDPluginBase.template
# Database for NDPluginBase, i.e. records common to all plugins
# Mark Rivers
# April 25, 2008

#=================================================================#
# Template file: NDArrayBase.template
# Database for area detector control using asyn driver and standard asyn device support
# Mark Rivers
# March 9, 2008

###################################################################
#  This record contains the version of ADCore                     #
###################################################################

record(stringin, "$(CAM):Stats1:ADCoreVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))ADCORE_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the version of the driver or plugin       #
###################################################################

record(stringin, "$(CAM):Stats1:DriverVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))DRIVER_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the asyn port name of this detector       #
###################################################################

record(stringin, "$(CAM):Stats1:PortName_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))PORT_NAME_SELF")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records contain basic information about the detector     # 
###################################################################

record(stringin, "$(CAM):Stats1:Manufacturer_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))MANUFACTURER")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):Stats1:Model_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))MODEL")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):Stats1:SerialNumber_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))SERIAL_NUMBER")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):Stats1:SDKVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))SDK_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):Stats1:FirmwareVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))FIRMWARE_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control acquisition start and stop               #
###################################################################

record(bo, "$(CAM):Stats1:Acquire") {
   field(DTYP, "asynInt32")
   field(OUT, "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))ACQUIRE")
   field(ZNAM, "Done")
   field(ONAM, "Acquire")
   field(VAL,  "0")
   field(FLNK, "$(CAM):Stats1:SetAcquireBusy")
   info(asyn:READBACK, "1")
}

record(bi, "$(CAM):Stats1:Acquire_RBV") {
   field(DTYP, "asynInt32")
   field(INP, "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))ACQUIRE")
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):Stats1:SetAcquireBusy")
{
    field(INPA, "$(CAM):Stats1:Acquire NPP")
    field(CALC, "A")
    field(OOPT, "Transition To Non-zero")
    field(OUT,  "$(CAM):Stats1:AcquireBusy PP")
}

record(busy, "$(CAM):Stats1:AcquireBusy") {
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(VAL,  "0")
}

record(bi, "$(CAM):Stats1:AcquireBusyCB") {
   field(DTYP, "asynInt32")
   field(INP, "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))ACQUIRE_BUSY")
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):Stats1:ClearAcquireBusy") {
    field(INPA, "$(CAM):Stats1:AcquireBusyCB CP")
    field(CALC, "A")
    field(OOPT, "Transition To Zero")
    field(OUT,  "$(CAM):Stats1:AcquireBusy PP")
}

record(bo, "$(CAM):Stats1:WaitForPlugins") {
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT, "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))WAIT_FOR_PLUGINS")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(VAL,  "0")
}

###################################################################
#  These records are the array size and data type                 #
###################################################################
# The number of dimensions
record(longout, "$(CAM):Stats1:NDimensions")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))ARRAY_NDIMENSIONS")
}

record(longin, "$(CAM):Stats1:NDimensions_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))ARRAY_NDIMENSIONS")
    field(SCAN, "I/O Intr")
}

# The array dimensions waveform records
record(waveform, "$(CAM):Stats1:Dimensions")
{
    field(DTYP, "asynInt32ArrayOut")
    field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))ARRAY_DIMENSIONS")
    field(FTVL, "LONG")
    field(NELM, "10")
    field(FLNK, "$(CAM):Stats1:Dim0SA")
}

record(subArray, "$(CAM):Stats1:Dim0SA")
{
    field(INP,  "$(CAM):Stats1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "0")
    field(FLNK, "$(CAM):Stats1:ArraySize0")
}

record(longin, "$(CAM):Stats1:ArraySize0")
{
    field(INP,  "$(CAM):Stats1:Dim0SA")
    field(FLNK, "$(CAM):Stats1:Dim1SA")
}

record(subArray, "$(CAM):Stats1:Dim1SA")
{
    field(INP,  "$(CAM):Stats1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "1")
    field(FLNK, "$(CAM):Stats1:ArraySize1")
}

record(longin, "$(CAM):Stats1:ArraySize1")
{
    field(INP,  "$(CAM):Stats1:Dim1SA")
    field(FLNK, "$(CAM):Stats1:Dim2SA")
}

record(subArray, "$(CAM):Stats1:Dim2SA")
{
    field(INP,  "$(CAM):Stats1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "2")
    field(FLNK, "$(CAM):Stats1:ArraySize2")
}

record(longin, "$(CAM):Stats1:ArraySize2")
{
    field(INP,  "$(CAM):Stats1:Dim2SA")
    field(FLNK, "$(CAM):Stats1:Dim3SA")
}

record(subArray, "$(CAM):Stats1:Dim3SA")
{
    field(INP,  "$(CAM):Stats1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "3")
    field(FLNK, "$(CAM):Stats1:ArraySize3")
}

record(longin, "$(CAM):Stats1:ArraySize3")
{
    field(INP,  "$(CAM):Stats1:Dim3SA")
    field(FLNK, "$(CAM):Stats1:Dim4SA")
}

record(subArray, "$(CAM):Stats1:Dim4SA")
{
    field(INP,  "$(CAM):Stats1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "4")
    field(FLNK, "$(CAM):Stats1:ArraySize4")
}

record(longin, "$(CAM):Stats1:ArraySize4")
{
    field(INP,  "$(CAM):Stats1:Dim4SA")
    field(FLNK, "$(CAM):Stats1:Dim5SA")
}

record(subArray, "$(CAM):Stats1:Dim5SA")
{
    field(INP,  "$(CAM):Stats1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "5")
    field(FLNK, "$(CAM):Stats1:ArraySize5")
}

record(longin, "$(CAM):Stats1:ArraySize5")
{
    field(INP,  "$(CAM):Stats1:Dim5SA")
    field(FLNK, "$(CAM):Stats1:Dim6SA")
}

record(subArray, "$(CAM):Stats1:Dim6SA")
{
    field(INP,  "$(CAM):Stats1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "6")
    field(FLNK, "$(CAM):Stats1:ArraySize6")
}

record(longin, "$(CAM):Stats1:ArraySize6")
{
    field(INP,  "$(CAM):Stats1:Dim6SA")
    field(FLNK, "$(CAM):Stats1:Dim7SA")
}

record(subArray, "$(CAM):Stats1:Dim7SA")
{
    field(INP,  "$(CAM):Stats1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "7")
    field(FLNK, "$(CAM):Stats1:ArraySize7")
}

record(longin, "$(CAM):Stats1:ArraySize7")
{
    field(INP,  "$(CAM):Stats1:Dim7SA")
    field(FLNK, "$(CAM):Stats1:Dim8SA")
}

record(subArray, "$(CAM):Stats1:Dim8SA")
{
    field(INP,  "$(CAM):Stats1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "8")
    field(FLNK, "$(CAM):Stats1:ArraySize8")
}

record(longin, "$(CAM):Stats1:ArraySize8")
{
    field(INP,  "$(CAM):Stats1:Dim8SA")
    field(FLNK, "$(CAM):Stats1:Dim9SA")
}

record(subArray, "$(CAM):Stats1:Dim9SA")
{
    field(INP,  "$(CAM):Stats1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "9")
    field(FLNK, "$(CAM):Stats1:ArraySize9")
}

record(longin, "$(CAM):Stats1:ArraySize9")
{
    field(INP,  "$(CAM):Stats1:Dim9SA")
}


record(waveform, "$(CAM):Stats1:Dimensions_RBV")
{
    field(DTYP, "asynInt32ArrayIn")
    field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))ARRAY_DIMENSIONS")
    field(FTVL, "LONG")
    field(NELM, "10")
    field(FLNK, "$(CAM):Stats1:Dim0SA_RBV")
    field(SCAN, "I/O Intr")
}

record(subArray, "$(CAM):Stats1:Dim0SA_RBV")
{
    field(INP,  "$(CAM):Stats1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "0")
    field(FLNK, "$(CAM):Stats1:ArraySize0_RBV")
}

record(longin, "$(CAM):Stats1:ArraySize0_RBV")
{
    field(INP,  "$(CAM):Stats1:Dim0SA_RBV")
    field(FLNK, "$(CAM):Stats1:Dim1SA_RBV")
}

record(subArray, "$(CAM):Stats1:Dim1SA_RBV")
{
    field(INP,  "$(CAM):Stats1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "1")
    field(FLNK, "$(CAM):Stats1:ArraySize1_RBV")
}

record(longin, "$(CAM):Stats1:ArraySize1_RBV")
{
    field(INP,  "$(CAM):Stats1:Dim1SA_RBV")
    field(FLNK, "$(CAM):Stats1:Dim2SA_RBV")
}

record(subArray, "$(CAM):Stats1:Dim2SA_RBV")
{
    field(INP,  "$(CAM):Stats1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "2")
    field(FLNK, "$(CAM):Stats1:ArraySize2_RBV")
}

record(longin, "$(CAM):Stats1:ArraySize2_RBV")
{
    field(INP,  "$(CAM):Stats1:Dim2SA_RBV")
    field(FLNK, "$(CAM):Stats1:Dim3SA_RBV")
}

record(subArray, "$(CAM):Stats1:Dim3SA_RBV")
{
    field(INP,  "$(CAM):Stats1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "3")
    field(FLNK, "$(CAM):Stats1:ArraySize3_RBV")
}

record(longin, "$(CAM):Stats1:ArraySize3_RBV")
{
    field(INP,  "$(CAM):Stats1:Dim3SA_RBV")
    field(FLNK, "$(CAM):Stats1:Dim4SA_RBV")
}

record(subArray, "$(CAM):Stats1:Dim4SA_RBV")
{
    field(INP,  "$(CAM):Stats1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "4")
    field(FLNK, "$(CAM):Stats1:ArraySize4_RBV")
}

record(longin, "$(CAM):Stats1:ArraySize4_RBV")
{
    field(INP,  "$(CAM):Stats1:Dim4SA_RBV")
    field(FLNK, "$(CAM):Stats1:Dim5SA_RBV")
}

record(subArray, "$(CAM):Stats1:Dim5SA_RBV")
{
    field(INP,  "$(CAM):Stats1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "5")
    field(FLNK, "$(CAM):Stats1:ArraySize5_RBV")
}

record(longin, "$(CAM):Stats1:ArraySize5_RBV")
{
    field(INP,  "$(CAM):Stats1:Dim5SA_RBV")
    field(FLNK, "$(CAM):Stats1:Dim6SA_RBV")
}

record(subArray, "$(CAM):Stats1:Dim6SA_RBV")
{
    field(INP,  "$(CAM):Stats1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "6")
    field(FLNK, "$(CAM):Stats1:ArraySize6_RBV")
}

record(longin, "$(CAM):Stats1:ArraySize6_RBV")
{
    field(INP,  "$(CAM):Stats1:Dim6SA_RBV")
    field(FLNK, "$(CAM):Stats1:Dim7SA_RBV")
}

record(subArray, "$(CAM):Stats1:Dim7SA_RBV")
{
    field(INP,  "$(CAM):Stats1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "7")
    field(FLNK, "$(CAM):Stats1:ArraySize7_RBV")
}

record(longin, "$(CAM):Stats1:ArraySize7_RBV")
{
    field(INP,  "$(CAM):Stats1:Dim7SA_RBV")
    field(FLNK, "$(CAM):Stats1:Dim8SA_RBV")
}

record(subArray, "$(CAM):Stats1:Dim8SA_RBV")
{
    field(INP,  "$(CAM):Stats1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "8")
    field(FLNK, "$(CAM):Stats1:ArraySize8_RBV")
}

record(longin, "$(CAM):Stats1:ArraySize8_RBV")
{
    field(INP,  "$(CAM):Stats1:Dim8SA_RBV")
    field(FLNK, "$(CAM):Stats1:Dim9SA_RBV")
}

record(subArray, "$(CAM):Stats1:Dim9SA_RBV")
{
    field(INP,  "$(CAM):Stats1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "9")
    field(FLNK, "$(CAM):Stats1:ArraySize9_RBV")
}

record(longin, "$(CAM):Stats1:ArraySize9_RBV")
{
    field(INP,  "$(CAM):Stats1:Dim9SA_RBV")
}


record(mbbi, "$(CAM):Stats1:BayerPattern_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))BAYER_PATTERN")
   field(ZRST, "RGGB")
   field(ZRVL, "0")
   field(ONST, "GBRG")
   field(ONVL, "1")
   field(TWST, "GRBG")
   field(TWVL, "2")
   field(THST, "BGGR")
   field(THVL, "3")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats1:ArraySizeX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_X")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats1:ArraySizeY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_Y")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats1:ArraySizeZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_Z")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats1:ArraySize_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records have information on the compression              # 
###################################################################
record(stringin, "$(CAM):Stats1:Codec_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))CODEC")
   field(VAL,  "")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats1:CompressedSize_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))COMPRESSED_SIZE")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the data type                            # 
###################################################################

record(mbbo, "$(CAM):Stats1:DataType")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))DATA_TYPE")
   field(ZRST, "Int8")
   field(ZRVL, "0")
   field(ONST, "UInt8")
   field(ONVL, "1")
   field(TWST, "Int16")
   field(TWVL, "2")
   field(THST, "UInt16")
   field(THVL, "3")
   field(FRST, "Int32")
   field(FRVL, "4")
   field(FVST, "UInt32")
   field(FVVL, "5")
   field(SXST, "Int64")
   field(SXVL, "6")
   field(SVST, "UInt64")
   field(SVVL, "7")
   field(EIST, "Float32")
   field(EIVL, "8")
   field(NIST, "Float64")
   field(NIVL, "9")
   field(VAL,  "0")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Stats1:DataType_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))DATA_TYPE")
   field(ZRST, "Int8")
   field(ZRVL, "0")
   field(ONST, "UInt8")
   field(ONVL, "1")
   field(TWST, "Int16")
   field(TWVL, "2")
   field(THST, "UInt16")
   field(THVL, "3")
   field(FRST, "Int32")
   field(FRVL, "4")
   field(FVST, "UInt32")
   field(FVVL, "5")
   field(SXST, "Int64")
   field(SXVL, "6")
   field(SVST, "UInt64")
   field(SVVL, "7")
   field(EIST, "Float32")
   field(EIVL, "8")
   field(NIST, "Float64")
   field(NIVL, "9")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats1:BitsPerPixel_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))BITS_PER_PIXEL")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the color mode                           #
#  These choices must agree with NDColorMode_t in NDArray.h       # 
###################################################################

record(mbbo, "$(CAM):Stats1:ColorMode")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))COLOR_MODE")
   field(ZRST, "Mono")
   field(ZRVL, "0")
   field(ONST, "Bayer")
   field(ONVL, "1")
   field(TWST, "RGB1")
   field(TWVL, "2")
   field(THST, "RGB2")
   field(THVL, "3")
   field(FRST, "RGB3")
   field(FRVL, "4")
   field(FVST, "YUV444")
   field(FVVL, "5")
   field(SXST, "YUV422")
   field(SXVL, "6")
   field(SVST, "YUV421")
   field(SVVL, "7")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Stats1:ColorMode_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))COLOR_MODE")
   field(ZRST, "Mono")
   field(ZRVL, "0")
   field(ONST, "Bayer")
   field(ONVL, "1")
   field(TWST, "RGB1")
   field(TWVL, "2")
   field(THST, "RGB2")
   field(THVL, "3")
   field(FRST, "RGB3")
   field(FRVL, "4")
   field(FVST, "YUV444")
   field(FVVL, "5")
   field(SXST, "YUV422")
   field(SXVL, "6")
   field(SVST, "YUV421")
   field(SVVL, "7")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records are the uniqueId and time stamps of the array     #
###################################################################
record(longin, "$(CAM):Stats1:UniqueId_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))UNIQUE_ID")
    field(SCAN, "I/O Intr")
}

record(ai, "$(CAM):Stats1:TimeStamp_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))TIME_STAMP")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats1:EpicsTSSec_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))EPICS_TS_SEC")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats1:EpicsTSNsec_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))EPICS_TS_NSEC")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records provide statistics on array callbacks and        #
#  array callback rates                                           # 
###################################################################
record(longout, "$(CAM):Stats1:ArrayCounter")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))ARRAY_COUNTER")
}

record(longin, "$(CAM):Stats1:ArrayCounter_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))ARRAY_COUNTER")
    field(SCAN, "I/O Intr")
    field(TSE,  "-2")
    field(LOW,  "0" )
    field(LSV,  "MINOR" )
    info(autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV TSE")
}

# Updated rate calculation to use a smoothing factor w/ guard against negative values
# 0 rate sets alarm state to MINOR
record(calc, "$(CAM):Stats1:ArrayRate_RBV")
{
    field(INPA, "$(CAM):Stats1:ArrayRate_RBV.LB NPP NMS")   # Previous counter (Last B value)
    field(INPB, "$(CAM):Stats1:ArrayCounter_RBV NPP NMS")   # Current counter value
    field(INPC, "1.0")                                # Delta time in seconds
    field(INPD, "$(CAM):Stats1:ArrayRate_RBV.VAL NPP NMS")  # Previous rate
    field(INPE, "$(RATE_SMOOTH=0.2)")                 # Smoothing factor
    field(CALC, "(D*E)/C+MAX(0,B-A)*(1-E)/C")
    field(PREC, "2" )
    field(EGU,  "Hz" )
    field(SCAN, "1 second")
    field(LOW,  "0")
    field(LSV,  "MINOR")
    field(ADEL, "0.1")
    info(autosaveFields, "ADEL DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV MDEL PREC C E SCAN EGU")
}

###################################################################
#  These records control NDArray callacks                         # 
###################################################################
record(bo, "$(CAM):Stats1:ArrayCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))ARRAY_CALLBACKS")
    field(ZNAM, "Disable")
    field(ZSV,  "MINOR")
    field(ONAM, "Enable")
    field(OSV,  "NO_ALARM")
    field(VAL, "1")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Stats1:ArrayCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))ARRAY_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ZSV,  "MINOR")
    field(ONAM, "Enabled")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains macro definitions for the attributes      # 
###################################################################

record(waveform, "$(CAM):Stats1:NDAttributesMacros")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_MACROS")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

###################################################################
#  This record is the name of a file defining attributes          # 
###################################################################

record(waveform, "$(CAM):Stats1:NDAttributesFile")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_FILE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

###################################################################
#  This record defines the status of reading attributes file      # 
###################################################################

record(mbbi, "$(CAM):Stats1:NDAttributesStatus")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_STATUS")
    field(ZRVL, "0")
    field(ZRST, "Attributes file OK")
    field(ZRSV, "NO_ALARM")
    field(ONVL, "1")
    field(ONST, "File not found")
    field(ONSV, "MINOR")
    field(TWVL, "2")
    field(TWST, "XML syntax error")
    field(TWSV, "MAJOR")
    field(THVL, "3")
    field(THST, "Macro substitution error")
    field(THSV, "MAJOR")
    field(SCAN, "I/O Intr")
}

###################################################################
#  Status of NDArrayPool - number of buffers, memory used etc.    # 
###################################################################

record(ai, "$(CAM):Stats1:PoolMaxMem")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))POOL_MAX_MEMORY")
   field(PREC, "1")
   field(EGU,  "MB")
   field(SCAN, "Passive")
   field(PINI, "YES")
}

record(ai, "$(CAM):Stats1:PoolUsedMem")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))POOL_USED_MEMORY")
   field(PREC, "1")
   field(EGU,  "MB")
   field(SCAN, "1 second")
   field(FLNK, "$(CAM):Stats1:PoolAllocBuffers")
   info(autosaveFields, "SCAN")
}

record(longin, "$(CAM):Stats1:PoolAllocBuffers")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))POOL_ALLOC_BUFFERS")
   field(FLNK, "$(CAM):Stats1:PoolFreeBuffers")
}

record(longin, "$(CAM):Stats1:PoolFreeBuffers")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))POOL_FREE_BUFFERS")
   field(FLNK, "$(CAM):Stats1:PoolUsedBuffers")
}

record(calc, "$(CAM):Stats1:PoolUsedBuffers")
{
    field(INPA, "$(CAM):Stats1:PoolAllocBuffers NPP MS")
    field(INPB, "$(CAM):Stats1:PoolFreeBuffers NPP MS")
    field(CALC, "A-B")
}

record(bo, "$(CAM):Stats1:EmptyFreeList")
{
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))POOL_EMPTY_FREELIST")
}

record(longin, "$(CAM):Stats1:NumQueuedArrays")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))NUM_QUEUED_ARRAYS")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the type of plugin                        #
###################################################################

record(stringin, "$(CAM):Stats1:PluginType_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))PLUGIN_TYPE")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the connection of the server to          #
#  an NDArray driver port and address                             #
###################################################################
# Array port name
record(stringout, "$(CAM):Stats1:NDArrayPort")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))NDARRAY_PORT")
    field(VAL,  "$(CAM_PORT)")
    info(autosaveFields, "DESC VAL")
}

record(stringin, "$(CAM):Stats1:NDArrayPort_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))NDARRAY_PORT")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Stats1:NDArrayAddress")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))NDARRAY_ADDR")
    field(VAL,  "$(NDARRAY_ADDR=0)")
    info(autosaveFields, "DESC VAL")
}

record(longin, "$(CAM):Stats1:NDArrayAddress_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))NDARRAY_ADDR")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control whether callbacks are enabled and        #
#  minimum time between callbacks                                 #
###################################################################
record(bo, "$(CAM):Stats1:EnableCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))ENABLE_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    field(VAL,  "0")
    info(autosaveFields, "DESC VAL")
}

record(bi, "$(CAM):Stats1:EnableCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))ENABLE_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    field(ZSV,  "MINOR")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats1:MinCallbackTime")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))MIN_CALLBACK_TIME")
    field(EGU,  "s")
    field(PREC, "3")
    field(VAL,  "0.0")
    field(DRVL, "0")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):Stats1:MinCallbackTime_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))MIN_CALLBACK_TIME")
    field(EGU,  "s")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats1:MaxArrayRate")
{
    field(DTYP, "Soft Channel")
    field(OUT,  "$(CAM):Stats1:MaxArrayRate_COUT PP")
    field(EGU,  "Hz")
    field(PREC, "3")
    field(VAL,  "0.0")
    info(autosaveFields, "VAL")
}

record(calcout, "$(CAM):Stats1:MaxArrayRate_COUT")
{
    field(INPA, "$(CAM):Stats1:MaxArrayRate")
    field(CALC, "A=0?0:1.0/A")
    field(OUT,  "$(CAM):Stats1:MinCallbackTime PP")
}

record(calc, "$(CAM):Stats1:MaxArrayRate_RBV")
{
    field(INPA, "$(CAM):Stats1:MinCallbackTime_RBV CP")
    field(CALC, "A=0?0:1.0/A")
    field(EGU,  "Hz")
    field(PREC, "3")
    field(SCAN, "Passive")
}

record(ao, "$(CAM):Stats1:MaxByteRate")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))MAX_BYTE_RATE")
    field(EGU,  "s")
    field(PREC, "3")
    field(VAL,  "0.0")
    field(DRVL, "0")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):Stats1:MaxByteRate_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))MAX_BYTE_RATE")
    field(EGU,  "s")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the last execution time of the plugin     #
###################################################################
record(ai, "$(CAM):Stats1:ExecutionTime_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))EXECUTION_TIME")
    field(EGU,  "ms")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record requests that the plugin execute again with the    #
#  same NDArray                                                   #
###################################################################
record(bo, "$(CAM):Stats1:ProcessPlugin")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))PROCESS_PLUGIN")
    field(VAL,  "1")
}

###################################################################
#  These records control whether callbacks block or not           #
###################################################################
record(bo, "$(CAM):Stats1:BlockingCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))BLOCKING_CALLBACKS")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(VAL,  "0")
    info(autosaveFields, "DESC ZSV OSV VAL")
}

record(bi, "$(CAM):Stats1:BlockingCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))BLOCKING_CALLBACKS")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(ZSV,  "NO_ALARM")
    field(OSV,  "MINOR")
    field(SCAN, "I/O Intr")
    info( autosaveFields, "DESC ZSV OSV" )
}


record(longout, "$(CAM):Stats1:DroppedArrays")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))DROPPED_ARRAYS")
    field(VAL,  "0")
    info( autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV EGU" )
}

record(longin, "$(CAM):Stats1:DroppedArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))DROPPED_ARRAYS")
    field(SCAN, "I/O Intr")
    field(HIGH, "1")
    field(HSV,  "MINOR")
    info( autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV EGU" )
}

record(longout, "$(CAM):Stats1:QueueSize")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))QUEUE_SIZE")
    field(PINI, "YES")
    info( autosaveFields, "DESC EGU" )
}

record(longin, "$(CAM):Stats1:QueueSize_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))QUEUE_SIZE")
    field(FLNK, "$(CAM):Stats1:QueueFreeLow")
    field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):Stats1:QueueFreeLow") {
    field(CALC, "A*0.25")
    field(INPA, "$(CAM):Stats1:QueueSize")
    field(OUT,  "$(CAM):Stats1:QueueFree.LOW")
    field(FLNK, "$(CAM):Stats1:QueueUseHIGH")
}

# Set a HIGH warning level for the input queue fill level to 75%
# of the full size of the queue
record(calcout, "$(CAM):Stats1:QueueUseHIGH") {
   field(CALC, "A*0.75")
   field(INPA, "$(CAM):Stats1:QueueSize")
   field(OUT,  "$(CAM):Stats1:QueueUse.HIGH")
   field(FLNK, "$(CAM):Stats1:QueueUseHIHI")
}

# Set a HIHI level for the input queue fill level to indicate an error
# (MAJOR alarm)  when it fills up to the full size of the queue (frames start dropping)
record(calcout, "$(CAM):Stats1:QueueUseHIHI") {
   field(CALC, "A*1.0")
   field(INPA, "$(CAM):Stats1:QueueSize")
   field(OUT,  "$(CAM):Stats1:QueueUse.HIHI")
}

record(longin, "$(CAM):Stats1:QueueFree")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))QUEUE_FREE")
    field(LLSV, "MAJOR")
    field(LSV,  "MINOR")
    field(LOLO, "0")
    field(HYST, "1")
    field(SCAN, "I/O Intr")
}

# Display the fill level on the plugins input queue
record(calc, "$(CAM):Stats1:QueueUse") {
    field(CALC, "A-B")
    field(INPA, "$(CAM):Stats1:QueueSize")
    field(INPB, "$(CAM):Stats1:QueueFree CP")
    field(SCAN, "Passive")
    field(HHSV, "MAJOR")
    field(HSV,  "MINOR")
    field(HYST, "1")
}

record(longout, "$(CAM):Stats1:NumThreads")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))NUM_THREADS")
    field(VAL,  "1")
    field(PINI, "YES")
    info(autosaveFields, "DESC VAL")
}

record(longin, "$(CAM):Stats1:NumThreads_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))NUM_THREADS")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats1:MaxThreads_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))MAX_THREADS")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control output array sorting                     #
###################################################################
record(mbbo, "$(CAM):Stats1:SortMode") {
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))SORT_MODE")
    field(ZRVL, "0")
    field(ZRST, "Unsorted")
    field(ONVL, "1")
    field(ONST, "Sorted")
}

record(mbbi, "$(CAM):Stats1:SortMode_RBV") {
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))SORT_MODE")
    field(ZRVL, "0")
    field(ZRST, "Unsorted")
    field(ONVL, "1")
    field(ONST, "Sorted")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats1:SortTime") {
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))SORT_TIME")
    field(PREC, "3")
    field(VAL, "0.1")
}

record(ai, "$(CAM):Stats1:SortTime_RBV") {
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))SORT_TIME")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Stats1:SortSize")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))SORT_SIZE")
    field(VAL,  "20")
    field(PINI, "YES")
}

record(longin, "$(CAM):Stats1:SortSize_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))SORT_SIZE")
    field(FLNK, "$(CAM):Stats1:SortFreeLow")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats1:SortFree") {
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))SORT_FREE")
    field(LLSV, "MAJOR")
    field(LSV,  "MINOR")
    field(LOLO, "0")
    field(HYST, "1")
    field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):Stats1:SortFreeLow") {
    field(CALC, "A*0.25")
    field(INPA, "$(CAM):Stats1:SortSize")
    field(OUT,  "$(CAM):Stats1:SortFree.LOW")
}

record(longout, "$(CAM):Stats1:DroppedOutputArrays")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))DROPPED_OUTPUT_ARRAYS")
    field(VAL,  "0")
}

record(longin, "$(CAM):Stats1:DroppedOutputArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))DROPPED_OUTPUT_ARRAYS")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Stats1:DisorderedArrays")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))DISORDERED_ARRAYS")
    field(PINI, "YES")
}

record(longin, "$(CAM):Stats1:DisorderedArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))DISORDERED_ARRAYS")
    field(SCAN, "I/O Intr")
}



###################################################################
#  The asynRecord is used for mainly for trace mask               # 
###################################################################
 
# Set ASYN_TRACEIO_HEX bit by default
record(asyn,"$(CAM):Stats1:AsynIO")
{
    field(PORT, "Stats1")
    field(TIB2,"1")
    info("ADType", "ADPlugin")
}


###################################################################
#  These records contain the basic statistics                     #
###################################################################
record(bo, "$(CAM):Stats1:ComputeStatistics")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))COMPUTE_STATISTICS")
   field(VAL,  "1")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Stats1:ComputeStatistics_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))COMPUTE_STATISTICS")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(ZSV,  "MINOR")
   field(OSV,  "NO_ALARM")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Stats1:BgdWidth")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))BGD_WIDTH")
   field(VAL,  "1")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Stats1:BgdWidth_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))BGD_WIDTH")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats1:MinValue")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))MIN_VALUE")
}

record(ai, "$(CAM):Stats1:MinValue_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))MIN_VALUE")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats1:MaxValue")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))MAX_VALUE")
}

record(ai, "$(CAM):Stats1:MaxValue_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))MAX_VALUE")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats1:MeanValue")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))MEAN_VALUE")
}

record(ai, "$(CAM):Stats1:MeanValue_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))MEAN_VALUE")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats1:SigmaValue")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))SIGMA_VALUE")
}

record(ai, "$(CAM):Stats1:Sigma_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))SIGMA_VALUE")
   field(PREC, "1")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats1:Total")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))TOTAL")
}

record(ai, "$(CAM):Stats1:Total_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))TOTAL")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats1:Net")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))NET")
}

record(ai, "$(CAM):Stats1:Net_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))NET")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats1:MinX")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))MIN_X")
}

record(ai, "$(CAM):Stats1:MinX_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))MIN_X")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats1:MinY")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))MIN_Y")
}

record(ai, "$(CAM):Stats1:MinY_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))MIN_Y")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats1:MaxX")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))MAX_X")
}

record(ai, "$(CAM):Stats1:MaxX_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))MAX_X")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats1:MaxY")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))MAX_Y")
}

record(ai, "$(CAM):Stats1:MaxY_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))MAX_Y")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

###################################################################
#  These records control whether centroid statistics are computed #
###################################################################
record(bo, "$(CAM):Stats1:ComputeCentroid")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))COMPUTE_CENTROID")
   field(VAL,  "0")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Stats1:ComputeCentroid_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))COMPUTE_CENTROID")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(ZSV,  "MINOR")
   field(OSV,  "NO_ALARM")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records contain the centroid statistics                  #
###################################################################
record(ao, "$(CAM):Stats1:CentroidThreshold")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))CENTROID_THRESHOLD")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):Stats1:CentroidThreshold_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))CENTROID_THRESHOLD")
    field(VAL,  "0")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats1:CentroidTotal")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))CENTROID_TOTAL")
}

record(ai, "$(CAM):Stats1:CentroidTotal_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))CENTROID_TOTAL")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats1:CentroidX")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))CENTROIDX_VALUE")
}

record(ai, "$(CAM):Stats1:CentroidX_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))CENTROIDX_VALUE")
   field(PREC, "1")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats1:CentroidY")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))CENTROIDY_VALUE")
}

record(ai, "$(CAM):Stats1:CentroidY_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))CENTROIDY_VALUE")
   field(PREC, "1")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats1:SigmaX")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))SIGMAX_VALUE")
}

record(ai, "$(CAM):Stats1:SigmaX_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))SIGMAX_VALUE")
   field(PREC, "1")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats1:SigmaY")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))SIGMAY_VALUE")
}

record(ai, "$(CAM):Stats1:SigmaY_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))SIGMAY_VALUE")
   field(PREC, "1")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats1:SigmaXY")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))SIGMAXY_VALUE")
}

record(ai, "$(CAM):Stats1:SigmaXY_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))SIGMAXY_VALUE")
   field(PREC, "3")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats1:SkewX")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))SKEWX_VALUE")
}

record(ai, "$(CAM):Stats1:SkewX_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))SKEWX_VALUE")
   field(PREC, "3")
   field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats1:SkewY")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))SKEWY_VALUE")
}

record(ai, "$(CAM):Stats1:SkewY_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))SKEWY_VALUE")
   field(PREC, "3")
   field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats1:KurtosisX")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))KURTOSISX_VALUE")
}

record(ai, "$(CAM):Stats1:KurtosisX_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))KURTOSISX_VALUE")
   field(PREC, "3")
   field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats1:KurtosisY")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))KURTOSISY_VALUE")
}

record(ai, "$(CAM):Stats1:KurtosisY_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))KURTOSISY_VALUE")
   field(PREC, "3")
   field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats1:Eccentricity")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))ECCENTRICITY_VALUE")
}

record(ai, "$(CAM):Stats1:Eccentricity_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))ECCENTRICITY_VALUE")
   field(PREC, "3")
   field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats1:Orientation")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))ORIENTATION_VALUE")
}

record(ai, "$(CAM):Stats1:Orientation_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))ORIENTATION_VALUE")
   field(PREC, "3")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control time series                              #
###################################################################
record(waveform, "$(CAM):Stats1:TSMinValue")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats1_TS,0,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats1:TSMinX")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats1_TS,1,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats1:TSMinY")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats1_TS,2,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats1:TSMaxValue")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats1_TS,3,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats1:TSMaxX")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats1_TS,4,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats1:TSMaxY")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats1_TS,5,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats1:TSMeanValue")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats1_TS,6,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats1:TSSigma")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats1_TS,7,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats1:TSTotal")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats1_TS,8,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats1:TSNet")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats1_TS,9,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats1:TSCentroidTotal")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats1_TS,10,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats1:TSCentroidX")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats1_TS,11,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats1:TSCentroidY")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats1_TS,12,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats1:TSSigmaX")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats1_TS,13,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats1:TSSigmaY")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats1_TS,14,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats1:TSSigmaXY")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats1_TS,15,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats1:TSSkewX")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats1_TS,16,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats1:TSSkewY")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats1_TS,17,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats1:TSKurtosisX")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats1_TS,18,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats1:TSKurtosisY")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats1_TS,19,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats1:TSEccentricity")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats1_TS,20,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats1:TSOrientation")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats1_TS,21,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats1:TSTimestamp")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats1_TS,22,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control profiles                                 #
###################################################################
record(bo, "$(CAM):Stats1:ComputeProfiles")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))COMPUTE_PROFILES")
   field(VAL,  "0")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Stats1:ComputeProfiles_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))COMPUTE_PROFILES")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(ZSV,  "MINOR")
   field(OSV,  "NO_ALARM")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats1:ProfileSizeX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))PROFILE_SIZE_X")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats1:ProfileSizeY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))PROFILE_SIZE_Y")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Stats1:CursorX")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))CURSOR_X")
   field(VAL,  "256")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Stats1:CursorX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))CURSOR_X")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Stats1:CursorY")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))CURSOR_Y")
   field(VAL,  "256")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Stats1:CursorY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))CURSOR_Y")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats1:ProfileAverageX_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))PROFILE_AVERAGE_X")
   field(FTVL, "DOUBLE")
   field(NELM, "$(XSIZE)")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats1:ProfileAverageY_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))PROFILE_AVERAGE_Y")
   field(FTVL, "DOUBLE")
   field(NELM, "$(YSIZE)")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats1:ProfileThresholdX_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))PROFILE_THRESHOLD_X")
   field(FTVL, "DOUBLE")
   field(NELM, "$(XSIZE)")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats1:ProfileThresholdY_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))PROFILE_THRESHOLD_Y")
   field(FTVL, "DOUBLE")
   field(NELM, "$(YSIZE)")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats1:ProfileCentroidX_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))PROFILE_CENTROID_X")
   field(FTVL, "DOUBLE")
   field(NELM, "$(XSIZE)")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(waveform, "$(CAM):Stats1:ProfileCentroidY_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))PROFILE_CENTROID_Y")
   field(FTVL, "DOUBLE")
   field(NELM, "$(YSIZE)")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(waveform, "$(CAM):Stats1:ProfileCursorX_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))PROFILE_CURSOR_X")
   field(FTVL, "DOUBLE")
   field(NELM, "$(XSIZE)")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(waveform, "$(CAM):Stats1:ProfileCursorY_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))PROFILE_CURSOR_Y")
   field(FTVL, "DOUBLE")
   field(NELM, "$(YSIZE)")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}


###################################################################
#  These are used to define the histogram                         #
###################################################################
record(bo, "$(CAM):Stats1:ComputeHistogram")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))COMPUTE_HISTOGRAM")
   field(VAL,  "0")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Stats1:ComputeHistogram_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))COMPUTE_HISTOGRAM")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(ZSV,  "MINOR")
   field(OSV,  "NO_ALARM")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Stats1:HistSize")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))HIST_SIZE")
   field(VAL,  "256")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Stats1:HistSize_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))HIST_SIZE")
   field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats1:HistMin")
{
   field(PINI, "YES")
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))HIST_MIN")
   field(VAL,  "0")
   info(autosaveFields, "VAL")
}

record(ai, "$(CAM):Stats1:HistMin_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))HIST_MIN")
   field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats1:HistMax")
{
   field(PINI, "YES")
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))HIST_MAX")
   field(VAL,  "255")
   info(autosaveFields, "VAL")
}

record(ai, "$(CAM):Stats1:HistMax_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))HIST_MAX")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Stats1:HistBelow")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))HIST_BELOW")
}

record(longin, "$(CAM):Stats1:HistBelow_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))HIST_BELOW")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Stats1:HistAbove")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))HIST_ABOVE")
}

record(longin, "$(CAM):Stats1:HistAbove_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))HIST_ABOVE")
   field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats1:HistEntropy")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))HIST_ENTROPY")
}

record(ai, "$(CAM):Stats1:HistEntropy_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))HIST_ENTROPY")
   field(PREC, "3")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats1:Histogram_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))HIST_ARRAY")
   field(FTVL, "DOUBLE")
   field(NELM, "256")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats1:HistogramX_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats1,$(ADDR=0),$(TIMEOUT=1))HIST_X_ARRAY")
   field(FTVL, "DOUBLE")
   field(NELM, "256")
   field(SCAN, "I/O Intr")
}


###################################################################
#  These records set the HOPR and LOPR values for the cursor      #
#  and size to the maximum for the input array                    #
###################################################################

record(longin, "$(CAM):Stats1:MaxSizeX")
{
    field(INP,  "$(CAM):Stats1:ProfileSizeX_RBV CP")
    field(FLNK, "$(CAM):Stats1:SetXHOPR.PROC PP")
}

record(dfanout, "$(CAM):Stats1:SetXHOPR")
{
    field(DOL,  "$(CAM):Stats1:MaxSizeX NPP")
    field(OMSL, "closed_loop")
    field(OUTA, "$(CAM):Stats1:CursorX.HOPR NPP")
}

record(longin, "$(CAM):Stats1:MaxSizeY")
{
    field(INP,  "$(CAM):Stats1:ProfileSizeY_RBV CP")
    field(FLNK, "$(CAM):Stats1:SetYHOPR.PROC PP")
}

record(dfanout, "$(CAM):Stats1:SetYHOPR")
{
    field(DOL,  "$(CAM):Stats1:MaxSizeY NPP")
    field(OMSL, "closed_loop")
    field(OUTA, "$(CAM):Stats1:CursorY.HOPR NPP")
}

###################################################################
#  These records reset the statistics                             #
###################################################################
record(sseq, "$(CAM):Stats1:Reset")
{
   field(LNK1, "$(CAM):Stats1:MinValue PP MS")    
   field(LNK2, "$(CAM):Stats1:MaxValue PP MS")    
   field(LNK3, "$(CAM):Stats1:MeanValue PP MS")    
   field(LNK4, "$(CAM):Stats1:SigmaValue PP MS")    
   field(LNK5, "$(CAM):Stats1:Total PP MS")    
   field(LNK6, "$(CAM):Stats1:Net PP MS")    
   field(LNK7, "$(CAM):Stats1:MinX PP MS")    
   field(LNK8, "$(CAM):Stats1:MinY PP MS")    
   field(LNK9, "$(CAM):Stats1:MaxX PP MS")
   field(LNKA, "$(CAM):Stats1:MaxY PP MS")    
   field(FLNK, "$(CAM):Stats1:Reset1")   
}

record(sseq, "$(CAM):Stats1:Reset1")
{
   field(LNK1, "$(CAM):Stats1:CentroidX PP MS")    
   field(LNK2, "$(CAM):Stats1:CentroidY PP MS")    
   field(LNK3, "$(CAM):Stats1:SigmaX PP MS")    
   field(LNK4, "$(CAM):Stats1:SigmaY PP MS")    
   field(LNK5, "$(CAM):Stats1:SigmaXY PP MS")    
   field(LNK6, "$(CAM):Stats1:CentroidTotal PP MS")    
   field(LNK7, "$(CAM):Stats1:SkewX PP MS")    
   field(LNK8, "$(CAM):Stats1:SkewY PP MS")    
   field(LNK9, "$(CAM):Stats1:KurtosisX PP MS")    
   field(LNKA, "$(CAM):Stats1:KurtosisY PP MS")    
   field(FLNK, "$(CAM):Stats1:Reset2")   
}

record(sseq, "$(CAM):Stats1:Reset2")
{
   field(LNK1, "$(CAM):Stats1:Eccentricity PP MS")    
   field(LNK2, "$(CAM):Stats1:Orientation PP MS")    
   field(LNK3, "$(CAM):Stats1:HistBelow PP MS")    
   field(LNK4, "$(CAM):Stats1:HistAbove PP MS")    
   field(LNK5, "$(CAM):Stats1:HistEntropy PP MS")    
}

#=================================================================#
# Template file: NDStats.template

#=================================================================#
# Template file: NDPluginBase.template
# Database for NDPluginBase, i.e. records common to all plugins
# Mark Rivers
# April 25, 2008

#=================================================================#
# Template file: NDArrayBase.template
# Database for area detector control using asyn driver and standard asyn device support
# Mark Rivers
# March 9, 2008

###################################################################
#  This record contains the version of ADCore                     #
###################################################################

record(stringin, "$(CAM):Stats2:ADCoreVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))ADCORE_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the version of the driver or plugin       #
###################################################################

record(stringin, "$(CAM):Stats2:DriverVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))DRIVER_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the asyn port name of this detector       #
###################################################################

record(stringin, "$(CAM):Stats2:PortName_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))PORT_NAME_SELF")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records contain basic information about the detector     # 
###################################################################

record(stringin, "$(CAM):Stats2:Manufacturer_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))MANUFACTURER")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):Stats2:Model_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))MODEL")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):Stats2:SerialNumber_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))SERIAL_NUMBER")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):Stats2:SDKVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))SDK_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):Stats2:FirmwareVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))FIRMWARE_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control acquisition start and stop               #
###################################################################

record(bo, "$(CAM):Stats2:Acquire") {
   field(DTYP, "asynInt32")
   field(OUT, "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))ACQUIRE")
   field(ZNAM, "Done")
   field(ONAM, "Acquire")
   field(VAL,  "0")
   field(FLNK, "$(CAM):Stats2:SetAcquireBusy")
   info(asyn:READBACK, "1")
}

record(bi, "$(CAM):Stats2:Acquire_RBV") {
   field(DTYP, "asynInt32")
   field(INP, "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))ACQUIRE")
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):Stats2:SetAcquireBusy")
{
    field(INPA, "$(CAM):Stats2:Acquire NPP")
    field(CALC, "A")
    field(OOPT, "Transition To Non-zero")
    field(OUT,  "$(CAM):Stats2:AcquireBusy PP")
}

record(busy, "$(CAM):Stats2:AcquireBusy") {
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(VAL,  "0")
}

record(bi, "$(CAM):Stats2:AcquireBusyCB") {
   field(DTYP, "asynInt32")
   field(INP, "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))ACQUIRE_BUSY")
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):Stats2:ClearAcquireBusy") {
    field(INPA, "$(CAM):Stats2:AcquireBusyCB CP")
    field(CALC, "A")
    field(OOPT, "Transition To Zero")
    field(OUT,  "$(CAM):Stats2:AcquireBusy PP")
}

record(bo, "$(CAM):Stats2:WaitForPlugins") {
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT, "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))WAIT_FOR_PLUGINS")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(VAL,  "0")
}

###################################################################
#  These records are the array size and data type                 #
###################################################################
# The number of dimensions
record(longout, "$(CAM):Stats2:NDimensions")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))ARRAY_NDIMENSIONS")
}

record(longin, "$(CAM):Stats2:NDimensions_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))ARRAY_NDIMENSIONS")
    field(SCAN, "I/O Intr")
}

# The array dimensions waveform records
record(waveform, "$(CAM):Stats2:Dimensions")
{
    field(DTYP, "asynInt32ArrayOut")
    field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))ARRAY_DIMENSIONS")
    field(FTVL, "LONG")
    field(NELM, "10")
    field(FLNK, "$(CAM):Stats2:Dim0SA")
}

record(subArray, "$(CAM):Stats2:Dim0SA")
{
    field(INP,  "$(CAM):Stats2:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "0")
    field(FLNK, "$(CAM):Stats2:ArraySize0")
}

record(longin, "$(CAM):Stats2:ArraySize0")
{
    field(INP,  "$(CAM):Stats2:Dim0SA")
    field(FLNK, "$(CAM):Stats2:Dim1SA")
}

record(subArray, "$(CAM):Stats2:Dim1SA")
{
    field(INP,  "$(CAM):Stats2:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "1")
    field(FLNK, "$(CAM):Stats2:ArraySize1")
}

record(longin, "$(CAM):Stats2:ArraySize1")
{
    field(INP,  "$(CAM):Stats2:Dim1SA")
    field(FLNK, "$(CAM):Stats2:Dim2SA")
}

record(subArray, "$(CAM):Stats2:Dim2SA")
{
    field(INP,  "$(CAM):Stats2:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "2")
    field(FLNK, "$(CAM):Stats2:ArraySize2")
}

record(longin, "$(CAM):Stats2:ArraySize2")
{
    field(INP,  "$(CAM):Stats2:Dim2SA")
    field(FLNK, "$(CAM):Stats2:Dim3SA")
}

record(subArray, "$(CAM):Stats2:Dim3SA")
{
    field(INP,  "$(CAM):Stats2:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "3")
    field(FLNK, "$(CAM):Stats2:ArraySize3")
}

record(longin, "$(CAM):Stats2:ArraySize3")
{
    field(INP,  "$(CAM):Stats2:Dim3SA")
    field(FLNK, "$(CAM):Stats2:Dim4SA")
}

record(subArray, "$(CAM):Stats2:Dim4SA")
{
    field(INP,  "$(CAM):Stats2:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "4")
    field(FLNK, "$(CAM):Stats2:ArraySize4")
}

record(longin, "$(CAM):Stats2:ArraySize4")
{
    field(INP,  "$(CAM):Stats2:Dim4SA")
    field(FLNK, "$(CAM):Stats2:Dim5SA")
}

record(subArray, "$(CAM):Stats2:Dim5SA")
{
    field(INP,  "$(CAM):Stats2:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "5")
    field(FLNK, "$(CAM):Stats2:ArraySize5")
}

record(longin, "$(CAM):Stats2:ArraySize5")
{
    field(INP,  "$(CAM):Stats2:Dim5SA")
    field(FLNK, "$(CAM):Stats2:Dim6SA")
}

record(subArray, "$(CAM):Stats2:Dim6SA")
{
    field(INP,  "$(CAM):Stats2:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "6")
    field(FLNK, "$(CAM):Stats2:ArraySize6")
}

record(longin, "$(CAM):Stats2:ArraySize6")
{
    field(INP,  "$(CAM):Stats2:Dim6SA")
    field(FLNK, "$(CAM):Stats2:Dim7SA")
}

record(subArray, "$(CAM):Stats2:Dim7SA")
{
    field(INP,  "$(CAM):Stats2:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "7")
    field(FLNK, "$(CAM):Stats2:ArraySize7")
}

record(longin, "$(CAM):Stats2:ArraySize7")
{
    field(INP,  "$(CAM):Stats2:Dim7SA")
    field(FLNK, "$(CAM):Stats2:Dim8SA")
}

record(subArray, "$(CAM):Stats2:Dim8SA")
{
    field(INP,  "$(CAM):Stats2:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "8")
    field(FLNK, "$(CAM):Stats2:ArraySize8")
}

record(longin, "$(CAM):Stats2:ArraySize8")
{
    field(INP,  "$(CAM):Stats2:Dim8SA")
    field(FLNK, "$(CAM):Stats2:Dim9SA")
}

record(subArray, "$(CAM):Stats2:Dim9SA")
{
    field(INP,  "$(CAM):Stats2:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "9")
    field(FLNK, "$(CAM):Stats2:ArraySize9")
}

record(longin, "$(CAM):Stats2:ArraySize9")
{
    field(INP,  "$(CAM):Stats2:Dim9SA")
}


record(waveform, "$(CAM):Stats2:Dimensions_RBV")
{
    field(DTYP, "asynInt32ArrayIn")
    field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))ARRAY_DIMENSIONS")
    field(FTVL, "LONG")
    field(NELM, "10")
    field(FLNK, "$(CAM):Stats2:Dim0SA_RBV")
    field(SCAN, "I/O Intr")
}

record(subArray, "$(CAM):Stats2:Dim0SA_RBV")
{
    field(INP,  "$(CAM):Stats2:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "0")
    field(FLNK, "$(CAM):Stats2:ArraySize0_RBV")
}

record(longin, "$(CAM):Stats2:ArraySize0_RBV")
{
    field(INP,  "$(CAM):Stats2:Dim0SA_RBV")
    field(FLNK, "$(CAM):Stats2:Dim1SA_RBV")
}

record(subArray, "$(CAM):Stats2:Dim1SA_RBV")
{
    field(INP,  "$(CAM):Stats2:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "1")
    field(FLNK, "$(CAM):Stats2:ArraySize1_RBV")
}

record(longin, "$(CAM):Stats2:ArraySize1_RBV")
{
    field(INP,  "$(CAM):Stats2:Dim1SA_RBV")
    field(FLNK, "$(CAM):Stats2:Dim2SA_RBV")
}

record(subArray, "$(CAM):Stats2:Dim2SA_RBV")
{
    field(INP,  "$(CAM):Stats2:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "2")
    field(FLNK, "$(CAM):Stats2:ArraySize2_RBV")
}

record(longin, "$(CAM):Stats2:ArraySize2_RBV")
{
    field(INP,  "$(CAM):Stats2:Dim2SA_RBV")
    field(FLNK, "$(CAM):Stats2:Dim3SA_RBV")
}

record(subArray, "$(CAM):Stats2:Dim3SA_RBV")
{
    field(INP,  "$(CAM):Stats2:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "3")
    field(FLNK, "$(CAM):Stats2:ArraySize3_RBV")
}

record(longin, "$(CAM):Stats2:ArraySize3_RBV")
{
    field(INP,  "$(CAM):Stats2:Dim3SA_RBV")
    field(FLNK, "$(CAM):Stats2:Dim4SA_RBV")
}

record(subArray, "$(CAM):Stats2:Dim4SA_RBV")
{
    field(INP,  "$(CAM):Stats2:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "4")
    field(FLNK, "$(CAM):Stats2:ArraySize4_RBV")
}

record(longin, "$(CAM):Stats2:ArraySize4_RBV")
{
    field(INP,  "$(CAM):Stats2:Dim4SA_RBV")
    field(FLNK, "$(CAM):Stats2:Dim5SA_RBV")
}

record(subArray, "$(CAM):Stats2:Dim5SA_RBV")
{
    field(INP,  "$(CAM):Stats2:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "5")
    field(FLNK, "$(CAM):Stats2:ArraySize5_RBV")
}

record(longin, "$(CAM):Stats2:ArraySize5_RBV")
{
    field(INP,  "$(CAM):Stats2:Dim5SA_RBV")
    field(FLNK, "$(CAM):Stats2:Dim6SA_RBV")
}

record(subArray, "$(CAM):Stats2:Dim6SA_RBV")
{
    field(INP,  "$(CAM):Stats2:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "6")
    field(FLNK, "$(CAM):Stats2:ArraySize6_RBV")
}

record(longin, "$(CAM):Stats2:ArraySize6_RBV")
{
    field(INP,  "$(CAM):Stats2:Dim6SA_RBV")
    field(FLNK, "$(CAM):Stats2:Dim7SA_RBV")
}

record(subArray, "$(CAM):Stats2:Dim7SA_RBV")
{
    field(INP,  "$(CAM):Stats2:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "7")
    field(FLNK, "$(CAM):Stats2:ArraySize7_RBV")
}

record(longin, "$(CAM):Stats2:ArraySize7_RBV")
{
    field(INP,  "$(CAM):Stats2:Dim7SA_RBV")
    field(FLNK, "$(CAM):Stats2:Dim8SA_RBV")
}

record(subArray, "$(CAM):Stats2:Dim8SA_RBV")
{
    field(INP,  "$(CAM):Stats2:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "8")
    field(FLNK, "$(CAM):Stats2:ArraySize8_RBV")
}

record(longin, "$(CAM):Stats2:ArraySize8_RBV")
{
    field(INP,  "$(CAM):Stats2:Dim8SA_RBV")
    field(FLNK, "$(CAM):Stats2:Dim9SA_RBV")
}

record(subArray, "$(CAM):Stats2:Dim9SA_RBV")
{
    field(INP,  "$(CAM):Stats2:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "9")
    field(FLNK, "$(CAM):Stats2:ArraySize9_RBV")
}

record(longin, "$(CAM):Stats2:ArraySize9_RBV")
{
    field(INP,  "$(CAM):Stats2:Dim9SA_RBV")
}


record(mbbi, "$(CAM):Stats2:BayerPattern_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))BAYER_PATTERN")
   field(ZRST, "RGGB")
   field(ZRVL, "0")
   field(ONST, "GBRG")
   field(ONVL, "1")
   field(TWST, "GRBG")
   field(TWVL, "2")
   field(THST, "BGGR")
   field(THVL, "3")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats2:ArraySizeX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_X")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats2:ArraySizeY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_Y")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats2:ArraySizeZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_Z")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats2:ArraySize_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records have information on the compression              # 
###################################################################
record(stringin, "$(CAM):Stats2:Codec_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))CODEC")
   field(VAL,  "")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats2:CompressedSize_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))COMPRESSED_SIZE")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the data type                            # 
###################################################################

record(mbbo, "$(CAM):Stats2:DataType")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))DATA_TYPE")
   field(ZRST, "Int8")
   field(ZRVL, "0")
   field(ONST, "UInt8")
   field(ONVL, "1")
   field(TWST, "Int16")
   field(TWVL, "2")
   field(THST, "UInt16")
   field(THVL, "3")
   field(FRST, "Int32")
   field(FRVL, "4")
   field(FVST, "UInt32")
   field(FVVL, "5")
   field(SXST, "Int64")
   field(SXVL, "6")
   field(SVST, "UInt64")
   field(SVVL, "7")
   field(EIST, "Float32")
   field(EIVL, "8")
   field(NIST, "Float64")
   field(NIVL, "9")
   field(VAL,  "0")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Stats2:DataType_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))DATA_TYPE")
   field(ZRST, "Int8")
   field(ZRVL, "0")
   field(ONST, "UInt8")
   field(ONVL, "1")
   field(TWST, "Int16")
   field(TWVL, "2")
   field(THST, "UInt16")
   field(THVL, "3")
   field(FRST, "Int32")
   field(FRVL, "4")
   field(FVST, "UInt32")
   field(FVVL, "5")
   field(SXST, "Int64")
   field(SXVL, "6")
   field(SVST, "UInt64")
   field(SVVL, "7")
   field(EIST, "Float32")
   field(EIVL, "8")
   field(NIST, "Float64")
   field(NIVL, "9")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats2:BitsPerPixel_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))BITS_PER_PIXEL")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the color mode                           #
#  These choices must agree with NDColorMode_t in NDArray.h       # 
###################################################################

record(mbbo, "$(CAM):Stats2:ColorMode")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))COLOR_MODE")
   field(ZRST, "Mono")
   field(ZRVL, "0")
   field(ONST, "Bayer")
   field(ONVL, "1")
   field(TWST, "RGB1")
   field(TWVL, "2")
   field(THST, "RGB2")
   field(THVL, "3")
   field(FRST, "RGB3")
   field(FRVL, "4")
   field(FVST, "YUV444")
   field(FVVL, "5")
   field(SXST, "YUV422")
   field(SXVL, "6")
   field(SVST, "YUV421")
   field(SVVL, "7")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Stats2:ColorMode_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))COLOR_MODE")
   field(ZRST, "Mono")
   field(ZRVL, "0")
   field(ONST, "Bayer")
   field(ONVL, "1")
   field(TWST, "RGB1")
   field(TWVL, "2")
   field(THST, "RGB2")
   field(THVL, "3")
   field(FRST, "RGB3")
   field(FRVL, "4")
   field(FVST, "YUV444")
   field(FVVL, "5")
   field(SXST, "YUV422")
   field(SXVL, "6")
   field(SVST, "YUV421")
   field(SVVL, "7")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records are the uniqueId and time stamps of the array     #
###################################################################
record(longin, "$(CAM):Stats2:UniqueId_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))UNIQUE_ID")
    field(SCAN, "I/O Intr")
}

record(ai, "$(CAM):Stats2:TimeStamp_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))TIME_STAMP")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats2:EpicsTSSec_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))EPICS_TS_SEC")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats2:EpicsTSNsec_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))EPICS_TS_NSEC")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records provide statistics on array callbacks and        #
#  array callback rates                                           # 
###################################################################
record(longout, "$(CAM):Stats2:ArrayCounter")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))ARRAY_COUNTER")
}

record(longin, "$(CAM):Stats2:ArrayCounter_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))ARRAY_COUNTER")
    field(SCAN, "I/O Intr")
    field(TSE,  "-2")
    field(LOW,  "0" )
    field(LSV,  "MINOR" )
    info(autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV TSE")
}

# Updated rate calculation to use a smoothing factor w/ guard against negative values
# 0 rate sets alarm state to MINOR
record(calc, "$(CAM):Stats2:ArrayRate_RBV")
{
    field(INPA, "$(CAM):Stats2:ArrayRate_RBV.LB NPP NMS")   # Previous counter (Last B value)
    field(INPB, "$(CAM):Stats2:ArrayCounter_RBV NPP NMS")   # Current counter value
    field(INPC, "1.0")                                # Delta time in seconds
    field(INPD, "$(CAM):Stats2:ArrayRate_RBV.VAL NPP NMS")  # Previous rate
    field(INPE, "0.0")                 # Smoothing factor
    field(CALC, "(D*E)/C+MAX(0,B-A)*(1-E)/C")
    field(PREC, "2" )
    field(EGU,  "Hz" )
    field(SCAN, "1 second")
    field(LOW,  "0")
    field(LSV,  "MINOR")
    field(ADEL, "0.1")
    info(autosaveFields, "ADEL DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV MDEL PREC C E SCAN EGU")
}

###################################################################
#  These records control NDArray callacks                         # 
###################################################################
record(bo, "$(CAM):Stats2:ArrayCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))ARRAY_CALLBACKS")
    field(ZNAM, "Disable")
    field(ZSV,  "MINOR")
    field(ONAM, "Enable")
    field(OSV,  "NO_ALARM")
    field(VAL, "1")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Stats2:ArrayCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))ARRAY_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ZSV,  "MINOR")
    field(ONAM, "Enabled")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains macro definitions for the attributes      # 
###################################################################

record(waveform, "$(CAM):Stats2:NDAttributesMacros")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_MACROS")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

###################################################################
#  This record is the name of a file defining attributes          # 
###################################################################

record(waveform, "$(CAM):Stats2:NDAttributesFile")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_FILE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

###################################################################
#  This record defines the status of reading attributes file      # 
###################################################################

record(mbbi, "$(CAM):Stats2:NDAttributesStatus")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_STATUS")
    field(ZRVL, "0")
    field(ZRST, "Attributes file OK")
    field(ZRSV, "NO_ALARM")
    field(ONVL, "1")
    field(ONST, "File not found")
    field(ONSV, "MINOR")
    field(TWVL, "2")
    field(TWST, "XML syntax error")
    field(TWSV, "MAJOR")
    field(THVL, "3")
    field(THST, "Macro substitution error")
    field(THSV, "MAJOR")
    field(SCAN, "I/O Intr")
}

###################################################################
#  Status of NDArrayPool - number of buffers, memory used etc.    # 
###################################################################

record(ai, "$(CAM):Stats2:PoolMaxMem")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))POOL_MAX_MEMORY")
   field(PREC, "1")
   field(EGU,  "MB")
   field(SCAN, "Passive")
   field(PINI, "YES")
}

record(ai, "$(CAM):Stats2:PoolUsedMem")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))POOL_USED_MEMORY")
   field(PREC, "1")
   field(EGU,  "MB")
   field(SCAN, "1 second")
   field(FLNK, "$(CAM):Stats2:PoolAllocBuffers")
   info(autosaveFields, "SCAN")
}

record(longin, "$(CAM):Stats2:PoolAllocBuffers")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))POOL_ALLOC_BUFFERS")
   field(FLNK, "$(CAM):Stats2:PoolFreeBuffers")
}

record(longin, "$(CAM):Stats2:PoolFreeBuffers")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))POOL_FREE_BUFFERS")
   field(FLNK, "$(CAM):Stats2:PoolUsedBuffers")
}

record(calc, "$(CAM):Stats2:PoolUsedBuffers")
{
    field(INPA, "$(CAM):Stats2:PoolAllocBuffers NPP MS")
    field(INPB, "$(CAM):Stats2:PoolFreeBuffers NPP MS")
    field(CALC, "A-B")
}

record(bo, "$(CAM):Stats2:EmptyFreeList")
{
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))POOL_EMPTY_FREELIST")
}

record(longin, "$(CAM):Stats2:NumQueuedArrays")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))NUM_QUEUED_ARRAYS")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the type of plugin                        #
###################################################################

record(stringin, "$(CAM):Stats2:PluginType_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))PLUGIN_TYPE")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the connection of the server to          #
#  an NDArray driver port and address                             #
###################################################################
# Array port name
record(stringout, "$(CAM):Stats2:NDArrayPort")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))NDARRAY_PORT")
    field(VAL,  "$(CAM_PORT)")
    info(autosaveFields, "DESC VAL")
}

record(stringin, "$(CAM):Stats2:NDArrayPort_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))NDARRAY_PORT")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Stats2:NDArrayAddress")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))NDARRAY_ADDR")
    field(VAL,  "$(NDARRAY_ADDR=1)")
    info(autosaveFields, "DESC VAL")
}

record(longin, "$(CAM):Stats2:NDArrayAddress_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))NDARRAY_ADDR")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control whether callbacks are enabled and        #
#  minimum time between callbacks                                 #
###################################################################
record(bo, "$(CAM):Stats2:EnableCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))ENABLE_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    field(VAL,  "0")
    info(autosaveFields, "DESC VAL")
}

record(bi, "$(CAM):Stats2:EnableCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))ENABLE_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    field(ZSV,  "MINOR")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats2:MinCallbackTime")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))MIN_CALLBACK_TIME")
    field(EGU,  "s")
    field(PREC, "3")
    field(VAL,  "0.0")
    field(DRVL, "0")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):Stats2:MinCallbackTime_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))MIN_CALLBACK_TIME")
    field(EGU,  "s")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats2:MaxArrayRate")
{
    field(DTYP, "Soft Channel")
    field(OUT,  "$(CAM):Stats2:MaxArrayRate_COUT PP")
    field(EGU,  "Hz")
    field(PREC, "3")
    field(VAL,  "0.0")
    info(autosaveFields, "VAL")
}

record(calcout, "$(CAM):Stats2:MaxArrayRate_COUT")
{
    field(INPA, "$(CAM):Stats2:MaxArrayRate")
    field(CALC, "A=0?0:1.0/A")
    field(OUT,  "$(CAM):Stats2:MinCallbackTime PP")
}

record(calc, "$(CAM):Stats2:MaxArrayRate_RBV")
{
    field(INPA, "$(CAM):Stats2:MinCallbackTime_RBV CP")
    field(CALC, "A=0?0:1.0/A")
    field(EGU,  "Hz")
    field(PREC, "3")
    field(SCAN, "Passive")
}

record(ao, "$(CAM):Stats2:MaxByteRate")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))MAX_BYTE_RATE")
    field(EGU,  "s")
    field(PREC, "3")
    field(VAL,  "0.0")
    field(DRVL, "0")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):Stats2:MaxByteRate_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))MAX_BYTE_RATE")
    field(EGU,  "s")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the last execution time of the plugin     #
###################################################################
record(ai, "$(CAM):Stats2:ExecutionTime_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))EXECUTION_TIME")
    field(EGU,  "ms")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record requests that the plugin execute again with the    #
#  same NDArray                                                   #
###################################################################
record(bo, "$(CAM):Stats2:ProcessPlugin")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))PROCESS_PLUGIN")
    field(VAL,  "1")
}

###################################################################
#  These records control whether callbacks block or not           #
###################################################################
record(bo, "$(CAM):Stats2:BlockingCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))BLOCKING_CALLBACKS")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(VAL,  "0")
    info(autosaveFields, "DESC ZSV OSV VAL")
}

record(bi, "$(CAM):Stats2:BlockingCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))BLOCKING_CALLBACKS")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(ZSV,  "NO_ALARM")
    field(OSV,  "MINOR")
    field(SCAN, "I/O Intr")
    info( autosaveFields, "DESC ZSV OSV" )
}


record(longout, "$(CAM):Stats2:DroppedArrays")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))DROPPED_ARRAYS")
    field(VAL,  "0")
    info( autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV EGU" )
}

record(longin, "$(CAM):Stats2:DroppedArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))DROPPED_ARRAYS")
    field(SCAN, "I/O Intr")
    field(HIGH, "1")
    field(HSV,  "MINOR")
    info( autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV EGU" )
}

record(longout, "$(CAM):Stats2:QueueSize")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))QUEUE_SIZE")
    field(PINI, "YES")
    info( autosaveFields, "DESC EGU" )
}

record(longin, "$(CAM):Stats2:QueueSize_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))QUEUE_SIZE")
    field(FLNK, "$(CAM):Stats2:QueueFreeLow")
    field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):Stats2:QueueFreeLow") {
    field(CALC, "A*0.25")
    field(INPA, "$(CAM):Stats2:QueueSize")
    field(OUT,  "$(CAM):Stats2:QueueFree.LOW")
    field(FLNK, "$(CAM):Stats2:QueueUseHIGH")
}

# Set a HIGH warning level for the input queue fill level to 75%
# of the full size of the queue
record(calcout, "$(CAM):Stats2:QueueUseHIGH") {
   field(CALC, "A*0.75")
   field(INPA, "$(CAM):Stats2:QueueSize")
   field(OUT,  "$(CAM):Stats2:QueueUse.HIGH")
   field(FLNK, "$(CAM):Stats2:QueueUseHIHI")
}

# Set a HIHI level for the input queue fill level to indicate an error
# (MAJOR alarm)  when it fills up to the full size of the queue (frames start dropping)
record(calcout, "$(CAM):Stats2:QueueUseHIHI") {
   field(CALC, "A*1.0")
   field(INPA, "$(CAM):Stats2:QueueSize")
   field(OUT,  "$(CAM):Stats2:QueueUse.HIHI")
}

record(longin, "$(CAM):Stats2:QueueFree")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))QUEUE_FREE")
    field(LLSV, "MAJOR")
    field(LSV,  "MINOR")
    field(LOLO, "0")
    field(HYST, "1")
    field(SCAN, "I/O Intr")
}

# Display the fill level on the plugins input queue
record(calc, "$(CAM):Stats2:QueueUse") {
    field(CALC, "A-B")
    field(INPA, "$(CAM):Stats2:QueueSize")
    field(INPB, "$(CAM):Stats2:QueueFree CP")
    field(SCAN, "Passive")
    field(HHSV, "MAJOR")
    field(HSV,  "MINOR")
    field(HYST, "1")
}

record(longout, "$(CAM):Stats2:NumThreads")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))NUM_THREADS")
    field(VAL,  "1")
    field(PINI, "YES")
    info(autosaveFields, "DESC VAL")
}

record(longin, "$(CAM):Stats2:NumThreads_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))NUM_THREADS")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats2:MaxThreads_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))MAX_THREADS")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control output array sorting                     #
###################################################################
record(mbbo, "$(CAM):Stats2:SortMode") {
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))SORT_MODE")
    field(ZRVL, "0")
    field(ZRST, "Unsorted")
    field(ONVL, "1")
    field(ONST, "Sorted")
}

record(mbbi, "$(CAM):Stats2:SortMode_RBV") {
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))SORT_MODE")
    field(ZRVL, "0")
    field(ZRST, "Unsorted")
    field(ONVL, "1")
    field(ONST, "Sorted")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats2:SortTime") {
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))SORT_TIME")
    field(PREC, "3")
    field(VAL, "0.1")
}

record(ai, "$(CAM):Stats2:SortTime_RBV") {
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))SORT_TIME")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Stats2:SortSize")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))SORT_SIZE")
    field(VAL,  "20")
    field(PINI, "YES")
}

record(longin, "$(CAM):Stats2:SortSize_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))SORT_SIZE")
    field(FLNK, "$(CAM):Stats2:SortFreeLow")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats2:SortFree") {
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))SORT_FREE")
    field(LLSV, "MAJOR")
    field(LSV,  "MINOR")
    field(LOLO, "0")
    field(HYST, "1")
    field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):Stats2:SortFreeLow") {
    field(CALC, "A*0.25")
    field(INPA, "$(CAM):Stats2:SortSize")
    field(OUT,  "$(CAM):Stats2:SortFree.LOW")
}

record(longout, "$(CAM):Stats2:DroppedOutputArrays")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))DROPPED_OUTPUT_ARRAYS")
    field(VAL,  "0")
}

record(longin, "$(CAM):Stats2:DroppedOutputArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))DROPPED_OUTPUT_ARRAYS")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Stats2:DisorderedArrays")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))DISORDERED_ARRAYS")
    field(PINI, "YES")
}

record(longin, "$(CAM):Stats2:DisorderedArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))DISORDERED_ARRAYS")
    field(SCAN, "I/O Intr")
}



###################################################################
#  The asynRecord is used for mainly for trace mask               # 
###################################################################
 
# Set ASYN_TRACEIO_HEX bit by default
record(asyn,"$(CAM):Stats2:AsynIO")
{
    field(PORT, "Stats2")
    field(TIB2,"1")
    info("ADType", "ADPlugin")
}


###################################################################
#  These records contain the basic statistics                     #
###################################################################
record(bo, "$(CAM):Stats2:ComputeStatistics")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))COMPUTE_STATISTICS")
   field(VAL,  "1")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Stats2:ComputeStatistics_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))COMPUTE_STATISTICS")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(ZSV,  "MINOR")
   field(OSV,  "NO_ALARM")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Stats2:BgdWidth")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))BGD_WIDTH")
   field(VAL,  "1")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Stats2:BgdWidth_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))BGD_WIDTH")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats2:MinValue")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))MIN_VALUE")
}

record(ai, "$(CAM):Stats2:MinValue_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))MIN_VALUE")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats2:MaxValue")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))MAX_VALUE")
}

record(ai, "$(CAM):Stats2:MaxValue_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))MAX_VALUE")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats2:MeanValue")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))MEAN_VALUE")
}

record(ai, "$(CAM):Stats2:MeanValue_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))MEAN_VALUE")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats2:SigmaValue")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))SIGMA_VALUE")
}

record(ai, "$(CAM):Stats2:Sigma_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))SIGMA_VALUE")
   field(PREC, "1")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats2:Total")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))TOTAL")
}

record(ai, "$(CAM):Stats2:Total_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))TOTAL")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats2:Net")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))NET")
}

record(ai, "$(CAM):Stats2:Net_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))NET")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats2:MinX")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))MIN_X")
}

record(ai, "$(CAM):Stats2:MinX_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))MIN_X")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats2:MinY")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))MIN_Y")
}

record(ai, "$(CAM):Stats2:MinY_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))MIN_Y")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats2:MaxX")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))MAX_X")
}

record(ai, "$(CAM):Stats2:MaxX_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))MAX_X")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats2:MaxY")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))MAX_Y")
}

record(ai, "$(CAM):Stats2:MaxY_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))MAX_Y")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

###################################################################
#  These records control whether centroid statistics are computed #
###################################################################
record(bo, "$(CAM):Stats2:ComputeCentroid")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))COMPUTE_CENTROID")
   field(VAL,  "0")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Stats2:ComputeCentroid_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))COMPUTE_CENTROID")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(ZSV,  "MINOR")
   field(OSV,  "NO_ALARM")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records contain the centroid statistics                  #
###################################################################
record(ao, "$(CAM):Stats2:CentroidThreshold")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))CENTROID_THRESHOLD")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):Stats2:CentroidThreshold_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))CENTROID_THRESHOLD")
    field(VAL,  "0")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats2:CentroidTotal")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))CENTROID_TOTAL")
}

record(ai, "$(CAM):Stats2:CentroidTotal_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))CENTROID_TOTAL")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats2:CentroidX")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))CENTROIDX_VALUE")
}

record(ai, "$(CAM):Stats2:CentroidX_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))CENTROIDX_VALUE")
   field(PREC, "1")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats2:CentroidY")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))CENTROIDY_VALUE")
}

record(ai, "$(CAM):Stats2:CentroidY_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))CENTROIDY_VALUE")
   field(PREC, "1")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats2:SigmaX")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))SIGMAX_VALUE")
}

record(ai, "$(CAM):Stats2:SigmaX_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))SIGMAX_VALUE")
   field(PREC, "1")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats2:SigmaY")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))SIGMAY_VALUE")
}

record(ai, "$(CAM):Stats2:SigmaY_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))SIGMAY_VALUE")
   field(PREC, "1")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats2:SigmaXY")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))SIGMAXY_VALUE")
}

record(ai, "$(CAM):Stats2:SigmaXY_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))SIGMAXY_VALUE")
   field(PREC, "3")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats2:SkewX")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))SKEWX_VALUE")
}

record(ai, "$(CAM):Stats2:SkewX_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))SKEWX_VALUE")
   field(PREC, "3")
   field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats2:SkewY")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))SKEWY_VALUE")
}

record(ai, "$(CAM):Stats2:SkewY_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))SKEWY_VALUE")
   field(PREC, "3")
   field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats2:KurtosisX")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))KURTOSISX_VALUE")
}

record(ai, "$(CAM):Stats2:KurtosisX_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))KURTOSISX_VALUE")
   field(PREC, "3")
   field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats2:KurtosisY")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))KURTOSISY_VALUE")
}

record(ai, "$(CAM):Stats2:KurtosisY_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))KURTOSISY_VALUE")
   field(PREC, "3")
   field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats2:Eccentricity")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))ECCENTRICITY_VALUE")
}

record(ai, "$(CAM):Stats2:Eccentricity_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))ECCENTRICITY_VALUE")
   field(PREC, "3")
   field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats2:Orientation")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))ORIENTATION_VALUE")
}

record(ai, "$(CAM):Stats2:Orientation_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))ORIENTATION_VALUE")
   field(PREC, "3")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control time series                              #
###################################################################
record(waveform, "$(CAM):Stats2:TSMinValue")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats2_TS,0,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats2:TSMinX")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats2_TS,1,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats2:TSMinY")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats2_TS,2,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats2:TSMaxValue")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats2_TS,3,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats2:TSMaxX")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats2_TS,4,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats2:TSMaxY")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats2_TS,5,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats2:TSMeanValue")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats2_TS,6,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats2:TSSigma")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats2_TS,7,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats2:TSTotal")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats2_TS,8,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats2:TSNet")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats2_TS,9,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats2:TSCentroidTotal")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats2_TS,10,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats2:TSCentroidX")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats2_TS,11,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats2:TSCentroidY")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats2_TS,12,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats2:TSSigmaX")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats2_TS,13,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats2:TSSigmaY")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats2_TS,14,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats2:TSSigmaXY")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats2_TS,15,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats2:TSSkewX")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats2_TS,16,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats2:TSSkewY")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats2_TS,17,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats2:TSKurtosisX")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats2_TS,18,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats2:TSKurtosisY")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats2_TS,19,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats2:TSEccentricity")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats2_TS,20,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats2:TSOrientation")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats2_TS,21,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats2:TSTimestamp")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats2_TS,22,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control profiles                                 #
###################################################################
record(bo, "$(CAM):Stats2:ComputeProfiles")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))COMPUTE_PROFILES")
   field(VAL,  "0")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Stats2:ComputeProfiles_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))COMPUTE_PROFILES")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(ZSV,  "MINOR")
   field(OSV,  "NO_ALARM")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats2:ProfileSizeX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))PROFILE_SIZE_X")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats2:ProfileSizeY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))PROFILE_SIZE_Y")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Stats2:CursorX")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))CURSOR_X")
   field(VAL,  "256")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Stats2:CursorX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))CURSOR_X")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Stats2:CursorY")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))CURSOR_Y")
   field(VAL,  "256")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Stats2:CursorY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))CURSOR_Y")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats2:ProfileAverageX_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))PROFILE_AVERAGE_X")
   field(FTVL, "DOUBLE")
   field(NELM, "$(XSIZE)")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats2:ProfileAverageY_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))PROFILE_AVERAGE_Y")
   field(FTVL, "DOUBLE")
   field(NELM, "$(YSIZE)")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats2:ProfileThresholdX_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))PROFILE_THRESHOLD_X")
   field(FTVL, "DOUBLE")
   field(NELM, "$(XSIZE)")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats2:ProfileThresholdY_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))PROFILE_THRESHOLD_Y")
   field(FTVL, "DOUBLE")
   field(NELM, "$(YSIZE)")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats2:ProfileCentroidX_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))PROFILE_CENTROID_X")
   field(FTVL, "DOUBLE")
   field(NELM, "$(XSIZE)")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(waveform, "$(CAM):Stats2:ProfileCentroidY_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))PROFILE_CENTROID_Y")
   field(FTVL, "DOUBLE")
   field(NELM, "$(YSIZE)")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(waveform, "$(CAM):Stats2:ProfileCursorX_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))PROFILE_CURSOR_X")
   field(FTVL, "DOUBLE")
   field(NELM, "$(XSIZE)")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(waveform, "$(CAM):Stats2:ProfileCursorY_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))PROFILE_CURSOR_Y")
   field(FTVL, "DOUBLE")
   field(NELM, "$(YSIZE)")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}


###################################################################
#  These are used to define the histogram                         #
###################################################################
record(bo, "$(CAM):Stats2:ComputeHistogram")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))COMPUTE_HISTOGRAM")
   field(VAL,  "0")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Stats2:ComputeHistogram_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))COMPUTE_HISTOGRAM")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(ZSV,  "MINOR")
   field(OSV,  "NO_ALARM")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Stats2:HistSize")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))HIST_SIZE")
   field(VAL,  "256")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Stats2:HistSize_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))HIST_SIZE")
   field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats2:HistMin")
{
   field(PINI, "YES")
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))HIST_MIN")
   field(VAL,  "0")
   info(autosaveFields, "VAL")
}

record(ai, "$(CAM):Stats2:HistMin_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))HIST_MIN")
   field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats2:HistMax")
{
   field(PINI, "YES")
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))HIST_MAX")
   field(VAL,  "255")
   info(autosaveFields, "VAL")
}

record(ai, "$(CAM):Stats2:HistMax_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))HIST_MAX")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Stats2:HistBelow")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))HIST_BELOW")
}

record(longin, "$(CAM):Stats2:HistBelow_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))HIST_BELOW")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Stats2:HistAbove")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))HIST_ABOVE")
}

record(longin, "$(CAM):Stats2:HistAbove_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))HIST_ABOVE")
   field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats2:HistEntropy")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))HIST_ENTROPY")
}

record(ai, "$(CAM):Stats2:HistEntropy_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))HIST_ENTROPY")
   field(PREC, "3")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats2:Histogram_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))HIST_ARRAY")
   field(FTVL, "DOUBLE")
   field(NELM, "256")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats2:HistogramX_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats2,$(ADDR=0),$(TIMEOUT=1))HIST_X_ARRAY")
   field(FTVL, "DOUBLE")
   field(NELM, "256")
   field(SCAN, "I/O Intr")
}


###################################################################
#  These records set the HOPR and LOPR values for the cursor      #
#  and size to the maximum for the input array                    #
###################################################################

record(longin, "$(CAM):Stats2:MaxSizeX")
{
    field(INP,  "$(CAM):Stats2:ProfileSizeX_RBV CP")
    field(FLNK, "$(CAM):Stats2:SetXHOPR.PROC PP")
}

record(dfanout, "$(CAM):Stats2:SetXHOPR")
{
    field(DOL,  "$(CAM):Stats2:MaxSizeX NPP")
    field(OMSL, "closed_loop")
    field(OUTA, "$(CAM):Stats2:CursorX.HOPR NPP")
}

record(longin, "$(CAM):Stats2:MaxSizeY")
{
    field(INP,  "$(CAM):Stats2:ProfileSizeY_RBV CP")
    field(FLNK, "$(CAM):Stats2:SetYHOPR.PROC PP")
}

record(dfanout, "$(CAM):Stats2:SetYHOPR")
{
    field(DOL,  "$(CAM):Stats2:MaxSizeY NPP")
    field(OMSL, "closed_loop")
    field(OUTA, "$(CAM):Stats2:CursorY.HOPR NPP")
}

###################################################################
#  These records reset the statistics                             #
###################################################################
record(sseq, "$(CAM):Stats2:Reset")
{
   field(LNK1, "$(CAM):Stats2:MinValue PP MS")    
   field(LNK2, "$(CAM):Stats2:MaxValue PP MS")    
   field(LNK3, "$(CAM):Stats2:MeanValue PP MS")    
   field(LNK4, "$(CAM):Stats2:SigmaValue PP MS")    
   field(LNK5, "$(CAM):Stats2:Total PP MS")    
   field(LNK6, "$(CAM):Stats2:Net PP MS")    
   field(LNK7, "$(CAM):Stats2:MinX PP MS")    
   field(LNK8, "$(CAM):Stats2:MinY PP MS")    
   field(LNK9, "$(CAM):Stats2:MaxX PP MS")
   field(LNKA, "$(CAM):Stats2:MaxY PP MS")    
   field(FLNK, "$(CAM):Stats2:Reset1")   
}

record(sseq, "$(CAM):Stats2:Reset1")
{
   field(LNK1, "$(CAM):Stats2:CentroidX PP MS")    
   field(LNK2, "$(CAM):Stats2:CentroidY PP MS")    
   field(LNK3, "$(CAM):Stats2:SigmaX PP MS")    
   field(LNK4, "$(CAM):Stats2:SigmaY PP MS")    
   field(LNK5, "$(CAM):Stats2:SigmaXY PP MS")    
   field(LNK6, "$(CAM):Stats2:CentroidTotal PP MS")    
   field(LNK7, "$(CAM):Stats2:SkewX PP MS")    
   field(LNK8, "$(CAM):Stats2:SkewY PP MS")    
   field(LNK9, "$(CAM):Stats2:KurtosisX PP MS")    
   field(LNKA, "$(CAM):Stats2:KurtosisY PP MS")    
   field(FLNK, "$(CAM):Stats2:Reset2")   
}

record(sseq, "$(CAM):Stats2:Reset2")
{
   field(LNK1, "$(CAM):Stats2:Eccentricity PP MS")    
   field(LNK2, "$(CAM):Stats2:Orientation PP MS")    
   field(LNK3, "$(CAM):Stats2:HistBelow PP MS")    
   field(LNK4, "$(CAM):Stats2:HistAbove PP MS")    
   field(LNK5, "$(CAM):Stats2:HistEntropy PP MS")    
}

#=================================================================#
# Template file: NDStats.template

#=================================================================#
# Template file: NDPluginBase.template
# Database for NDPluginBase, i.e. records common to all plugins
# Mark Rivers
# April 25, 2008

#=================================================================#
# Template file: NDArrayBase.template
# Database for area detector control using asyn driver and standard asyn device support
# Mark Rivers
# March 9, 2008

###################################################################
#  This record contains the version of ADCore                     #
###################################################################

record(stringin, "$(CAM):Stats3:ADCoreVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))ADCORE_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the version of the driver or plugin       #
###################################################################

record(stringin, "$(CAM):Stats3:DriverVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))DRIVER_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the asyn port name of this detector       #
###################################################################

record(stringin, "$(CAM):Stats3:PortName_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))PORT_NAME_SELF")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records contain basic information about the detector     # 
###################################################################

record(stringin, "$(CAM):Stats3:Manufacturer_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))MANUFACTURER")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):Stats3:Model_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))MODEL")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):Stats3:SerialNumber_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))SERIAL_NUMBER")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):Stats3:SDKVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))SDK_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):Stats3:FirmwareVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))FIRMWARE_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control acquisition start and stop               #
###################################################################

record(bo, "$(CAM):Stats3:Acquire") {
   field(DTYP, "asynInt32")
   field(OUT, "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))ACQUIRE")
   field(ZNAM, "Done")
   field(ONAM, "Acquire")
   field(VAL,  "0")
   field(FLNK, "$(CAM):Stats3:SetAcquireBusy")
   info(asyn:READBACK, "1")
}

record(bi, "$(CAM):Stats3:Acquire_RBV") {
   field(DTYP, "asynInt32")
   field(INP, "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))ACQUIRE")
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):Stats3:SetAcquireBusy")
{
    field(INPA, "$(CAM):Stats3:Acquire NPP")
    field(CALC, "A")
    field(OOPT, "Transition To Non-zero")
    field(OUT,  "$(CAM):Stats3:AcquireBusy PP")
}

record(busy, "$(CAM):Stats3:AcquireBusy") {
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(VAL,  "0")
}

record(bi, "$(CAM):Stats3:AcquireBusyCB") {
   field(DTYP, "asynInt32")
   field(INP, "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))ACQUIRE_BUSY")
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):Stats3:ClearAcquireBusy") {
    field(INPA, "$(CAM):Stats3:AcquireBusyCB CP")
    field(CALC, "A")
    field(OOPT, "Transition To Zero")
    field(OUT,  "$(CAM):Stats3:AcquireBusy PP")
}

record(bo, "$(CAM):Stats3:WaitForPlugins") {
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT, "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))WAIT_FOR_PLUGINS")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(VAL,  "0")
}

###################################################################
#  These records are the array size and data type                 #
###################################################################
# The number of dimensions
record(longout, "$(CAM):Stats3:NDimensions")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))ARRAY_NDIMENSIONS")
}

record(longin, "$(CAM):Stats3:NDimensions_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))ARRAY_NDIMENSIONS")
    field(SCAN, "I/O Intr")
}

# The array dimensions waveform records
record(waveform, "$(CAM):Stats3:Dimensions")
{
    field(DTYP, "asynInt32ArrayOut")
    field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))ARRAY_DIMENSIONS")
    field(FTVL, "LONG")
    field(NELM, "10")
    field(FLNK, "$(CAM):Stats3:Dim0SA")
}

record(subArray, "$(CAM):Stats3:Dim0SA")
{
    field(INP,  "$(CAM):Stats3:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "0")
    field(FLNK, "$(CAM):Stats3:ArraySize0")
}

record(longin, "$(CAM):Stats3:ArraySize0")
{
    field(INP,  "$(CAM):Stats3:Dim0SA")
    field(FLNK, "$(CAM):Stats3:Dim1SA")
}

record(subArray, "$(CAM):Stats3:Dim1SA")
{
    field(INP,  "$(CAM):Stats3:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "1")
    field(FLNK, "$(CAM):Stats3:ArraySize1")
}

record(longin, "$(CAM):Stats3:ArraySize1")
{
    field(INP,  "$(CAM):Stats3:Dim1SA")
    field(FLNK, "$(CAM):Stats3:Dim2SA")
}

record(subArray, "$(CAM):Stats3:Dim2SA")
{
    field(INP,  "$(CAM):Stats3:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "2")
    field(FLNK, "$(CAM):Stats3:ArraySize2")
}

record(longin, "$(CAM):Stats3:ArraySize2")
{
    field(INP,  "$(CAM):Stats3:Dim2SA")
    field(FLNK, "$(CAM):Stats3:Dim3SA")
}

record(subArray, "$(CAM):Stats3:Dim3SA")
{
    field(INP,  "$(CAM):Stats3:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "3")
    field(FLNK, "$(CAM):Stats3:ArraySize3")
}

record(longin, "$(CAM):Stats3:ArraySize3")
{
    field(INP,  "$(CAM):Stats3:Dim3SA")
    field(FLNK, "$(CAM):Stats3:Dim4SA")
}

record(subArray, "$(CAM):Stats3:Dim4SA")
{
    field(INP,  "$(CAM):Stats3:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "4")
    field(FLNK, "$(CAM):Stats3:ArraySize4")
}

record(longin, "$(CAM):Stats3:ArraySize4")
{
    field(INP,  "$(CAM):Stats3:Dim4SA")
    field(FLNK, "$(CAM):Stats3:Dim5SA")
}

record(subArray, "$(CAM):Stats3:Dim5SA")
{
    field(INP,  "$(CAM):Stats3:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "5")
    field(FLNK, "$(CAM):Stats3:ArraySize5")
}

record(longin, "$(CAM):Stats3:ArraySize5")
{
    field(INP,  "$(CAM):Stats3:Dim5SA")
    field(FLNK, "$(CAM):Stats3:Dim6SA")
}

record(subArray, "$(CAM):Stats3:Dim6SA")
{
    field(INP,  "$(CAM):Stats3:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "6")
    field(FLNK, "$(CAM):Stats3:ArraySize6")
}

record(longin, "$(CAM):Stats3:ArraySize6")
{
    field(INP,  "$(CAM):Stats3:Dim6SA")
    field(FLNK, "$(CAM):Stats3:Dim7SA")
}

record(subArray, "$(CAM):Stats3:Dim7SA")
{
    field(INP,  "$(CAM):Stats3:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "7")
    field(FLNK, "$(CAM):Stats3:ArraySize7")
}

record(longin, "$(CAM):Stats3:ArraySize7")
{
    field(INP,  "$(CAM):Stats3:Dim7SA")
    field(FLNK, "$(CAM):Stats3:Dim8SA")
}

record(subArray, "$(CAM):Stats3:Dim8SA")
{
    field(INP,  "$(CAM):Stats3:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "8")
    field(FLNK, "$(CAM):Stats3:ArraySize8")
}

record(longin, "$(CAM):Stats3:ArraySize8")
{
    field(INP,  "$(CAM):Stats3:Dim8SA")
    field(FLNK, "$(CAM):Stats3:Dim9SA")
}

record(subArray, "$(CAM):Stats3:Dim9SA")
{
    field(INP,  "$(CAM):Stats3:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "9")
    field(FLNK, "$(CAM):Stats3:ArraySize9")
}

record(longin, "$(CAM):Stats3:ArraySize9")
{
    field(INP,  "$(CAM):Stats3:Dim9SA")
}


record(waveform, "$(CAM):Stats3:Dimensions_RBV")
{
    field(DTYP, "asynInt32ArrayIn")
    field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))ARRAY_DIMENSIONS")
    field(FTVL, "LONG")
    field(NELM, "10")
    field(FLNK, "$(CAM):Stats3:Dim0SA_RBV")
    field(SCAN, "I/O Intr")
}

record(subArray, "$(CAM):Stats3:Dim0SA_RBV")
{
    field(INP,  "$(CAM):Stats3:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "0")
    field(FLNK, "$(CAM):Stats3:ArraySize0_RBV")
}

record(longin, "$(CAM):Stats3:ArraySize0_RBV")
{
    field(INP,  "$(CAM):Stats3:Dim0SA_RBV")
    field(FLNK, "$(CAM):Stats3:Dim1SA_RBV")
}

record(subArray, "$(CAM):Stats3:Dim1SA_RBV")
{
    field(INP,  "$(CAM):Stats3:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "1")
    field(FLNK, "$(CAM):Stats3:ArraySize1_RBV")
}

record(longin, "$(CAM):Stats3:ArraySize1_RBV")
{
    field(INP,  "$(CAM):Stats3:Dim1SA_RBV")
    field(FLNK, "$(CAM):Stats3:Dim2SA_RBV")
}

record(subArray, "$(CAM):Stats3:Dim2SA_RBV")
{
    field(INP,  "$(CAM):Stats3:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "2")
    field(FLNK, "$(CAM):Stats3:ArraySize2_RBV")
}

record(longin, "$(CAM):Stats3:ArraySize2_RBV")
{
    field(INP,  "$(CAM):Stats3:Dim2SA_RBV")
    field(FLNK, "$(CAM):Stats3:Dim3SA_RBV")
}

record(subArray, "$(CAM):Stats3:Dim3SA_RBV")
{
    field(INP,  "$(CAM):Stats3:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "3")
    field(FLNK, "$(CAM):Stats3:ArraySize3_RBV")
}

record(longin, "$(CAM):Stats3:ArraySize3_RBV")
{
    field(INP,  "$(CAM):Stats3:Dim3SA_RBV")
    field(FLNK, "$(CAM):Stats3:Dim4SA_RBV")
}

record(subArray, "$(CAM):Stats3:Dim4SA_RBV")
{
    field(INP,  "$(CAM):Stats3:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "4")
    field(FLNK, "$(CAM):Stats3:ArraySize4_RBV")
}

record(longin, "$(CAM):Stats3:ArraySize4_RBV")
{
    field(INP,  "$(CAM):Stats3:Dim4SA_RBV")
    field(FLNK, "$(CAM):Stats3:Dim5SA_RBV")
}

record(subArray, "$(CAM):Stats3:Dim5SA_RBV")
{
    field(INP,  "$(CAM):Stats3:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "5")
    field(FLNK, "$(CAM):Stats3:ArraySize5_RBV")
}

record(longin, "$(CAM):Stats3:ArraySize5_RBV")
{
    field(INP,  "$(CAM):Stats3:Dim5SA_RBV")
    field(FLNK, "$(CAM):Stats3:Dim6SA_RBV")
}

record(subArray, "$(CAM):Stats3:Dim6SA_RBV")
{
    field(INP,  "$(CAM):Stats3:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "6")
    field(FLNK, "$(CAM):Stats3:ArraySize6_RBV")
}

record(longin, "$(CAM):Stats3:ArraySize6_RBV")
{
    field(INP,  "$(CAM):Stats3:Dim6SA_RBV")
    field(FLNK, "$(CAM):Stats3:Dim7SA_RBV")
}

record(subArray, "$(CAM):Stats3:Dim7SA_RBV")
{
    field(INP,  "$(CAM):Stats3:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "7")
    field(FLNK, "$(CAM):Stats3:ArraySize7_RBV")
}

record(longin, "$(CAM):Stats3:ArraySize7_RBV")
{
    field(INP,  "$(CAM):Stats3:Dim7SA_RBV")
    field(FLNK, "$(CAM):Stats3:Dim8SA_RBV")
}

record(subArray, "$(CAM):Stats3:Dim8SA_RBV")
{
    field(INP,  "$(CAM):Stats3:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "8")
    field(FLNK, "$(CAM):Stats3:ArraySize8_RBV")
}

record(longin, "$(CAM):Stats3:ArraySize8_RBV")
{
    field(INP,  "$(CAM):Stats3:Dim8SA_RBV")
    field(FLNK, "$(CAM):Stats3:Dim9SA_RBV")
}

record(subArray, "$(CAM):Stats3:Dim9SA_RBV")
{
    field(INP,  "$(CAM):Stats3:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "9")
    field(FLNK, "$(CAM):Stats3:ArraySize9_RBV")
}

record(longin, "$(CAM):Stats3:ArraySize9_RBV")
{
    field(INP,  "$(CAM):Stats3:Dim9SA_RBV")
}


record(mbbi, "$(CAM):Stats3:BayerPattern_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))BAYER_PATTERN")
   field(ZRST, "RGGB")
   field(ZRVL, "0")
   field(ONST, "GBRG")
   field(ONVL, "1")
   field(TWST, "GRBG")
   field(TWVL, "2")
   field(THST, "BGGR")
   field(THVL, "3")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats3:ArraySizeX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_X")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats3:ArraySizeY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_Y")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats3:ArraySizeZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_Z")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats3:ArraySize_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records have information on the compression              # 
###################################################################
record(stringin, "$(CAM):Stats3:Codec_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))CODEC")
   field(VAL,  "")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats3:CompressedSize_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))COMPRESSED_SIZE")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the data type                            # 
###################################################################

record(mbbo, "$(CAM):Stats3:DataType")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))DATA_TYPE")
   field(ZRST, "Int8")
   field(ZRVL, "0")
   field(ONST, "UInt8")
   field(ONVL, "1")
   field(TWST, "Int16")
   field(TWVL, "2")
   field(THST, "UInt16")
   field(THVL, "3")
   field(FRST, "Int32")
   field(FRVL, "4")
   field(FVST, "UInt32")
   field(FVVL, "5")
   field(SXST, "Int64")
   field(SXVL, "6")
   field(SVST, "UInt64")
   field(SVVL, "7")
   field(EIST, "Float32")
   field(EIVL, "8")
   field(NIST, "Float64")
   field(NIVL, "9")
   field(VAL,  "0")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Stats3:DataType_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))DATA_TYPE")
   field(ZRST, "Int8")
   field(ZRVL, "0")
   field(ONST, "UInt8")
   field(ONVL, "1")
   field(TWST, "Int16")
   field(TWVL, "2")
   field(THST, "UInt16")
   field(THVL, "3")
   field(FRST, "Int32")
   field(FRVL, "4")
   field(FVST, "UInt32")
   field(FVVL, "5")
   field(SXST, "Int64")
   field(SXVL, "6")
   field(SVST, "UInt64")
   field(SVVL, "7")
   field(EIST, "Float32")
   field(EIVL, "8")
   field(NIST, "Float64")
   field(NIVL, "9")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats3:BitsPerPixel_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))BITS_PER_PIXEL")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the color mode                           #
#  These choices must agree with NDColorMode_t in NDArray.h       # 
###################################################################

record(mbbo, "$(CAM):Stats3:ColorMode")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))COLOR_MODE")
   field(ZRST, "Mono")
   field(ZRVL, "0")
   field(ONST, "Bayer")
   field(ONVL, "1")
   field(TWST, "RGB1")
   field(TWVL, "2")
   field(THST, "RGB2")
   field(THVL, "3")
   field(FRST, "RGB3")
   field(FRVL, "4")
   field(FVST, "YUV444")
   field(FVVL, "5")
   field(SXST, "YUV422")
   field(SXVL, "6")
   field(SVST, "YUV421")
   field(SVVL, "7")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Stats3:ColorMode_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))COLOR_MODE")
   field(ZRST, "Mono")
   field(ZRVL, "0")
   field(ONST, "Bayer")
   field(ONVL, "1")
   field(TWST, "RGB1")
   field(TWVL, "2")
   field(THST, "RGB2")
   field(THVL, "3")
   field(FRST, "RGB3")
   field(FRVL, "4")
   field(FVST, "YUV444")
   field(FVVL, "5")
   field(SXST, "YUV422")
   field(SXVL, "6")
   field(SVST, "YUV421")
   field(SVVL, "7")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records are the uniqueId and time stamps of the array     #
###################################################################
record(longin, "$(CAM):Stats3:UniqueId_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))UNIQUE_ID")
    field(SCAN, "I/O Intr")
}

record(ai, "$(CAM):Stats3:TimeStamp_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))TIME_STAMP")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats3:EpicsTSSec_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))EPICS_TS_SEC")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats3:EpicsTSNsec_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))EPICS_TS_NSEC")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records provide statistics on array callbacks and        #
#  array callback rates                                           # 
###################################################################
record(longout, "$(CAM):Stats3:ArrayCounter")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))ARRAY_COUNTER")
}

record(longin, "$(CAM):Stats3:ArrayCounter_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))ARRAY_COUNTER")
    field(SCAN, "I/O Intr")
    field(TSE,  "-2")
    field(LOW,  "0" )
    field(LSV,  "MINOR" )
    info(autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV TSE")
}

# Updated rate calculation to use a smoothing factor w/ guard against negative values
# 0 rate sets alarm state to MINOR
record(calc, "$(CAM):Stats3:ArrayRate_RBV")
{
    field(INPA, "$(CAM):Stats3:ArrayRate_RBV.LB NPP NMS")   # Previous counter (Last B value)
    field(INPB, "$(CAM):Stats3:ArrayCounter_RBV NPP NMS")   # Current counter value
    field(INPC, "1.0")                                # Delta time in seconds
    field(INPD, "$(CAM):Stats3:ArrayRate_RBV.VAL NPP NMS")  # Previous rate
    field(INPE, "0.0")                 # Smoothing factor
    field(CALC, "(D*E)/C+MAX(0,B-A)*(1-E)/C")
    field(PREC, "2" )
    field(EGU,  "Hz" )
    field(SCAN, "1 second")
    field(LOW,  "0")
    field(LSV,  "MINOR")
    field(ADEL, "0.1")
    info(autosaveFields, "ADEL DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV MDEL PREC C E SCAN EGU")
}

###################################################################
#  These records control NDArray callacks                         # 
###################################################################
record(bo, "$(CAM):Stats3:ArrayCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))ARRAY_CALLBACKS")
    field(ZNAM, "Disable")
    field(ZSV,  "MINOR")
    field(ONAM, "Enable")
    field(OSV,  "NO_ALARM")
    field(VAL, "1")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Stats3:ArrayCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))ARRAY_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ZSV,  "MINOR")
    field(ONAM, "Enabled")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains macro definitions for the attributes      # 
###################################################################

record(waveform, "$(CAM):Stats3:NDAttributesMacros")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_MACROS")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

###################################################################
#  This record is the name of a file defining attributes          # 
###################################################################

record(waveform, "$(CAM):Stats3:NDAttributesFile")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_FILE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

###################################################################
#  This record defines the status of reading attributes file      # 
###################################################################

record(mbbi, "$(CAM):Stats3:NDAttributesStatus")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_STATUS")
    field(ZRVL, "0")
    field(ZRST, "Attributes file OK")
    field(ZRSV, "NO_ALARM")
    field(ONVL, "1")
    field(ONST, "File not found")
    field(ONSV, "MINOR")
    field(TWVL, "2")
    field(TWST, "XML syntax error")
    field(TWSV, "MAJOR")
    field(THVL, "3")
    field(THST, "Macro substitution error")
    field(THSV, "MAJOR")
    field(SCAN, "I/O Intr")
}

###################################################################
#  Status of NDArrayPool - number of buffers, memory used etc.    # 
###################################################################

record(ai, "$(CAM):Stats3:PoolMaxMem")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))POOL_MAX_MEMORY")
   field(PREC, "1")
   field(EGU,  "MB")
   field(SCAN, "Passive")
   field(PINI, "YES")
}

record(ai, "$(CAM):Stats3:PoolUsedMem")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))POOL_USED_MEMORY")
   field(PREC, "1")
   field(EGU,  "MB")
   field(SCAN, "1 second")
   field(FLNK, "$(CAM):Stats3:PoolAllocBuffers")
   info(autosaveFields, "SCAN")
}

record(longin, "$(CAM):Stats3:PoolAllocBuffers")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))POOL_ALLOC_BUFFERS")
   field(FLNK, "$(CAM):Stats3:PoolFreeBuffers")
}

record(longin, "$(CAM):Stats3:PoolFreeBuffers")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))POOL_FREE_BUFFERS")
   field(FLNK, "$(CAM):Stats3:PoolUsedBuffers")
}

record(calc, "$(CAM):Stats3:PoolUsedBuffers")
{
    field(INPA, "$(CAM):Stats3:PoolAllocBuffers NPP MS")
    field(INPB, "$(CAM):Stats3:PoolFreeBuffers NPP MS")
    field(CALC, "A-B")
}

record(bo, "$(CAM):Stats3:EmptyFreeList")
{
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))POOL_EMPTY_FREELIST")
}

record(longin, "$(CAM):Stats3:NumQueuedArrays")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))NUM_QUEUED_ARRAYS")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the type of plugin                        #
###################################################################

record(stringin, "$(CAM):Stats3:PluginType_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))PLUGIN_TYPE")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the connection of the server to          #
#  an NDArray driver port and address                             #
###################################################################
# Array port name
record(stringout, "$(CAM):Stats3:NDArrayPort")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))NDARRAY_PORT")
    field(VAL,  "$(CAM_PORT)")
    info(autosaveFields, "DESC VAL")
}

record(stringin, "$(CAM):Stats3:NDArrayPort_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))NDARRAY_PORT")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Stats3:NDArrayAddress")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))NDARRAY_ADDR")
    field(VAL,  "$(NDARRAY_ADDR=2)")
    info(autosaveFields, "DESC VAL")
}

record(longin, "$(CAM):Stats3:NDArrayAddress_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))NDARRAY_ADDR")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control whether callbacks are enabled and        #
#  minimum time between callbacks                                 #
###################################################################
record(bo, "$(CAM):Stats3:EnableCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))ENABLE_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    field(VAL,  "0")
    info(autosaveFields, "DESC VAL")
}

record(bi, "$(CAM):Stats3:EnableCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))ENABLE_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    field(ZSV,  "MINOR")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats3:MinCallbackTime")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))MIN_CALLBACK_TIME")
    field(EGU,  "s")
    field(PREC, "3")
    field(VAL,  "0.0")
    field(DRVL, "0")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):Stats3:MinCallbackTime_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))MIN_CALLBACK_TIME")
    field(EGU,  "s")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats3:MaxArrayRate")
{
    field(DTYP, "Soft Channel")
    field(OUT,  "$(CAM):Stats3:MaxArrayRate_COUT PP")
    field(EGU,  "Hz")
    field(PREC, "3")
    field(VAL,  "0.0")
    info(autosaveFields, "VAL")
}

record(calcout, "$(CAM):Stats3:MaxArrayRate_COUT")
{
    field(INPA, "$(CAM):Stats3:MaxArrayRate")
    field(CALC, "A=0?0:1.0/A")
    field(OUT,  "$(CAM):Stats3:MinCallbackTime PP")
}

record(calc, "$(CAM):Stats3:MaxArrayRate_RBV")
{
    field(INPA, "$(CAM):Stats3:MinCallbackTime_RBV CP")
    field(CALC, "A=0?0:1.0/A")
    field(EGU,  "Hz")
    field(PREC, "3")
    field(SCAN, "Passive")
}

record(ao, "$(CAM):Stats3:MaxByteRate")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))MAX_BYTE_RATE")
    field(EGU,  "s")
    field(PREC, "3")
    field(VAL,  "0.0")
    field(DRVL, "0")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):Stats3:MaxByteRate_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))MAX_BYTE_RATE")
    field(EGU,  "s")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the last execution time of the plugin     #
###################################################################
record(ai, "$(CAM):Stats3:ExecutionTime_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))EXECUTION_TIME")
    field(EGU,  "ms")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record requests that the plugin execute again with the    #
#  same NDArray                                                   #
###################################################################
record(bo, "$(CAM):Stats3:ProcessPlugin")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))PROCESS_PLUGIN")
    field(VAL,  "1")
}

###################################################################
#  These records control whether callbacks block or not           #
###################################################################
record(bo, "$(CAM):Stats3:BlockingCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))BLOCKING_CALLBACKS")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(VAL,  "0")
    info(autosaveFields, "DESC ZSV OSV VAL")
}

record(bi, "$(CAM):Stats3:BlockingCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))BLOCKING_CALLBACKS")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(ZSV,  "NO_ALARM")
    field(OSV,  "MINOR")
    field(SCAN, "I/O Intr")
    info( autosaveFields, "DESC ZSV OSV" )
}


record(longout, "$(CAM):Stats3:DroppedArrays")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))DROPPED_ARRAYS")
    field(VAL,  "0")
    info( autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV EGU" )
}

record(longin, "$(CAM):Stats3:DroppedArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))DROPPED_ARRAYS")
    field(SCAN, "I/O Intr")
    field(HIGH, "1")
    field(HSV,  "MINOR")
    info( autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV EGU" )
}

record(longout, "$(CAM):Stats3:QueueSize")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))QUEUE_SIZE")
    field(PINI, "YES")
    info( autosaveFields, "DESC EGU" )
}

record(longin, "$(CAM):Stats3:QueueSize_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))QUEUE_SIZE")
    field(FLNK, "$(CAM):Stats3:QueueFreeLow")
    field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):Stats3:QueueFreeLow") {
    field(CALC, "A*0.25")
    field(INPA, "$(CAM):Stats3:QueueSize")
    field(OUT,  "$(CAM):Stats3:QueueFree.LOW")
    field(FLNK, "$(CAM):Stats3:QueueUseHIGH")
}

# Set a HIGH warning level for the input queue fill level to 75%
# of the full size of the queue
record(calcout, "$(CAM):Stats3:QueueUseHIGH") {
   field(CALC, "A*0.75")
   field(INPA, "$(CAM):Stats3:QueueSize")
   field(OUT,  "$(CAM):Stats3:QueueUse.HIGH")
   field(FLNK, "$(CAM):Stats3:QueueUseHIHI")
}

# Set a HIHI level for the input queue fill level to indicate an error
# (MAJOR alarm)  when it fills up to the full size of the queue (frames start dropping)
record(calcout, "$(CAM):Stats3:QueueUseHIHI") {
   field(CALC, "A*1.0")
   field(INPA, "$(CAM):Stats3:QueueSize")
   field(OUT,  "$(CAM):Stats3:QueueUse.HIHI")
}

record(longin, "$(CAM):Stats3:QueueFree")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))QUEUE_FREE")
    field(LLSV, "MAJOR")
    field(LSV,  "MINOR")
    field(LOLO, "0")
    field(HYST, "1")
    field(SCAN, "I/O Intr")
}

# Display the fill level on the plugins input queue
record(calc, "$(CAM):Stats3:QueueUse") {
    field(CALC, "A-B")
    field(INPA, "$(CAM):Stats3:QueueSize")
    field(INPB, "$(CAM):Stats3:QueueFree CP")
    field(SCAN, "Passive")
    field(HHSV, "MAJOR")
    field(HSV,  "MINOR")
    field(HYST, "1")
}

record(longout, "$(CAM):Stats3:NumThreads")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))NUM_THREADS")
    field(VAL,  "1")
    field(PINI, "YES")
    info(autosaveFields, "DESC VAL")
}

record(longin, "$(CAM):Stats3:NumThreads_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))NUM_THREADS")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats3:MaxThreads_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))MAX_THREADS")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control output array sorting                     #
###################################################################
record(mbbo, "$(CAM):Stats3:SortMode") {
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))SORT_MODE")
    field(ZRVL, "0")
    field(ZRST, "Unsorted")
    field(ONVL, "1")
    field(ONST, "Sorted")
}

record(mbbi, "$(CAM):Stats3:SortMode_RBV") {
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))SORT_MODE")
    field(ZRVL, "0")
    field(ZRST, "Unsorted")
    field(ONVL, "1")
    field(ONST, "Sorted")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats3:SortTime") {
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))SORT_TIME")
    field(PREC, "3")
    field(VAL, "0.1")
}

record(ai, "$(CAM):Stats3:SortTime_RBV") {
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))SORT_TIME")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Stats3:SortSize")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))SORT_SIZE")
    field(VAL,  "20")
    field(PINI, "YES")
}

record(longin, "$(CAM):Stats3:SortSize_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))SORT_SIZE")
    field(FLNK, "$(CAM):Stats3:SortFreeLow")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats3:SortFree") {
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))SORT_FREE")
    field(LLSV, "MAJOR")
    field(LSV,  "MINOR")
    field(LOLO, "0")
    field(HYST, "1")
    field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):Stats3:SortFreeLow") {
    field(CALC, "A*0.25")
    field(INPA, "$(CAM):Stats3:SortSize")
    field(OUT,  "$(CAM):Stats3:SortFree.LOW")
}

record(longout, "$(CAM):Stats3:DroppedOutputArrays")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))DROPPED_OUTPUT_ARRAYS")
    field(VAL,  "0")
}

record(longin, "$(CAM):Stats3:DroppedOutputArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))DROPPED_OUTPUT_ARRAYS")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Stats3:DisorderedArrays")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))DISORDERED_ARRAYS")
    field(PINI, "YES")
}

record(longin, "$(CAM):Stats3:DisorderedArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))DISORDERED_ARRAYS")
    field(SCAN, "I/O Intr")
}



###################################################################
#  The asynRecord is used for mainly for trace mask               # 
###################################################################
 
# Set ASYN_TRACEIO_HEX bit by default
record(asyn,"$(CAM):Stats3:AsynIO")
{
    field(PORT, "Stats3")
    field(TIB2,"1")
    info("ADType", "ADPlugin")
}


###################################################################
#  These records contain the basic statistics                     #
###################################################################
record(bo, "$(CAM):Stats3:ComputeStatistics")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))COMPUTE_STATISTICS")
   field(VAL,  "1")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Stats3:ComputeStatistics_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))COMPUTE_STATISTICS")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(ZSV,  "MINOR")
   field(OSV,  "NO_ALARM")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Stats3:BgdWidth")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))BGD_WIDTH")
   field(VAL,  "1")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Stats3:BgdWidth_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))BGD_WIDTH")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats3:MinValue")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))MIN_VALUE")
}

record(ai, "$(CAM):Stats3:MinValue_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))MIN_VALUE")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats3:MaxValue")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))MAX_VALUE")
}

record(ai, "$(CAM):Stats3:MaxValue_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))MAX_VALUE")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats3:MeanValue")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))MEAN_VALUE")
}

record(ai, "$(CAM):Stats3:MeanValue_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))MEAN_VALUE")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats3:SigmaValue")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))SIGMA_VALUE")
}

record(ai, "$(CAM):Stats3:Sigma_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))SIGMA_VALUE")
   field(PREC, "1")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats3:Total")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))TOTAL")
}

record(ai, "$(CAM):Stats3:Total_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))TOTAL")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats3:Net")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))NET")
}

record(ai, "$(CAM):Stats3:Net_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))NET")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats3:MinX")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))MIN_X")
}

record(ai, "$(CAM):Stats3:MinX_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))MIN_X")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats3:MinY")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))MIN_Y")
}

record(ai, "$(CAM):Stats3:MinY_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))MIN_Y")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats3:MaxX")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))MAX_X")
}

record(ai, "$(CAM):Stats3:MaxX_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))MAX_X")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats3:MaxY")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))MAX_Y")
}

record(ai, "$(CAM):Stats3:MaxY_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))MAX_Y")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

###################################################################
#  These records control whether centroid statistics are computed #
###################################################################
record(bo, "$(CAM):Stats3:ComputeCentroid")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))COMPUTE_CENTROID")
   field(VAL,  "0")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Stats3:ComputeCentroid_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))COMPUTE_CENTROID")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(ZSV,  "MINOR")
   field(OSV,  "NO_ALARM")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records contain the centroid statistics                  #
###################################################################
record(ao, "$(CAM):Stats3:CentroidThreshold")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))CENTROID_THRESHOLD")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):Stats3:CentroidThreshold_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))CENTROID_THRESHOLD")
    field(VAL,  "0")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats3:CentroidTotal")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))CENTROID_TOTAL")
}

record(ai, "$(CAM):Stats3:CentroidTotal_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))CENTROID_TOTAL")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats3:CentroidX")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))CENTROIDX_VALUE")
}

record(ai, "$(CAM):Stats3:CentroidX_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))CENTROIDX_VALUE")
   field(PREC, "1")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats3:CentroidY")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))CENTROIDY_VALUE")
}

record(ai, "$(CAM):Stats3:CentroidY_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))CENTROIDY_VALUE")
   field(PREC, "1")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats3:SigmaX")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))SIGMAX_VALUE")
}

record(ai, "$(CAM):Stats3:SigmaX_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))SIGMAX_VALUE")
   field(PREC, "1")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats3:SigmaY")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))SIGMAY_VALUE")
}

record(ai, "$(CAM):Stats3:SigmaY_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))SIGMAY_VALUE")
   field(PREC, "1")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats3:SigmaXY")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))SIGMAXY_VALUE")
}

record(ai, "$(CAM):Stats3:SigmaXY_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))SIGMAXY_VALUE")
   field(PREC, "3")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats3:SkewX")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))SKEWX_VALUE")
}

record(ai, "$(CAM):Stats3:SkewX_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))SKEWX_VALUE")
   field(PREC, "3")
   field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats3:SkewY")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))SKEWY_VALUE")
}

record(ai, "$(CAM):Stats3:SkewY_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))SKEWY_VALUE")
   field(PREC, "3")
   field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats3:KurtosisX")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))KURTOSISX_VALUE")
}

record(ai, "$(CAM):Stats3:KurtosisX_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))KURTOSISX_VALUE")
   field(PREC, "3")
   field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats3:KurtosisY")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))KURTOSISY_VALUE")
}

record(ai, "$(CAM):Stats3:KurtosisY_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))KURTOSISY_VALUE")
   field(PREC, "3")
   field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats3:Eccentricity")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))ECCENTRICITY_VALUE")
}

record(ai, "$(CAM):Stats3:Eccentricity_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))ECCENTRICITY_VALUE")
   field(PREC, "3")
   field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats3:Orientation")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))ORIENTATION_VALUE")
}

record(ai, "$(CAM):Stats3:Orientation_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))ORIENTATION_VALUE")
   field(PREC, "3")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control time series                              #
###################################################################
record(waveform, "$(CAM):Stats3:TSMinValue")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats3_TS,0,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats3:TSMinX")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats3_TS,1,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats3:TSMinY")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats3_TS,2,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats3:TSMaxValue")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats3_TS,3,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats3:TSMaxX")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats3_TS,4,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats3:TSMaxY")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats3_TS,5,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats3:TSMeanValue")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats3_TS,6,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats3:TSSigma")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats3_TS,7,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats3:TSTotal")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats3_TS,8,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats3:TSNet")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats3_TS,9,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats3:TSCentroidTotal")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats3_TS,10,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats3:TSCentroidX")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats3_TS,11,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats3:TSCentroidY")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats3_TS,12,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats3:TSSigmaX")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats3_TS,13,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats3:TSSigmaY")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats3_TS,14,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats3:TSSigmaXY")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats3_TS,15,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats3:TSSkewX")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats3_TS,16,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats3:TSSkewY")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats3_TS,17,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats3:TSKurtosisX")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats3_TS,18,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats3:TSKurtosisY")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats3_TS,19,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats3:TSEccentricity")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats3_TS,20,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats3:TSOrientation")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats3_TS,21,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats3:TSTimestamp")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats3_TS,22,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control profiles                                 #
###################################################################
record(bo, "$(CAM):Stats3:ComputeProfiles")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))COMPUTE_PROFILES")
   field(VAL,  "0")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Stats3:ComputeProfiles_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))COMPUTE_PROFILES")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(ZSV,  "MINOR")
   field(OSV,  "NO_ALARM")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats3:ProfileSizeX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))PROFILE_SIZE_X")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats3:ProfileSizeY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))PROFILE_SIZE_Y")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Stats3:CursorX")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))CURSOR_X")
   field(VAL,  "256")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Stats3:CursorX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))CURSOR_X")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Stats3:CursorY")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))CURSOR_Y")
   field(VAL,  "256")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Stats3:CursorY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))CURSOR_Y")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats3:ProfileAverageX_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))PROFILE_AVERAGE_X")
   field(FTVL, "DOUBLE")
   field(NELM, "$(XSIZE)")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats3:ProfileAverageY_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))PROFILE_AVERAGE_Y")
   field(FTVL, "DOUBLE")
   field(NELM, "$(YSIZE)")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats3:ProfileThresholdX_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))PROFILE_THRESHOLD_X")
   field(FTVL, "DOUBLE")
   field(NELM, "$(XSIZE)")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats3:ProfileThresholdY_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))PROFILE_THRESHOLD_Y")
   field(FTVL, "DOUBLE")
   field(NELM, "$(YSIZE)")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats3:ProfileCentroidX_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))PROFILE_CENTROID_X")
   field(FTVL, "DOUBLE")
   field(NELM, "$(XSIZE)")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(waveform, "$(CAM):Stats3:ProfileCentroidY_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))PROFILE_CENTROID_Y")
   field(FTVL, "DOUBLE")
   field(NELM, "$(YSIZE)")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(waveform, "$(CAM):Stats3:ProfileCursorX_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))PROFILE_CURSOR_X")
   field(FTVL, "DOUBLE")
   field(NELM, "$(XSIZE)")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(waveform, "$(CAM):Stats3:ProfileCursorY_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))PROFILE_CURSOR_Y")
   field(FTVL, "DOUBLE")
   field(NELM, "$(YSIZE)")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}


###################################################################
#  These are used to define the histogram                         #
###################################################################
record(bo, "$(CAM):Stats3:ComputeHistogram")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))COMPUTE_HISTOGRAM")
   field(VAL,  "0")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Stats3:ComputeHistogram_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))COMPUTE_HISTOGRAM")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(ZSV,  "MINOR")
   field(OSV,  "NO_ALARM")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Stats3:HistSize")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))HIST_SIZE")
   field(VAL,  "256")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Stats3:HistSize_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))HIST_SIZE")
   field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats3:HistMin")
{
   field(PINI, "YES")
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))HIST_MIN")
   field(VAL,  "0")
   info(autosaveFields, "VAL")
}

record(ai, "$(CAM):Stats3:HistMin_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))HIST_MIN")
   field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats3:HistMax")
{
   field(PINI, "YES")
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))HIST_MAX")
   field(VAL,  "255")
   info(autosaveFields, "VAL")
}

record(ai, "$(CAM):Stats3:HistMax_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))HIST_MAX")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Stats3:HistBelow")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))HIST_BELOW")
}

record(longin, "$(CAM):Stats3:HistBelow_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))HIST_BELOW")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Stats3:HistAbove")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))HIST_ABOVE")
}

record(longin, "$(CAM):Stats3:HistAbove_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))HIST_ABOVE")
   field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats3:HistEntropy")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))HIST_ENTROPY")
}

record(ai, "$(CAM):Stats3:HistEntropy_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))HIST_ENTROPY")
   field(PREC, "3")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats3:Histogram_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))HIST_ARRAY")
   field(FTVL, "DOUBLE")
   field(NELM, "256")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats3:HistogramX_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats3,$(ADDR=0),$(TIMEOUT=1))HIST_X_ARRAY")
   field(FTVL, "DOUBLE")
   field(NELM, "256")
   field(SCAN, "I/O Intr")
}


###################################################################
#  These records set the HOPR and LOPR values for the cursor      #
#  and size to the maximum for the input array                    #
###################################################################

record(longin, "$(CAM):Stats3:MaxSizeX")
{
    field(INP,  "$(CAM):Stats3:ProfileSizeX_RBV CP")
    field(FLNK, "$(CAM):Stats3:SetXHOPR.PROC PP")
}

record(dfanout, "$(CAM):Stats3:SetXHOPR")
{
    field(DOL,  "$(CAM):Stats3:MaxSizeX NPP")
    field(OMSL, "closed_loop")
    field(OUTA, "$(CAM):Stats3:CursorX.HOPR NPP")
}

record(longin, "$(CAM):Stats3:MaxSizeY")
{
    field(INP,  "$(CAM):Stats3:ProfileSizeY_RBV CP")
    field(FLNK, "$(CAM):Stats3:SetYHOPR.PROC PP")
}

record(dfanout, "$(CAM):Stats3:SetYHOPR")
{
    field(DOL,  "$(CAM):Stats3:MaxSizeY NPP")
    field(OMSL, "closed_loop")
    field(OUTA, "$(CAM):Stats3:CursorY.HOPR NPP")
}

###################################################################
#  These records reset the statistics                             #
###################################################################
record(sseq, "$(CAM):Stats3:Reset")
{
   field(LNK1, "$(CAM):Stats3:MinValue PP MS")    
   field(LNK2, "$(CAM):Stats3:MaxValue PP MS")    
   field(LNK3, "$(CAM):Stats3:MeanValue PP MS")    
   field(LNK4, "$(CAM):Stats3:SigmaValue PP MS")    
   field(LNK5, "$(CAM):Stats3:Total PP MS")    
   field(LNK6, "$(CAM):Stats3:Net PP MS")    
   field(LNK7, "$(CAM):Stats3:MinX PP MS")    
   field(LNK8, "$(CAM):Stats3:MinY PP MS")    
   field(LNK9, "$(CAM):Stats3:MaxX PP MS")
   field(LNKA, "$(CAM):Stats3:MaxY PP MS")    
   field(FLNK, "$(CAM):Stats3:Reset1")   
}

record(sseq, "$(CAM):Stats3:Reset1")
{
   field(LNK1, "$(CAM):Stats3:CentroidX PP MS")    
   field(LNK2, "$(CAM):Stats3:CentroidY PP MS")    
   field(LNK3, "$(CAM):Stats3:SigmaX PP MS")    
   field(LNK4, "$(CAM):Stats3:SigmaY PP MS")    
   field(LNK5, "$(CAM):Stats3:SigmaXY PP MS")    
   field(LNK6, "$(CAM):Stats3:CentroidTotal PP MS")    
   field(LNK7, "$(CAM):Stats3:SkewX PP MS")    
   field(LNK8, "$(CAM):Stats3:SkewY PP MS")    
   field(LNK9, "$(CAM):Stats3:KurtosisX PP MS")    
   field(LNKA, "$(CAM):Stats3:KurtosisY PP MS")    
   field(FLNK, "$(CAM):Stats3:Reset2")   
}

record(sseq, "$(CAM):Stats3:Reset2")
{
   field(LNK1, "$(CAM):Stats3:Eccentricity PP MS")    
   field(LNK2, "$(CAM):Stats3:Orientation PP MS")    
   field(LNK3, "$(CAM):Stats3:HistBelow PP MS")    
   field(LNK4, "$(CAM):Stats3:HistAbove PP MS")    
   field(LNK5, "$(CAM):Stats3:HistEntropy PP MS")    
}

#=================================================================#
# Template file: NDStats.template

#=================================================================#
# Template file: NDPluginBase.template
# Database for NDPluginBase, i.e. records common to all plugins
# Mark Rivers
# April 25, 2008

#=================================================================#
# Template file: NDArrayBase.template
# Database for area detector control using asyn driver and standard asyn device support
# Mark Rivers
# March 9, 2008

###################################################################
#  This record contains the version of ADCore                     #
###################################################################

record(stringin, "$(CAM):Stats4:ADCoreVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))ADCORE_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the version of the driver or plugin       #
###################################################################

record(stringin, "$(CAM):Stats4:DriverVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))DRIVER_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the asyn port name of this detector       #
###################################################################

record(stringin, "$(CAM):Stats4:PortName_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))PORT_NAME_SELF")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records contain basic information about the detector     # 
###################################################################

record(stringin, "$(CAM):Stats4:Manufacturer_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))MANUFACTURER")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):Stats4:Model_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))MODEL")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):Stats4:SerialNumber_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))SERIAL_NUMBER")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):Stats4:SDKVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))SDK_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):Stats4:FirmwareVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))FIRMWARE_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control acquisition start and stop               #
###################################################################

record(bo, "$(CAM):Stats4:Acquire") {
   field(DTYP, "asynInt32")
   field(OUT, "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))ACQUIRE")
   field(ZNAM, "Done")
   field(ONAM, "Acquire")
   field(VAL,  "0")
   field(FLNK, "$(CAM):Stats4:SetAcquireBusy")
   info(asyn:READBACK, "1")
}

record(bi, "$(CAM):Stats4:Acquire_RBV") {
   field(DTYP, "asynInt32")
   field(INP, "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))ACQUIRE")
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):Stats4:SetAcquireBusy")
{
    field(INPA, "$(CAM):Stats4:Acquire NPP")
    field(CALC, "A")
    field(OOPT, "Transition To Non-zero")
    field(OUT,  "$(CAM):Stats4:AcquireBusy PP")
}

record(busy, "$(CAM):Stats4:AcquireBusy") {
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(VAL,  "0")
}

record(bi, "$(CAM):Stats4:AcquireBusyCB") {
   field(DTYP, "asynInt32")
   field(INP, "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))ACQUIRE_BUSY")
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):Stats4:ClearAcquireBusy") {
    field(INPA, "$(CAM):Stats4:AcquireBusyCB CP")
    field(CALC, "A")
    field(OOPT, "Transition To Zero")
    field(OUT,  "$(CAM):Stats4:AcquireBusy PP")
}

record(bo, "$(CAM):Stats4:WaitForPlugins") {
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT, "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))WAIT_FOR_PLUGINS")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(VAL,  "0")
}

###################################################################
#  These records are the array size and data type                 #
###################################################################
# The number of dimensions
record(longout, "$(CAM):Stats4:NDimensions")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))ARRAY_NDIMENSIONS")
}

record(longin, "$(CAM):Stats4:NDimensions_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))ARRAY_NDIMENSIONS")
    field(SCAN, "I/O Intr")
}

# The array dimensions waveform records
record(waveform, "$(CAM):Stats4:Dimensions")
{
    field(DTYP, "asynInt32ArrayOut")
    field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))ARRAY_DIMENSIONS")
    field(FTVL, "LONG")
    field(NELM, "10")
    field(FLNK, "$(CAM):Stats4:Dim0SA")
}

record(subArray, "$(CAM):Stats4:Dim0SA")
{
    field(INP,  "$(CAM):Stats4:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "0")
    field(FLNK, "$(CAM):Stats4:ArraySize0")
}

record(longin, "$(CAM):Stats4:ArraySize0")
{
    field(INP,  "$(CAM):Stats4:Dim0SA")
    field(FLNK, "$(CAM):Stats4:Dim1SA")
}

record(subArray, "$(CAM):Stats4:Dim1SA")
{
    field(INP,  "$(CAM):Stats4:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "1")
    field(FLNK, "$(CAM):Stats4:ArraySize1")
}

record(longin, "$(CAM):Stats4:ArraySize1")
{
    field(INP,  "$(CAM):Stats4:Dim1SA")
    field(FLNK, "$(CAM):Stats4:Dim2SA")
}

record(subArray, "$(CAM):Stats4:Dim2SA")
{
    field(INP,  "$(CAM):Stats4:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "2")
    field(FLNK, "$(CAM):Stats4:ArraySize2")
}

record(longin, "$(CAM):Stats4:ArraySize2")
{
    field(INP,  "$(CAM):Stats4:Dim2SA")
    field(FLNK, "$(CAM):Stats4:Dim3SA")
}

record(subArray, "$(CAM):Stats4:Dim3SA")
{
    field(INP,  "$(CAM):Stats4:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "3")
    field(FLNK, "$(CAM):Stats4:ArraySize3")
}

record(longin, "$(CAM):Stats4:ArraySize3")
{
    field(INP,  "$(CAM):Stats4:Dim3SA")
    field(FLNK, "$(CAM):Stats4:Dim4SA")
}

record(subArray, "$(CAM):Stats4:Dim4SA")
{
    field(INP,  "$(CAM):Stats4:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "4")
    field(FLNK, "$(CAM):Stats4:ArraySize4")
}

record(longin, "$(CAM):Stats4:ArraySize4")
{
    field(INP,  "$(CAM):Stats4:Dim4SA")
    field(FLNK, "$(CAM):Stats4:Dim5SA")
}

record(subArray, "$(CAM):Stats4:Dim5SA")
{
    field(INP,  "$(CAM):Stats4:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "5")
    field(FLNK, "$(CAM):Stats4:ArraySize5")
}

record(longin, "$(CAM):Stats4:ArraySize5")
{
    field(INP,  "$(CAM):Stats4:Dim5SA")
    field(FLNK, "$(CAM):Stats4:Dim6SA")
}

record(subArray, "$(CAM):Stats4:Dim6SA")
{
    field(INP,  "$(CAM):Stats4:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "6")
    field(FLNK, "$(CAM):Stats4:ArraySize6")
}

record(longin, "$(CAM):Stats4:ArraySize6")
{
    field(INP,  "$(CAM):Stats4:Dim6SA")
    field(FLNK, "$(CAM):Stats4:Dim7SA")
}

record(subArray, "$(CAM):Stats4:Dim7SA")
{
    field(INP,  "$(CAM):Stats4:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "7")
    field(FLNK, "$(CAM):Stats4:ArraySize7")
}

record(longin, "$(CAM):Stats4:ArraySize7")
{
    field(INP,  "$(CAM):Stats4:Dim7SA")
    field(FLNK, "$(CAM):Stats4:Dim8SA")
}

record(subArray, "$(CAM):Stats4:Dim8SA")
{
    field(INP,  "$(CAM):Stats4:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "8")
    field(FLNK, "$(CAM):Stats4:ArraySize8")
}

record(longin, "$(CAM):Stats4:ArraySize8")
{
    field(INP,  "$(CAM):Stats4:Dim8SA")
    field(FLNK, "$(CAM):Stats4:Dim9SA")
}

record(subArray, "$(CAM):Stats4:Dim9SA")
{
    field(INP,  "$(CAM):Stats4:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "9")
    field(FLNK, "$(CAM):Stats4:ArraySize9")
}

record(longin, "$(CAM):Stats4:ArraySize9")
{
    field(INP,  "$(CAM):Stats4:Dim9SA")
}


record(waveform, "$(CAM):Stats4:Dimensions_RBV")
{
    field(DTYP, "asynInt32ArrayIn")
    field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))ARRAY_DIMENSIONS")
    field(FTVL, "LONG")
    field(NELM, "10")
    field(FLNK, "$(CAM):Stats4:Dim0SA_RBV")
    field(SCAN, "I/O Intr")
}

record(subArray, "$(CAM):Stats4:Dim0SA_RBV")
{
    field(INP,  "$(CAM):Stats4:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "0")
    field(FLNK, "$(CAM):Stats4:ArraySize0_RBV")
}

record(longin, "$(CAM):Stats4:ArraySize0_RBV")
{
    field(INP,  "$(CAM):Stats4:Dim0SA_RBV")
    field(FLNK, "$(CAM):Stats4:Dim1SA_RBV")
}

record(subArray, "$(CAM):Stats4:Dim1SA_RBV")
{
    field(INP,  "$(CAM):Stats4:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "1")
    field(FLNK, "$(CAM):Stats4:ArraySize1_RBV")
}

record(longin, "$(CAM):Stats4:ArraySize1_RBV")
{
    field(INP,  "$(CAM):Stats4:Dim1SA_RBV")
    field(FLNK, "$(CAM):Stats4:Dim2SA_RBV")
}

record(subArray, "$(CAM):Stats4:Dim2SA_RBV")
{
    field(INP,  "$(CAM):Stats4:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "2")
    field(FLNK, "$(CAM):Stats4:ArraySize2_RBV")
}

record(longin, "$(CAM):Stats4:ArraySize2_RBV")
{
    field(INP,  "$(CAM):Stats4:Dim2SA_RBV")
    field(FLNK, "$(CAM):Stats4:Dim3SA_RBV")
}

record(subArray, "$(CAM):Stats4:Dim3SA_RBV")
{
    field(INP,  "$(CAM):Stats4:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "3")
    field(FLNK, "$(CAM):Stats4:ArraySize3_RBV")
}

record(longin, "$(CAM):Stats4:ArraySize3_RBV")
{
    field(INP,  "$(CAM):Stats4:Dim3SA_RBV")
    field(FLNK, "$(CAM):Stats4:Dim4SA_RBV")
}

record(subArray, "$(CAM):Stats4:Dim4SA_RBV")
{
    field(INP,  "$(CAM):Stats4:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "4")
    field(FLNK, "$(CAM):Stats4:ArraySize4_RBV")
}

record(longin, "$(CAM):Stats4:ArraySize4_RBV")
{
    field(INP,  "$(CAM):Stats4:Dim4SA_RBV")
    field(FLNK, "$(CAM):Stats4:Dim5SA_RBV")
}

record(subArray, "$(CAM):Stats4:Dim5SA_RBV")
{
    field(INP,  "$(CAM):Stats4:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "5")
    field(FLNK, "$(CAM):Stats4:ArraySize5_RBV")
}

record(longin, "$(CAM):Stats4:ArraySize5_RBV")
{
    field(INP,  "$(CAM):Stats4:Dim5SA_RBV")
    field(FLNK, "$(CAM):Stats4:Dim6SA_RBV")
}

record(subArray, "$(CAM):Stats4:Dim6SA_RBV")
{
    field(INP,  "$(CAM):Stats4:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "6")
    field(FLNK, "$(CAM):Stats4:ArraySize6_RBV")
}

record(longin, "$(CAM):Stats4:ArraySize6_RBV")
{
    field(INP,  "$(CAM):Stats4:Dim6SA_RBV")
    field(FLNK, "$(CAM):Stats4:Dim7SA_RBV")
}

record(subArray, "$(CAM):Stats4:Dim7SA_RBV")
{
    field(INP,  "$(CAM):Stats4:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "7")
    field(FLNK, "$(CAM):Stats4:ArraySize7_RBV")
}

record(longin, "$(CAM):Stats4:ArraySize7_RBV")
{
    field(INP,  "$(CAM):Stats4:Dim7SA_RBV")
    field(FLNK, "$(CAM):Stats4:Dim8SA_RBV")
}

record(subArray, "$(CAM):Stats4:Dim8SA_RBV")
{
    field(INP,  "$(CAM):Stats4:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "8")
    field(FLNK, "$(CAM):Stats4:ArraySize8_RBV")
}

record(longin, "$(CAM):Stats4:ArraySize8_RBV")
{
    field(INP,  "$(CAM):Stats4:Dim8SA_RBV")
    field(FLNK, "$(CAM):Stats4:Dim9SA_RBV")
}

record(subArray, "$(CAM):Stats4:Dim9SA_RBV")
{
    field(INP,  "$(CAM):Stats4:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "9")
    field(FLNK, "$(CAM):Stats4:ArraySize9_RBV")
}

record(longin, "$(CAM):Stats4:ArraySize9_RBV")
{
    field(INP,  "$(CAM):Stats4:Dim9SA_RBV")
}


record(mbbi, "$(CAM):Stats4:BayerPattern_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))BAYER_PATTERN")
   field(ZRST, "RGGB")
   field(ZRVL, "0")
   field(ONST, "GBRG")
   field(ONVL, "1")
   field(TWST, "GRBG")
   field(TWVL, "2")
   field(THST, "BGGR")
   field(THVL, "3")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats4:ArraySizeX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_X")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats4:ArraySizeY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_Y")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats4:ArraySizeZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_Z")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats4:ArraySize_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records have information on the compression              # 
###################################################################
record(stringin, "$(CAM):Stats4:Codec_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))CODEC")
   field(VAL,  "")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats4:CompressedSize_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))COMPRESSED_SIZE")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the data type                            # 
###################################################################

record(mbbo, "$(CAM):Stats4:DataType")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))DATA_TYPE")
   field(ZRST, "Int8")
   field(ZRVL, "0")
   field(ONST, "UInt8")
   field(ONVL, "1")
   field(TWST, "Int16")
   field(TWVL, "2")
   field(THST, "UInt16")
   field(THVL, "3")
   field(FRST, "Int32")
   field(FRVL, "4")
   field(FVST, "UInt32")
   field(FVVL, "5")
   field(SXST, "Int64")
   field(SXVL, "6")
   field(SVST, "UInt64")
   field(SVVL, "7")
   field(EIST, "Float32")
   field(EIVL, "8")
   field(NIST, "Float64")
   field(NIVL, "9")
   field(VAL,  "0")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Stats4:DataType_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))DATA_TYPE")
   field(ZRST, "Int8")
   field(ZRVL, "0")
   field(ONST, "UInt8")
   field(ONVL, "1")
   field(TWST, "Int16")
   field(TWVL, "2")
   field(THST, "UInt16")
   field(THVL, "3")
   field(FRST, "Int32")
   field(FRVL, "4")
   field(FVST, "UInt32")
   field(FVVL, "5")
   field(SXST, "Int64")
   field(SXVL, "6")
   field(SVST, "UInt64")
   field(SVVL, "7")
   field(EIST, "Float32")
   field(EIVL, "8")
   field(NIST, "Float64")
   field(NIVL, "9")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats4:BitsPerPixel_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))BITS_PER_PIXEL")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the color mode                           #
#  These choices must agree with NDColorMode_t in NDArray.h       # 
###################################################################

record(mbbo, "$(CAM):Stats4:ColorMode")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))COLOR_MODE")
   field(ZRST, "Mono")
   field(ZRVL, "0")
   field(ONST, "Bayer")
   field(ONVL, "1")
   field(TWST, "RGB1")
   field(TWVL, "2")
   field(THST, "RGB2")
   field(THVL, "3")
   field(FRST, "RGB3")
   field(FRVL, "4")
   field(FVST, "YUV444")
   field(FVVL, "5")
   field(SXST, "YUV422")
   field(SXVL, "6")
   field(SVST, "YUV421")
   field(SVVL, "7")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Stats4:ColorMode_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))COLOR_MODE")
   field(ZRST, "Mono")
   field(ZRVL, "0")
   field(ONST, "Bayer")
   field(ONVL, "1")
   field(TWST, "RGB1")
   field(TWVL, "2")
   field(THST, "RGB2")
   field(THVL, "3")
   field(FRST, "RGB3")
   field(FRVL, "4")
   field(FVST, "YUV444")
   field(FVVL, "5")
   field(SXST, "YUV422")
   field(SXVL, "6")
   field(SVST, "YUV421")
   field(SVVL, "7")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records are the uniqueId and time stamps of the array     #
###################################################################
record(longin, "$(CAM):Stats4:UniqueId_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))UNIQUE_ID")
    field(SCAN, "I/O Intr")
}

record(ai, "$(CAM):Stats4:TimeStamp_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))TIME_STAMP")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats4:EpicsTSSec_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))EPICS_TS_SEC")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats4:EpicsTSNsec_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))EPICS_TS_NSEC")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records provide statistics on array callbacks and        #
#  array callback rates                                           # 
###################################################################
record(longout, "$(CAM):Stats4:ArrayCounter")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))ARRAY_COUNTER")
}

record(longin, "$(CAM):Stats4:ArrayCounter_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))ARRAY_COUNTER")
    field(SCAN, "I/O Intr")
    field(TSE,  "-2")
    field(LOW,  "0" )
    field(LSV,  "MINOR" )
    info(autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV TSE")
}

# Updated rate calculation to use a smoothing factor w/ guard against negative values
# 0 rate sets alarm state to MINOR
record(calc, "$(CAM):Stats4:ArrayRate_RBV")
{
    field(INPA, "$(CAM):Stats4:ArrayRate_RBV.LB NPP NMS")   # Previous counter (Last B value)
    field(INPB, "$(CAM):Stats4:ArrayCounter_RBV NPP NMS")   # Current counter value
    field(INPC, "1.0")                                # Delta time in seconds
    field(INPD, "$(CAM):Stats4:ArrayRate_RBV.VAL NPP NMS")  # Previous rate
    field(INPE, "0.0")                 # Smoothing factor
    field(CALC, "(D*E)/C+MAX(0,B-A)*(1-E)/C")
    field(PREC, "2" )
    field(EGU,  "Hz" )
    field(SCAN, "1 second")
    field(LOW,  "0")
    field(LSV,  "MINOR")
    field(ADEL, "0.1")
    info(autosaveFields, "ADEL DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV MDEL PREC C E SCAN EGU")
}

###################################################################
#  These records control NDArray callacks                         # 
###################################################################
record(bo, "$(CAM):Stats4:ArrayCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))ARRAY_CALLBACKS")
    field(ZNAM, "Disable")
    field(ZSV,  "MINOR")
    field(ONAM, "Enable")
    field(OSV,  "NO_ALARM")
    field(VAL, "1")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Stats4:ArrayCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))ARRAY_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ZSV,  "MINOR")
    field(ONAM, "Enabled")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains macro definitions for the attributes      # 
###################################################################

record(waveform, "$(CAM):Stats4:NDAttributesMacros")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_MACROS")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

###################################################################
#  This record is the name of a file defining attributes          # 
###################################################################

record(waveform, "$(CAM):Stats4:NDAttributesFile")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_FILE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

###################################################################
#  This record defines the status of reading attributes file      # 
###################################################################

record(mbbi, "$(CAM):Stats4:NDAttributesStatus")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_STATUS")
    field(ZRVL, "0")
    field(ZRST, "Attributes file OK")
    field(ZRSV, "NO_ALARM")
    field(ONVL, "1")
    field(ONST, "File not found")
    field(ONSV, "MINOR")
    field(TWVL, "2")
    field(TWST, "XML syntax error")
    field(TWSV, "MAJOR")
    field(THVL, "3")
    field(THST, "Macro substitution error")
    field(THSV, "MAJOR")
    field(SCAN, "I/O Intr")
}

###################################################################
#  Status of NDArrayPool - number of buffers, memory used etc.    # 
###################################################################

record(ai, "$(CAM):Stats4:PoolMaxMem")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))POOL_MAX_MEMORY")
   field(PREC, "1")
   field(EGU,  "MB")
   field(SCAN, "Passive")
   field(PINI, "YES")
}

record(ai, "$(CAM):Stats4:PoolUsedMem")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))POOL_USED_MEMORY")
   field(PREC, "1")
   field(EGU,  "MB")
   field(SCAN, "1 second")
   field(FLNK, "$(CAM):Stats4:PoolAllocBuffers")
   info(autosaveFields, "SCAN")
}

record(longin, "$(CAM):Stats4:PoolAllocBuffers")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))POOL_ALLOC_BUFFERS")
   field(FLNK, "$(CAM):Stats4:PoolFreeBuffers")
}

record(longin, "$(CAM):Stats4:PoolFreeBuffers")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))POOL_FREE_BUFFERS")
   field(FLNK, "$(CAM):Stats4:PoolUsedBuffers")
}

record(calc, "$(CAM):Stats4:PoolUsedBuffers")
{
    field(INPA, "$(CAM):Stats4:PoolAllocBuffers NPP MS")
    field(INPB, "$(CAM):Stats4:PoolFreeBuffers NPP MS")
    field(CALC, "A-B")
}

record(bo, "$(CAM):Stats4:EmptyFreeList")
{
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))POOL_EMPTY_FREELIST")
}

record(longin, "$(CAM):Stats4:NumQueuedArrays")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))NUM_QUEUED_ARRAYS")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the type of plugin                        #
###################################################################

record(stringin, "$(CAM):Stats4:PluginType_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))PLUGIN_TYPE")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the connection of the server to          #
#  an NDArray driver port and address                             #
###################################################################
# Array port name
record(stringout, "$(CAM):Stats4:NDArrayPort")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))NDARRAY_PORT")
    field(VAL,  "$(CAM_PORT)")
    info(autosaveFields, "DESC VAL")
}

record(stringin, "$(CAM):Stats4:NDArrayPort_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))NDARRAY_PORT")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Stats4:NDArrayAddress")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))NDARRAY_ADDR")
    field(VAL,  "$(NDARRAY_ADDR=3)")
    info(autosaveFields, "DESC VAL")
}

record(longin, "$(CAM):Stats4:NDArrayAddress_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))NDARRAY_ADDR")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control whether callbacks are enabled and        #
#  minimum time between callbacks                                 #
###################################################################
record(bo, "$(CAM):Stats4:EnableCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))ENABLE_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    field(VAL,  "0")
    info(autosaveFields, "DESC VAL")
}

record(bi, "$(CAM):Stats4:EnableCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))ENABLE_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    field(ZSV,  "MINOR")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats4:MinCallbackTime")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))MIN_CALLBACK_TIME")
    field(EGU,  "s")
    field(PREC, "3")
    field(VAL,  "0.0")
    field(DRVL, "0")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):Stats4:MinCallbackTime_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))MIN_CALLBACK_TIME")
    field(EGU,  "s")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats4:MaxArrayRate")
{
    field(DTYP, "Soft Channel")
    field(OUT,  "$(CAM):Stats4:MaxArrayRate_COUT PP")
    field(EGU,  "Hz")
    field(PREC, "3")
    field(VAL,  "0.0")
    info(autosaveFields, "VAL")
}

record(calcout, "$(CAM):Stats4:MaxArrayRate_COUT")
{
    field(INPA, "$(CAM):Stats4:MaxArrayRate")
    field(CALC, "A=0?0:1.0/A")
    field(OUT,  "$(CAM):Stats4:MinCallbackTime PP")
}

record(calc, "$(CAM):Stats4:MaxArrayRate_RBV")
{
    field(INPA, "$(CAM):Stats4:MinCallbackTime_RBV CP")
    field(CALC, "A=0?0:1.0/A")
    field(EGU,  "Hz")
    field(PREC, "3")
    field(SCAN, "Passive")
}

record(ao, "$(CAM):Stats4:MaxByteRate")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))MAX_BYTE_RATE")
    field(EGU,  "s")
    field(PREC, "3")
    field(VAL,  "0.0")
    field(DRVL, "0")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):Stats4:MaxByteRate_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))MAX_BYTE_RATE")
    field(EGU,  "s")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the last execution time of the plugin     #
###################################################################
record(ai, "$(CAM):Stats4:ExecutionTime_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))EXECUTION_TIME")
    field(EGU,  "ms")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record requests that the plugin execute again with the    #
#  same NDArray                                                   #
###################################################################
record(bo, "$(CAM):Stats4:ProcessPlugin")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))PROCESS_PLUGIN")
    field(VAL,  "1")
}

###################################################################
#  These records control whether callbacks block or not           #
###################################################################
record(bo, "$(CAM):Stats4:BlockingCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))BLOCKING_CALLBACKS")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(VAL,  "0")
    info(autosaveFields, "DESC ZSV OSV VAL")
}

record(bi, "$(CAM):Stats4:BlockingCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))BLOCKING_CALLBACKS")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(ZSV,  "NO_ALARM")
    field(OSV,  "MINOR")
    field(SCAN, "I/O Intr")
    info( autosaveFields, "DESC ZSV OSV" )
}


record(longout, "$(CAM):Stats4:DroppedArrays")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))DROPPED_ARRAYS")
    field(VAL,  "0")
    info( autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV EGU" )
}

record(longin, "$(CAM):Stats4:DroppedArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))DROPPED_ARRAYS")
    field(SCAN, "I/O Intr")
    field(HIGH, "1")
    field(HSV,  "MINOR")
    info( autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV EGU" )
}

record(longout, "$(CAM):Stats4:QueueSize")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))QUEUE_SIZE")
    field(PINI, "YES")
    info( autosaveFields, "DESC EGU" )
}

record(longin, "$(CAM):Stats4:QueueSize_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))QUEUE_SIZE")
    field(FLNK, "$(CAM):Stats4:QueueFreeLow")
    field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):Stats4:QueueFreeLow") {
    field(CALC, "A*0.25")
    field(INPA, "$(CAM):Stats4:QueueSize")
    field(OUT,  "$(CAM):Stats4:QueueFree.LOW")
    field(FLNK, "$(CAM):Stats4:QueueUseHIGH")
}

# Set a HIGH warning level for the input queue fill level to 75%
# of the full size of the queue
record(calcout, "$(CAM):Stats4:QueueUseHIGH") {
   field(CALC, "A*0.75")
   field(INPA, "$(CAM):Stats4:QueueSize")
   field(OUT,  "$(CAM):Stats4:QueueUse.HIGH")
   field(FLNK, "$(CAM):Stats4:QueueUseHIHI")
}

# Set a HIHI level for the input queue fill level to indicate an error
# (MAJOR alarm)  when it fills up to the full size of the queue (frames start dropping)
record(calcout, "$(CAM):Stats4:QueueUseHIHI") {
   field(CALC, "A*1.0")
   field(INPA, "$(CAM):Stats4:QueueSize")
   field(OUT,  "$(CAM):Stats4:QueueUse.HIHI")
}

record(longin, "$(CAM):Stats4:QueueFree")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))QUEUE_FREE")
    field(LLSV, "MAJOR")
    field(LSV,  "MINOR")
    field(LOLO, "0")
    field(HYST, "1")
    field(SCAN, "I/O Intr")
}

# Display the fill level on the plugins input queue
record(calc, "$(CAM):Stats4:QueueUse") {
    field(CALC, "A-B")
    field(INPA, "$(CAM):Stats4:QueueSize")
    field(INPB, "$(CAM):Stats4:QueueFree CP")
    field(SCAN, "Passive")
    field(HHSV, "MAJOR")
    field(HSV,  "MINOR")
    field(HYST, "1")
}

record(longout, "$(CAM):Stats4:NumThreads")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))NUM_THREADS")
    field(VAL,  "1")
    field(PINI, "YES")
    info(autosaveFields, "DESC VAL")
}

record(longin, "$(CAM):Stats4:NumThreads_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))NUM_THREADS")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats4:MaxThreads_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))MAX_THREADS")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control output array sorting                     #
###################################################################
record(mbbo, "$(CAM):Stats4:SortMode") {
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))SORT_MODE")
    field(ZRVL, "0")
    field(ZRST, "Unsorted")
    field(ONVL, "1")
    field(ONST, "Sorted")
}

record(mbbi, "$(CAM):Stats4:SortMode_RBV") {
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))SORT_MODE")
    field(ZRVL, "0")
    field(ZRST, "Unsorted")
    field(ONVL, "1")
    field(ONST, "Sorted")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats4:SortTime") {
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))SORT_TIME")
    field(PREC, "3")
    field(VAL, "0.1")
}

record(ai, "$(CAM):Stats4:SortTime_RBV") {
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))SORT_TIME")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Stats4:SortSize")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))SORT_SIZE")
    field(VAL,  "20")
    field(PINI, "YES")
}

record(longin, "$(CAM):Stats4:SortSize_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))SORT_SIZE")
    field(FLNK, "$(CAM):Stats4:SortFreeLow")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats4:SortFree") {
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))SORT_FREE")
    field(LLSV, "MAJOR")
    field(LSV,  "MINOR")
    field(LOLO, "0")
    field(HYST, "1")
    field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):Stats4:SortFreeLow") {
    field(CALC, "A*0.25")
    field(INPA, "$(CAM):Stats4:SortSize")
    field(OUT,  "$(CAM):Stats4:SortFree.LOW")
}

record(longout, "$(CAM):Stats4:DroppedOutputArrays")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))DROPPED_OUTPUT_ARRAYS")
    field(VAL,  "0")
}

record(longin, "$(CAM):Stats4:DroppedOutputArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))DROPPED_OUTPUT_ARRAYS")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Stats4:DisorderedArrays")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))DISORDERED_ARRAYS")
    field(PINI, "YES")
}

record(longin, "$(CAM):Stats4:DisorderedArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))DISORDERED_ARRAYS")
    field(SCAN, "I/O Intr")
}



###################################################################
#  The asynRecord is used for mainly for trace mask               # 
###################################################################
 
# Set ASYN_TRACEIO_HEX bit by default
record(asyn,"$(CAM):Stats4:AsynIO")
{
    field(PORT, "Stats4")
    field(TIB2,"1")
    info("ADType", "ADPlugin")
}


###################################################################
#  These records contain the basic statistics                     #
###################################################################
record(bo, "$(CAM):Stats4:ComputeStatistics")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))COMPUTE_STATISTICS")
   field(VAL,  "1")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Stats4:ComputeStatistics_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))COMPUTE_STATISTICS")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(ZSV,  "MINOR")
   field(OSV,  "NO_ALARM")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Stats4:BgdWidth")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))BGD_WIDTH")
   field(VAL,  "1")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Stats4:BgdWidth_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))BGD_WIDTH")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats4:MinValue")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))MIN_VALUE")
}

record(ai, "$(CAM):Stats4:MinValue_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))MIN_VALUE")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats4:MaxValue")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))MAX_VALUE")
}

record(ai, "$(CAM):Stats4:MaxValue_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))MAX_VALUE")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats4:MeanValue")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))MEAN_VALUE")
}

record(ai, "$(CAM):Stats4:MeanValue_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))MEAN_VALUE")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats4:SigmaValue")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))SIGMA_VALUE")
}

record(ai, "$(CAM):Stats4:Sigma_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))SIGMA_VALUE")
   field(PREC, "1")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats4:Total")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))TOTAL")
}

record(ai, "$(CAM):Stats4:Total_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))TOTAL")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats4:Net")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))NET")
}

record(ai, "$(CAM):Stats4:Net_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))NET")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats4:MinX")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))MIN_X")
}

record(ai, "$(CAM):Stats4:MinX_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))MIN_X")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats4:MinY")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))MIN_Y")
}

record(ai, "$(CAM):Stats4:MinY_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))MIN_Y")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats4:MaxX")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))MAX_X")
}

record(ai, "$(CAM):Stats4:MaxX_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))MAX_X")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats4:MaxY")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))MAX_Y")
}

record(ai, "$(CAM):Stats4:MaxY_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))MAX_Y")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

###################################################################
#  These records control whether centroid statistics are computed #
###################################################################
record(bo, "$(CAM):Stats4:ComputeCentroid")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))COMPUTE_CENTROID")
   field(VAL,  "0")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Stats4:ComputeCentroid_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))COMPUTE_CENTROID")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(ZSV,  "MINOR")
   field(OSV,  "NO_ALARM")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records contain the centroid statistics                  #
###################################################################
record(ao, "$(CAM):Stats4:CentroidThreshold")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))CENTROID_THRESHOLD")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):Stats4:CentroidThreshold_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))CENTROID_THRESHOLD")
    field(VAL,  "0")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats4:CentroidTotal")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))CENTROID_TOTAL")
}

record(ai, "$(CAM):Stats4:CentroidTotal_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))CENTROID_TOTAL")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats4:CentroidX")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))CENTROIDX_VALUE")
}

record(ai, "$(CAM):Stats4:CentroidX_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))CENTROIDX_VALUE")
   field(PREC, "1")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats4:CentroidY")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))CENTROIDY_VALUE")
}

record(ai, "$(CAM):Stats4:CentroidY_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))CENTROIDY_VALUE")
   field(PREC, "1")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats4:SigmaX")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))SIGMAX_VALUE")
}

record(ai, "$(CAM):Stats4:SigmaX_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))SIGMAX_VALUE")
   field(PREC, "1")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats4:SigmaY")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))SIGMAY_VALUE")
}

record(ai, "$(CAM):Stats4:SigmaY_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))SIGMAY_VALUE")
   field(PREC, "1")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats4:SigmaXY")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))SIGMAXY_VALUE")
}

record(ai, "$(CAM):Stats4:SigmaXY_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))SIGMAXY_VALUE")
   field(PREC, "3")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats4:SkewX")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))SKEWX_VALUE")
}

record(ai, "$(CAM):Stats4:SkewX_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))SKEWX_VALUE")
   field(PREC, "3")
   field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats4:SkewY")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))SKEWY_VALUE")
}

record(ai, "$(CAM):Stats4:SkewY_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))SKEWY_VALUE")
   field(PREC, "3")
   field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats4:KurtosisX")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))KURTOSISX_VALUE")
}

record(ai, "$(CAM):Stats4:KurtosisX_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))KURTOSISX_VALUE")
   field(PREC, "3")
   field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats4:KurtosisY")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))KURTOSISY_VALUE")
}

record(ai, "$(CAM):Stats4:KurtosisY_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))KURTOSISY_VALUE")
   field(PREC, "3")
   field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats4:Eccentricity")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))ECCENTRICITY_VALUE")
}

record(ai, "$(CAM):Stats4:Eccentricity_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))ECCENTRICITY_VALUE")
   field(PREC, "3")
   field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats4:Orientation")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))ORIENTATION_VALUE")
}

record(ai, "$(CAM):Stats4:Orientation_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))ORIENTATION_VALUE")
   field(PREC, "3")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control time series                              #
###################################################################
record(waveform, "$(CAM):Stats4:TSMinValue")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats4_TS,0,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats4:TSMinX")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats4_TS,1,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats4:TSMinY")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats4_TS,2,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats4:TSMaxValue")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats4_TS,3,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats4:TSMaxX")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats4_TS,4,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats4:TSMaxY")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats4_TS,5,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats4:TSMeanValue")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats4_TS,6,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats4:TSSigma")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats4_TS,7,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats4:TSTotal")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats4_TS,8,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats4:TSNet")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats4_TS,9,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats4:TSCentroidTotal")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats4_TS,10,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats4:TSCentroidX")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats4_TS,11,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats4:TSCentroidY")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats4_TS,12,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats4:TSSigmaX")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats4_TS,13,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats4:TSSigmaY")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats4_TS,14,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats4:TSSigmaXY")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats4_TS,15,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats4:TSSkewX")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats4_TS,16,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats4:TSSkewY")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats4_TS,17,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats4:TSKurtosisX")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats4_TS,18,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats4:TSKurtosisY")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats4_TS,19,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats4:TSEccentricity")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats4_TS,20,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats4:TSOrientation")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats4_TS,21,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats4:TSTimestamp")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats4_TS,22,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control profiles                                 #
###################################################################
record(bo, "$(CAM):Stats4:ComputeProfiles")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))COMPUTE_PROFILES")
   field(VAL,  "0")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Stats4:ComputeProfiles_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))COMPUTE_PROFILES")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(ZSV,  "MINOR")
   field(OSV,  "NO_ALARM")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats4:ProfileSizeX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))PROFILE_SIZE_X")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats4:ProfileSizeY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))PROFILE_SIZE_Y")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Stats4:CursorX")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))CURSOR_X")
   field(VAL,  "256")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Stats4:CursorX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))CURSOR_X")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Stats4:CursorY")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))CURSOR_Y")
   field(VAL,  "256")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Stats4:CursorY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))CURSOR_Y")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats4:ProfileAverageX_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))PROFILE_AVERAGE_X")
   field(FTVL, "DOUBLE")
   field(NELM, "$(XSIZE)")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats4:ProfileAverageY_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))PROFILE_AVERAGE_Y")
   field(FTVL, "DOUBLE")
   field(NELM, "$(YSIZE)")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats4:ProfileThresholdX_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))PROFILE_THRESHOLD_X")
   field(FTVL, "DOUBLE")
   field(NELM, "$(XSIZE)")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats4:ProfileThresholdY_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))PROFILE_THRESHOLD_Y")
   field(FTVL, "DOUBLE")
   field(NELM, "$(YSIZE)")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats4:ProfileCentroidX_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))PROFILE_CENTROID_X")
   field(FTVL, "DOUBLE")
   field(NELM, "$(XSIZE)")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(waveform, "$(CAM):Stats4:ProfileCentroidY_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))PROFILE_CENTROID_Y")
   field(FTVL, "DOUBLE")
   field(NELM, "$(YSIZE)")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(waveform, "$(CAM):Stats4:ProfileCursorX_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))PROFILE_CURSOR_X")
   field(FTVL, "DOUBLE")
   field(NELM, "$(XSIZE)")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(waveform, "$(CAM):Stats4:ProfileCursorY_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))PROFILE_CURSOR_Y")
   field(FTVL, "DOUBLE")
   field(NELM, "$(YSIZE)")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}


###################################################################
#  These are used to define the histogram                         #
###################################################################
record(bo, "$(CAM):Stats4:ComputeHistogram")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))COMPUTE_HISTOGRAM")
   field(VAL,  "0")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Stats4:ComputeHistogram_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))COMPUTE_HISTOGRAM")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(ZSV,  "MINOR")
   field(OSV,  "NO_ALARM")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Stats4:HistSize")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))HIST_SIZE")
   field(VAL,  "256")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Stats4:HistSize_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))HIST_SIZE")
   field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats4:HistMin")
{
   field(PINI, "YES")
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))HIST_MIN")
   field(VAL,  "0")
   info(autosaveFields, "VAL")
}

record(ai, "$(CAM):Stats4:HistMin_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))HIST_MIN")
   field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats4:HistMax")
{
   field(PINI, "YES")
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))HIST_MAX")
   field(VAL,  "255")
   info(autosaveFields, "VAL")
}

record(ai, "$(CAM):Stats4:HistMax_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))HIST_MAX")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Stats4:HistBelow")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))HIST_BELOW")
}

record(longin, "$(CAM):Stats4:HistBelow_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))HIST_BELOW")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Stats4:HistAbove")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))HIST_ABOVE")
}

record(longin, "$(CAM):Stats4:HistAbove_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))HIST_ABOVE")
   field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats4:HistEntropy")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))HIST_ENTROPY")
}

record(ai, "$(CAM):Stats4:HistEntropy_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))HIST_ENTROPY")
   field(PREC, "3")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats4:Histogram_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))HIST_ARRAY")
   field(FTVL, "DOUBLE")
   field(NELM, "256")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats4:HistogramX_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats4,$(ADDR=0),$(TIMEOUT=1))HIST_X_ARRAY")
   field(FTVL, "DOUBLE")
   field(NELM, "256")
   field(SCAN, "I/O Intr")
}


###################################################################
#  These records set the HOPR and LOPR values for the cursor      #
#  and size to the maximum for the input array                    #
###################################################################

record(longin, "$(CAM):Stats4:MaxSizeX")
{
    field(INP,  "$(CAM):Stats4:ProfileSizeX_RBV CP")
    field(FLNK, "$(CAM):Stats4:SetXHOPR.PROC PP")
}

record(dfanout, "$(CAM):Stats4:SetXHOPR")
{
    field(DOL,  "$(CAM):Stats4:MaxSizeX NPP")
    field(OMSL, "closed_loop")
    field(OUTA, "$(CAM):Stats4:CursorX.HOPR NPP")
}

record(longin, "$(CAM):Stats4:MaxSizeY")
{
    field(INP,  "$(CAM):Stats4:ProfileSizeY_RBV CP")
    field(FLNK, "$(CAM):Stats4:SetYHOPR.PROC PP")
}

record(dfanout, "$(CAM):Stats4:SetYHOPR")
{
    field(DOL,  "$(CAM):Stats4:MaxSizeY NPP")
    field(OMSL, "closed_loop")
    field(OUTA, "$(CAM):Stats4:CursorY.HOPR NPP")
}

###################################################################
#  These records reset the statistics                             #
###################################################################
record(sseq, "$(CAM):Stats4:Reset")
{
   field(LNK1, "$(CAM):Stats4:MinValue PP MS")    
   field(LNK2, "$(CAM):Stats4:MaxValue PP MS")    
   field(LNK3, "$(CAM):Stats4:MeanValue PP MS")    
   field(LNK4, "$(CAM):Stats4:SigmaValue PP MS")    
   field(LNK5, "$(CAM):Stats4:Total PP MS")    
   field(LNK6, "$(CAM):Stats4:Net PP MS")    
   field(LNK7, "$(CAM):Stats4:MinX PP MS")    
   field(LNK8, "$(CAM):Stats4:MinY PP MS")    
   field(LNK9, "$(CAM):Stats4:MaxX PP MS")
   field(LNKA, "$(CAM):Stats4:MaxY PP MS")    
   field(FLNK, "$(CAM):Stats4:Reset1")   
}

record(sseq, "$(CAM):Stats4:Reset1")
{
   field(LNK1, "$(CAM):Stats4:CentroidX PP MS")    
   field(LNK2, "$(CAM):Stats4:CentroidY PP MS")    
   field(LNK3, "$(CAM):Stats4:SigmaX PP MS")    
   field(LNK4, "$(CAM):Stats4:SigmaY PP MS")    
   field(LNK5, "$(CAM):Stats4:SigmaXY PP MS")    
   field(LNK6, "$(CAM):Stats4:CentroidTotal PP MS")    
   field(LNK7, "$(CAM):Stats4:SkewX PP MS")    
   field(LNK8, "$(CAM):Stats4:SkewY PP MS")    
   field(LNK9, "$(CAM):Stats4:KurtosisX PP MS")    
   field(LNKA, "$(CAM):Stats4:KurtosisY PP MS")    
   field(FLNK, "$(CAM):Stats4:Reset2")   
}

record(sseq, "$(CAM):Stats4:Reset2")
{
   field(LNK1, "$(CAM):Stats4:Eccentricity PP MS")    
   field(LNK2, "$(CAM):Stats4:Orientation PP MS")    
   field(LNK3, "$(CAM):Stats4:HistBelow PP MS")    
   field(LNK4, "$(CAM):Stats4:HistAbove PP MS")    
   field(LNK5, "$(CAM):Stats4:HistEntropy PP MS")    
}

#=================================================================#
# Template file: NDStats.template

#=================================================================#
# Template file: NDPluginBase.template
# Database for NDPluginBase, i.e. records common to all plugins
# Mark Rivers
# April 25, 2008

#=================================================================#
# Template file: NDArrayBase.template
# Database for area detector control using asyn driver and standard asyn device support
# Mark Rivers
# March 9, 2008

###################################################################
#  This record contains the version of ADCore                     #
###################################################################

record(stringin, "$(CAM):Stats5:ADCoreVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))ADCORE_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the version of the driver or plugin       #
###################################################################

record(stringin, "$(CAM):Stats5:DriverVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))DRIVER_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the asyn port name of this detector       #
###################################################################

record(stringin, "$(CAM):Stats5:PortName_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))PORT_NAME_SELF")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records contain basic information about the detector     # 
###################################################################

record(stringin, "$(CAM):Stats5:Manufacturer_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))MANUFACTURER")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):Stats5:Model_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))MODEL")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):Stats5:SerialNumber_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))SERIAL_NUMBER")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):Stats5:SDKVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))SDK_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):Stats5:FirmwareVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))FIRMWARE_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control acquisition start and stop               #
###################################################################

record(bo, "$(CAM):Stats5:Acquire") {
   field(DTYP, "asynInt32")
   field(OUT, "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))ACQUIRE")
   field(ZNAM, "Done")
   field(ONAM, "Acquire")
   field(VAL,  "0")
   field(FLNK, "$(CAM):Stats5:SetAcquireBusy")
   info(asyn:READBACK, "1")
}

record(bi, "$(CAM):Stats5:Acquire_RBV") {
   field(DTYP, "asynInt32")
   field(INP, "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))ACQUIRE")
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):Stats5:SetAcquireBusy")
{
    field(INPA, "$(CAM):Stats5:Acquire NPP")
    field(CALC, "A")
    field(OOPT, "Transition To Non-zero")
    field(OUT,  "$(CAM):Stats5:AcquireBusy PP")
}

record(busy, "$(CAM):Stats5:AcquireBusy") {
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(VAL,  "0")
}

record(bi, "$(CAM):Stats5:AcquireBusyCB") {
   field(DTYP, "asynInt32")
   field(INP, "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))ACQUIRE_BUSY")
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):Stats5:ClearAcquireBusy") {
    field(INPA, "$(CAM):Stats5:AcquireBusyCB CP")
    field(CALC, "A")
    field(OOPT, "Transition To Zero")
    field(OUT,  "$(CAM):Stats5:AcquireBusy PP")
}

record(bo, "$(CAM):Stats5:WaitForPlugins") {
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT, "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))WAIT_FOR_PLUGINS")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(VAL,  "0")
}

###################################################################
#  These records are the array size and data type                 #
###################################################################
# The number of dimensions
record(longout, "$(CAM):Stats5:NDimensions")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))ARRAY_NDIMENSIONS")
}

record(longin, "$(CAM):Stats5:NDimensions_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))ARRAY_NDIMENSIONS")
    field(SCAN, "I/O Intr")
}

# The array dimensions waveform records
record(waveform, "$(CAM):Stats5:Dimensions")
{
    field(DTYP, "asynInt32ArrayOut")
    field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))ARRAY_DIMENSIONS")
    field(FTVL, "LONG")
    field(NELM, "10")
    field(FLNK, "$(CAM):Stats5:Dim0SA")
}

record(subArray, "$(CAM):Stats5:Dim0SA")
{
    field(INP,  "$(CAM):Stats5:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "0")
    field(FLNK, "$(CAM):Stats5:ArraySize0")
}

record(longin, "$(CAM):Stats5:ArraySize0")
{
    field(INP,  "$(CAM):Stats5:Dim0SA")
    field(FLNK, "$(CAM):Stats5:Dim1SA")
}

record(subArray, "$(CAM):Stats5:Dim1SA")
{
    field(INP,  "$(CAM):Stats5:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "1")
    field(FLNK, "$(CAM):Stats5:ArraySize1")
}

record(longin, "$(CAM):Stats5:ArraySize1")
{
    field(INP,  "$(CAM):Stats5:Dim1SA")
    field(FLNK, "$(CAM):Stats5:Dim2SA")
}

record(subArray, "$(CAM):Stats5:Dim2SA")
{
    field(INP,  "$(CAM):Stats5:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "2")
    field(FLNK, "$(CAM):Stats5:ArraySize2")
}

record(longin, "$(CAM):Stats5:ArraySize2")
{
    field(INP,  "$(CAM):Stats5:Dim2SA")
    field(FLNK, "$(CAM):Stats5:Dim3SA")
}

record(subArray, "$(CAM):Stats5:Dim3SA")
{
    field(INP,  "$(CAM):Stats5:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "3")
    field(FLNK, "$(CAM):Stats5:ArraySize3")
}

record(longin, "$(CAM):Stats5:ArraySize3")
{
    field(INP,  "$(CAM):Stats5:Dim3SA")
    field(FLNK, "$(CAM):Stats5:Dim4SA")
}

record(subArray, "$(CAM):Stats5:Dim4SA")
{
    field(INP,  "$(CAM):Stats5:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "4")
    field(FLNK, "$(CAM):Stats5:ArraySize4")
}

record(longin, "$(CAM):Stats5:ArraySize4")
{
    field(INP,  "$(CAM):Stats5:Dim4SA")
    field(FLNK, "$(CAM):Stats5:Dim5SA")
}

record(subArray, "$(CAM):Stats5:Dim5SA")
{
    field(INP,  "$(CAM):Stats5:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "5")
    field(FLNK, "$(CAM):Stats5:ArraySize5")
}

record(longin, "$(CAM):Stats5:ArraySize5")
{
    field(INP,  "$(CAM):Stats5:Dim5SA")
    field(FLNK, "$(CAM):Stats5:Dim6SA")
}

record(subArray, "$(CAM):Stats5:Dim6SA")
{
    field(INP,  "$(CAM):Stats5:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "6")
    field(FLNK, "$(CAM):Stats5:ArraySize6")
}

record(longin, "$(CAM):Stats5:ArraySize6")
{
    field(INP,  "$(CAM):Stats5:Dim6SA")
    field(FLNK, "$(CAM):Stats5:Dim7SA")
}

record(subArray, "$(CAM):Stats5:Dim7SA")
{
    field(INP,  "$(CAM):Stats5:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "7")
    field(FLNK, "$(CAM):Stats5:ArraySize7")
}

record(longin, "$(CAM):Stats5:ArraySize7")
{
    field(INP,  "$(CAM):Stats5:Dim7SA")
    field(FLNK, "$(CAM):Stats5:Dim8SA")
}

record(subArray, "$(CAM):Stats5:Dim8SA")
{
    field(INP,  "$(CAM):Stats5:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "8")
    field(FLNK, "$(CAM):Stats5:ArraySize8")
}

record(longin, "$(CAM):Stats5:ArraySize8")
{
    field(INP,  "$(CAM):Stats5:Dim8SA")
    field(FLNK, "$(CAM):Stats5:Dim9SA")
}

record(subArray, "$(CAM):Stats5:Dim9SA")
{
    field(INP,  "$(CAM):Stats5:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "9")
    field(FLNK, "$(CAM):Stats5:ArraySize9")
}

record(longin, "$(CAM):Stats5:ArraySize9")
{
    field(INP,  "$(CAM):Stats5:Dim9SA")
}


record(waveform, "$(CAM):Stats5:Dimensions_RBV")
{
    field(DTYP, "asynInt32ArrayIn")
    field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))ARRAY_DIMENSIONS")
    field(FTVL, "LONG")
    field(NELM, "10")
    field(FLNK, "$(CAM):Stats5:Dim0SA_RBV")
    field(SCAN, "I/O Intr")
}

record(subArray, "$(CAM):Stats5:Dim0SA_RBV")
{
    field(INP,  "$(CAM):Stats5:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "0")
    field(FLNK, "$(CAM):Stats5:ArraySize0_RBV")
}

record(longin, "$(CAM):Stats5:ArraySize0_RBV")
{
    field(INP,  "$(CAM):Stats5:Dim0SA_RBV")
    field(FLNK, "$(CAM):Stats5:Dim1SA_RBV")
}

record(subArray, "$(CAM):Stats5:Dim1SA_RBV")
{
    field(INP,  "$(CAM):Stats5:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "1")
    field(FLNK, "$(CAM):Stats5:ArraySize1_RBV")
}

record(longin, "$(CAM):Stats5:ArraySize1_RBV")
{
    field(INP,  "$(CAM):Stats5:Dim1SA_RBV")
    field(FLNK, "$(CAM):Stats5:Dim2SA_RBV")
}

record(subArray, "$(CAM):Stats5:Dim2SA_RBV")
{
    field(INP,  "$(CAM):Stats5:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "2")
    field(FLNK, "$(CAM):Stats5:ArraySize2_RBV")
}

record(longin, "$(CAM):Stats5:ArraySize2_RBV")
{
    field(INP,  "$(CAM):Stats5:Dim2SA_RBV")
    field(FLNK, "$(CAM):Stats5:Dim3SA_RBV")
}

record(subArray, "$(CAM):Stats5:Dim3SA_RBV")
{
    field(INP,  "$(CAM):Stats5:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "3")
    field(FLNK, "$(CAM):Stats5:ArraySize3_RBV")
}

record(longin, "$(CAM):Stats5:ArraySize3_RBV")
{
    field(INP,  "$(CAM):Stats5:Dim3SA_RBV")
    field(FLNK, "$(CAM):Stats5:Dim4SA_RBV")
}

record(subArray, "$(CAM):Stats5:Dim4SA_RBV")
{
    field(INP,  "$(CAM):Stats5:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "4")
    field(FLNK, "$(CAM):Stats5:ArraySize4_RBV")
}

record(longin, "$(CAM):Stats5:ArraySize4_RBV")
{
    field(INP,  "$(CAM):Stats5:Dim4SA_RBV")
    field(FLNK, "$(CAM):Stats5:Dim5SA_RBV")
}

record(subArray, "$(CAM):Stats5:Dim5SA_RBV")
{
    field(INP,  "$(CAM):Stats5:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "5")
    field(FLNK, "$(CAM):Stats5:ArraySize5_RBV")
}

record(longin, "$(CAM):Stats5:ArraySize5_RBV")
{
    field(INP,  "$(CAM):Stats5:Dim5SA_RBV")
    field(FLNK, "$(CAM):Stats5:Dim6SA_RBV")
}

record(subArray, "$(CAM):Stats5:Dim6SA_RBV")
{
    field(INP,  "$(CAM):Stats5:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "6")
    field(FLNK, "$(CAM):Stats5:ArraySize6_RBV")
}

record(longin, "$(CAM):Stats5:ArraySize6_RBV")
{
    field(INP,  "$(CAM):Stats5:Dim6SA_RBV")
    field(FLNK, "$(CAM):Stats5:Dim7SA_RBV")
}

record(subArray, "$(CAM):Stats5:Dim7SA_RBV")
{
    field(INP,  "$(CAM):Stats5:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "7")
    field(FLNK, "$(CAM):Stats5:ArraySize7_RBV")
}

record(longin, "$(CAM):Stats5:ArraySize7_RBV")
{
    field(INP,  "$(CAM):Stats5:Dim7SA_RBV")
    field(FLNK, "$(CAM):Stats5:Dim8SA_RBV")
}

record(subArray, "$(CAM):Stats5:Dim8SA_RBV")
{
    field(INP,  "$(CAM):Stats5:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "8")
    field(FLNK, "$(CAM):Stats5:ArraySize8_RBV")
}

record(longin, "$(CAM):Stats5:ArraySize8_RBV")
{
    field(INP,  "$(CAM):Stats5:Dim8SA_RBV")
    field(FLNK, "$(CAM):Stats5:Dim9SA_RBV")
}

record(subArray, "$(CAM):Stats5:Dim9SA_RBV")
{
    field(INP,  "$(CAM):Stats5:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "9")
    field(FLNK, "$(CAM):Stats5:ArraySize9_RBV")
}

record(longin, "$(CAM):Stats5:ArraySize9_RBV")
{
    field(INP,  "$(CAM):Stats5:Dim9SA_RBV")
}


record(mbbi, "$(CAM):Stats5:BayerPattern_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))BAYER_PATTERN")
   field(ZRST, "RGGB")
   field(ZRVL, "0")
   field(ONST, "GBRG")
   field(ONVL, "1")
   field(TWST, "GRBG")
   field(TWVL, "2")
   field(THST, "BGGR")
   field(THVL, "3")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats5:ArraySizeX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_X")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats5:ArraySizeY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_Y")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats5:ArraySizeZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_Z")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats5:ArraySize_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records have information on the compression              # 
###################################################################
record(stringin, "$(CAM):Stats5:Codec_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))CODEC")
   field(VAL,  "")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats5:CompressedSize_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))COMPRESSED_SIZE")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the data type                            # 
###################################################################

record(mbbo, "$(CAM):Stats5:DataType")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))DATA_TYPE")
   field(ZRST, "Int8")
   field(ZRVL, "0")
   field(ONST, "UInt8")
   field(ONVL, "1")
   field(TWST, "Int16")
   field(TWVL, "2")
   field(THST, "UInt16")
   field(THVL, "3")
   field(FRST, "Int32")
   field(FRVL, "4")
   field(FVST, "UInt32")
   field(FVVL, "5")
   field(SXST, "Int64")
   field(SXVL, "6")
   field(SVST, "UInt64")
   field(SVVL, "7")
   field(EIST, "Float32")
   field(EIVL, "8")
   field(NIST, "Float64")
   field(NIVL, "9")
   field(VAL,  "0")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Stats5:DataType_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))DATA_TYPE")
   field(ZRST, "Int8")
   field(ZRVL, "0")
   field(ONST, "UInt8")
   field(ONVL, "1")
   field(TWST, "Int16")
   field(TWVL, "2")
   field(THST, "UInt16")
   field(THVL, "3")
   field(FRST, "Int32")
   field(FRVL, "4")
   field(FVST, "UInt32")
   field(FVVL, "5")
   field(SXST, "Int64")
   field(SXVL, "6")
   field(SVST, "UInt64")
   field(SVVL, "7")
   field(EIST, "Float32")
   field(EIVL, "8")
   field(NIST, "Float64")
   field(NIVL, "9")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats5:BitsPerPixel_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))BITS_PER_PIXEL")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the color mode                           #
#  These choices must agree with NDColorMode_t in NDArray.h       # 
###################################################################

record(mbbo, "$(CAM):Stats5:ColorMode")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))COLOR_MODE")
   field(ZRST, "Mono")
   field(ZRVL, "0")
   field(ONST, "Bayer")
   field(ONVL, "1")
   field(TWST, "RGB1")
   field(TWVL, "2")
   field(THST, "RGB2")
   field(THVL, "3")
   field(FRST, "RGB3")
   field(FRVL, "4")
   field(FVST, "YUV444")
   field(FVVL, "5")
   field(SXST, "YUV422")
   field(SXVL, "6")
   field(SVST, "YUV421")
   field(SVVL, "7")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Stats5:ColorMode_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))COLOR_MODE")
   field(ZRST, "Mono")
   field(ZRVL, "0")
   field(ONST, "Bayer")
   field(ONVL, "1")
   field(TWST, "RGB1")
   field(TWVL, "2")
   field(THST, "RGB2")
   field(THVL, "3")
   field(FRST, "RGB3")
   field(FRVL, "4")
   field(FVST, "YUV444")
   field(FVVL, "5")
   field(SXST, "YUV422")
   field(SXVL, "6")
   field(SVST, "YUV421")
   field(SVVL, "7")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records are the uniqueId and time stamps of the array     #
###################################################################
record(longin, "$(CAM):Stats5:UniqueId_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))UNIQUE_ID")
    field(SCAN, "I/O Intr")
}

record(ai, "$(CAM):Stats5:TimeStamp_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))TIME_STAMP")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats5:EpicsTSSec_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))EPICS_TS_SEC")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats5:EpicsTSNsec_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))EPICS_TS_NSEC")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records provide statistics on array callbacks and        #
#  array callback rates                                           # 
###################################################################
record(longout, "$(CAM):Stats5:ArrayCounter")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))ARRAY_COUNTER")
}

record(longin, "$(CAM):Stats5:ArrayCounter_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))ARRAY_COUNTER")
    field(SCAN, "I/O Intr")
    field(TSE,  "-2")
    field(LOW,  "0" )
    field(LSV,  "MINOR" )
    info(autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV TSE")
}

# Updated rate calculation to use a smoothing factor w/ guard against negative values
# 0 rate sets alarm state to MINOR
record(calc, "$(CAM):Stats5:ArrayRate_RBV")
{
    field(INPA, "$(CAM):Stats5:ArrayRate_RBV.LB NPP NMS")   # Previous counter (Last B value)
    field(INPB, "$(CAM):Stats5:ArrayCounter_RBV NPP NMS")   # Current counter value
    field(INPC, "1.0")                                # Delta time in seconds
    field(INPD, "$(CAM):Stats5:ArrayRate_RBV.VAL NPP NMS")  # Previous rate
    field(INPE, "0.0")                 # Smoothing factor
    field(CALC, "(D*E)/C+MAX(0,B-A)*(1-E)/C")
    field(PREC, "2" )
    field(EGU,  "Hz" )
    field(SCAN, "1 second")
    field(LOW,  "0")
    field(LSV,  "MINOR")
    field(ADEL, "0.1")
    info(autosaveFields, "ADEL DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV MDEL PREC C E SCAN EGU")
}

###################################################################
#  These records control NDArray callacks                         # 
###################################################################
record(bo, "$(CAM):Stats5:ArrayCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))ARRAY_CALLBACKS")
    field(ZNAM, "Disable")
    field(ZSV,  "MINOR")
    field(ONAM, "Enable")
    field(OSV,  "NO_ALARM")
    field(VAL, "1")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Stats5:ArrayCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))ARRAY_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ZSV,  "MINOR")
    field(ONAM, "Enabled")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains macro definitions for the attributes      # 
###################################################################

record(waveform, "$(CAM):Stats5:NDAttributesMacros")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_MACROS")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

###################################################################
#  This record is the name of a file defining attributes          # 
###################################################################

record(waveform, "$(CAM):Stats5:NDAttributesFile")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_FILE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

###################################################################
#  This record defines the status of reading attributes file      # 
###################################################################

record(mbbi, "$(CAM):Stats5:NDAttributesStatus")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_STATUS")
    field(ZRVL, "0")
    field(ZRST, "Attributes file OK")
    field(ZRSV, "NO_ALARM")
    field(ONVL, "1")
    field(ONST, "File not found")
    field(ONSV, "MINOR")
    field(TWVL, "2")
    field(TWST, "XML syntax error")
    field(TWSV, "MAJOR")
    field(THVL, "3")
    field(THST, "Macro substitution error")
    field(THSV, "MAJOR")
    field(SCAN, "I/O Intr")
}

###################################################################
#  Status of NDArrayPool - number of buffers, memory used etc.    # 
###################################################################

record(ai, "$(CAM):Stats5:PoolMaxMem")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))POOL_MAX_MEMORY")
   field(PREC, "1")
   field(EGU,  "MB")
   field(SCAN, "Passive")
   field(PINI, "YES")
}

record(ai, "$(CAM):Stats5:PoolUsedMem")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))POOL_USED_MEMORY")
   field(PREC, "1")
   field(EGU,  "MB")
   field(SCAN, "1 second")
   field(FLNK, "$(CAM):Stats5:PoolAllocBuffers")
   info(autosaveFields, "SCAN")
}

record(longin, "$(CAM):Stats5:PoolAllocBuffers")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))POOL_ALLOC_BUFFERS")
   field(FLNK, "$(CAM):Stats5:PoolFreeBuffers")
}

record(longin, "$(CAM):Stats5:PoolFreeBuffers")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))POOL_FREE_BUFFERS")
   field(FLNK, "$(CAM):Stats5:PoolUsedBuffers")
}

record(calc, "$(CAM):Stats5:PoolUsedBuffers")
{
    field(INPA, "$(CAM):Stats5:PoolAllocBuffers NPP MS")
    field(INPB, "$(CAM):Stats5:PoolFreeBuffers NPP MS")
    field(CALC, "A-B")
}

record(bo, "$(CAM):Stats5:EmptyFreeList")
{
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))POOL_EMPTY_FREELIST")
}

record(longin, "$(CAM):Stats5:NumQueuedArrays")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))NUM_QUEUED_ARRAYS")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the type of plugin                        #
###################################################################

record(stringin, "$(CAM):Stats5:PluginType_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))PLUGIN_TYPE")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the connection of the server to          #
#  an NDArray driver port and address                             #
###################################################################
# Array port name
record(stringout, "$(CAM):Stats5:NDArrayPort")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))NDARRAY_PORT")
    field(VAL,  "$(CAM_PORT)")
    info(autosaveFields, "DESC VAL")
}

record(stringin, "$(CAM):Stats5:NDArrayPort_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))NDARRAY_PORT")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Stats5:NDArrayAddress")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))NDARRAY_ADDR")
    field(VAL,  "$(NDARRAY_ADDR=4)")
    info(autosaveFields, "DESC VAL")
}

record(longin, "$(CAM):Stats5:NDArrayAddress_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))NDARRAY_ADDR")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control whether callbacks are enabled and        #
#  minimum time between callbacks                                 #
###################################################################
record(bo, "$(CAM):Stats5:EnableCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))ENABLE_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    field(VAL,  "0")
    info(autosaveFields, "DESC VAL")
}

record(bi, "$(CAM):Stats5:EnableCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))ENABLE_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    field(ZSV,  "MINOR")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats5:MinCallbackTime")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))MIN_CALLBACK_TIME")
    field(EGU,  "s")
    field(PREC, "3")
    field(VAL,  "0.0")
    field(DRVL, "0")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):Stats5:MinCallbackTime_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))MIN_CALLBACK_TIME")
    field(EGU,  "s")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats5:MaxArrayRate")
{
    field(DTYP, "Soft Channel")
    field(OUT,  "$(CAM):Stats5:MaxArrayRate_COUT PP")
    field(EGU,  "Hz")
    field(PREC, "3")
    field(VAL,  "0.0")
    info(autosaveFields, "VAL")
}

record(calcout, "$(CAM):Stats5:MaxArrayRate_COUT")
{
    field(INPA, "$(CAM):Stats5:MaxArrayRate")
    field(CALC, "A=0?0:1.0/A")
    field(OUT,  "$(CAM):Stats5:MinCallbackTime PP")
}

record(calc, "$(CAM):Stats5:MaxArrayRate_RBV")
{
    field(INPA, "$(CAM):Stats5:MinCallbackTime_RBV CP")
    field(CALC, "A=0?0:1.0/A")
    field(EGU,  "Hz")
    field(PREC, "3")
    field(SCAN, "Passive")
}

record(ao, "$(CAM):Stats5:MaxByteRate")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))MAX_BYTE_RATE")
    field(EGU,  "s")
    field(PREC, "3")
    field(VAL,  "0.0")
    field(DRVL, "0")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):Stats5:MaxByteRate_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))MAX_BYTE_RATE")
    field(EGU,  "s")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the last execution time of the plugin     #
###################################################################
record(ai, "$(CAM):Stats5:ExecutionTime_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))EXECUTION_TIME")
    field(EGU,  "ms")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record requests that the plugin execute again with the    #
#  same NDArray                                                   #
###################################################################
record(bo, "$(CAM):Stats5:ProcessPlugin")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))PROCESS_PLUGIN")
    field(VAL,  "1")
}

###################################################################
#  These records control whether callbacks block or not           #
###################################################################
record(bo, "$(CAM):Stats5:BlockingCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))BLOCKING_CALLBACKS")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(VAL,  "0")
    info(autosaveFields, "DESC ZSV OSV VAL")
}

record(bi, "$(CAM):Stats5:BlockingCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))BLOCKING_CALLBACKS")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(ZSV,  "NO_ALARM")
    field(OSV,  "MINOR")
    field(SCAN, "I/O Intr")
    info( autosaveFields, "DESC ZSV OSV" )
}


record(longout, "$(CAM):Stats5:DroppedArrays")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))DROPPED_ARRAYS")
    field(VAL,  "0")
    info( autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV EGU" )
}

record(longin, "$(CAM):Stats5:DroppedArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))DROPPED_ARRAYS")
    field(SCAN, "I/O Intr")
    field(HIGH, "1")
    field(HSV,  "MINOR")
    info( autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV EGU" )
}

record(longout, "$(CAM):Stats5:QueueSize")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))QUEUE_SIZE")
    field(PINI, "YES")
    info( autosaveFields, "DESC EGU" )
}

record(longin, "$(CAM):Stats5:QueueSize_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))QUEUE_SIZE")
    field(FLNK, "$(CAM):Stats5:QueueFreeLow")
    field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):Stats5:QueueFreeLow") {
    field(CALC, "A*0.25")
    field(INPA, "$(CAM):Stats5:QueueSize")
    field(OUT,  "$(CAM):Stats5:QueueFree.LOW")
    field(FLNK, "$(CAM):Stats5:QueueUseHIGH")
}

# Set a HIGH warning level for the input queue fill level to 75%
# of the full size of the queue
record(calcout, "$(CAM):Stats5:QueueUseHIGH") {
   field(CALC, "A*0.75")
   field(INPA, "$(CAM):Stats5:QueueSize")
   field(OUT,  "$(CAM):Stats5:QueueUse.HIGH")
   field(FLNK, "$(CAM):Stats5:QueueUseHIHI")
}

# Set a HIHI level for the input queue fill level to indicate an error
# (MAJOR alarm)  when it fills up to the full size of the queue (frames start dropping)
record(calcout, "$(CAM):Stats5:QueueUseHIHI") {
   field(CALC, "A*1.0")
   field(INPA, "$(CAM):Stats5:QueueSize")
   field(OUT,  "$(CAM):Stats5:QueueUse.HIHI")
}

record(longin, "$(CAM):Stats5:QueueFree")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))QUEUE_FREE")
    field(LLSV, "MAJOR")
    field(LSV,  "MINOR")
    field(LOLO, "0")
    field(HYST, "1")
    field(SCAN, "I/O Intr")
}

# Display the fill level on the plugins input queue
record(calc, "$(CAM):Stats5:QueueUse") {
    field(CALC, "A-B")
    field(INPA, "$(CAM):Stats5:QueueSize")
    field(INPB, "$(CAM):Stats5:QueueFree CP")
    field(SCAN, "Passive")
    field(HHSV, "MAJOR")
    field(HSV,  "MINOR")
    field(HYST, "1")
}

record(longout, "$(CAM):Stats5:NumThreads")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))NUM_THREADS")
    field(VAL,  "1")
    field(PINI, "YES")
    info(autosaveFields, "DESC VAL")
}

record(longin, "$(CAM):Stats5:NumThreads_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))NUM_THREADS")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats5:MaxThreads_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))MAX_THREADS")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control output array sorting                     #
###################################################################
record(mbbo, "$(CAM):Stats5:SortMode") {
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))SORT_MODE")
    field(ZRVL, "0")
    field(ZRST, "Unsorted")
    field(ONVL, "1")
    field(ONST, "Sorted")
}

record(mbbi, "$(CAM):Stats5:SortMode_RBV") {
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))SORT_MODE")
    field(ZRVL, "0")
    field(ZRST, "Unsorted")
    field(ONVL, "1")
    field(ONST, "Sorted")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats5:SortTime") {
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))SORT_TIME")
    field(PREC, "3")
    field(VAL, "0.1")
}

record(ai, "$(CAM):Stats5:SortTime_RBV") {
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))SORT_TIME")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Stats5:SortSize")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))SORT_SIZE")
    field(VAL,  "20")
    field(PINI, "YES")
}

record(longin, "$(CAM):Stats5:SortSize_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))SORT_SIZE")
    field(FLNK, "$(CAM):Stats5:SortFreeLow")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats5:SortFree") {
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))SORT_FREE")
    field(LLSV, "MAJOR")
    field(LSV,  "MINOR")
    field(LOLO, "0")
    field(HYST, "1")
    field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):Stats5:SortFreeLow") {
    field(CALC, "A*0.25")
    field(INPA, "$(CAM):Stats5:SortSize")
    field(OUT,  "$(CAM):Stats5:SortFree.LOW")
}

record(longout, "$(CAM):Stats5:DroppedOutputArrays")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))DROPPED_OUTPUT_ARRAYS")
    field(VAL,  "0")
}

record(longin, "$(CAM):Stats5:DroppedOutputArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))DROPPED_OUTPUT_ARRAYS")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Stats5:DisorderedArrays")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))DISORDERED_ARRAYS")
    field(PINI, "YES")
}

record(longin, "$(CAM):Stats5:DisorderedArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))DISORDERED_ARRAYS")
    field(SCAN, "I/O Intr")
}



###################################################################
#  The asynRecord is used for mainly for trace mask               # 
###################################################################
 
# Set ASYN_TRACEIO_HEX bit by default
record(asyn,"$(CAM):Stats5:AsynIO")
{
    field(PORT, "Stats5")
    field(TIB2,"1")
    info("ADType", "ADPlugin")
}


###################################################################
#  These records contain the basic statistics                     #
###################################################################
record(bo, "$(CAM):Stats5:ComputeStatistics")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))COMPUTE_STATISTICS")
   field(VAL,  "1")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Stats5:ComputeStatistics_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))COMPUTE_STATISTICS")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(ZSV,  "MINOR")
   field(OSV,  "NO_ALARM")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Stats5:BgdWidth")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))BGD_WIDTH")
   field(VAL,  "1")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Stats5:BgdWidth_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))BGD_WIDTH")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats5:MinValue")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))MIN_VALUE")
}

record(ai, "$(CAM):Stats5:MinValue_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))MIN_VALUE")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats5:MaxValue")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))MAX_VALUE")
}

record(ai, "$(CAM):Stats5:MaxValue_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))MAX_VALUE")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats5:MeanValue")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))MEAN_VALUE")
}

record(ai, "$(CAM):Stats5:MeanValue_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))MEAN_VALUE")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats5:SigmaValue")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))SIGMA_VALUE")
}

record(ai, "$(CAM):Stats5:Sigma_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))SIGMA_VALUE")
   field(PREC, "1")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats5:Total")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))TOTAL")
}

record(ai, "$(CAM):Stats5:Total_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))TOTAL")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats5:Net")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))NET")
}

record(ai, "$(CAM):Stats5:Net_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))NET")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats5:MinX")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))MIN_X")
}

record(ai, "$(CAM):Stats5:MinX_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))MIN_X")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats5:MinY")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))MIN_Y")
}

record(ai, "$(CAM):Stats5:MinY_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))MIN_Y")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats5:MaxX")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))MAX_X")
}

record(ai, "$(CAM):Stats5:MaxX_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))MAX_X")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats5:MaxY")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))MAX_Y")
}

record(ai, "$(CAM):Stats5:MaxY_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))MAX_Y")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

###################################################################
#  These records control whether centroid statistics are computed #
###################################################################
record(bo, "$(CAM):Stats5:ComputeCentroid")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))COMPUTE_CENTROID")
   field(VAL,  "0")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Stats5:ComputeCentroid_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))COMPUTE_CENTROID")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(ZSV,  "MINOR")
   field(OSV,  "NO_ALARM")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records contain the centroid statistics                  #
###################################################################
record(ao, "$(CAM):Stats5:CentroidThreshold")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))CENTROID_THRESHOLD")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):Stats5:CentroidThreshold_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))CENTROID_THRESHOLD")
    field(VAL,  "0")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats5:CentroidTotal")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))CENTROID_TOTAL")
}

record(ai, "$(CAM):Stats5:CentroidTotal_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))CENTROID_TOTAL")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats5:CentroidX")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))CENTROIDX_VALUE")
}

record(ai, "$(CAM):Stats5:CentroidX_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))CENTROIDX_VALUE")
   field(PREC, "1")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats5:CentroidY")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))CENTROIDY_VALUE")
}

record(ai, "$(CAM):Stats5:CentroidY_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))CENTROIDY_VALUE")
   field(PREC, "1")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats5:SigmaX")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))SIGMAX_VALUE")
}

record(ai, "$(CAM):Stats5:SigmaX_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))SIGMAX_VALUE")
   field(PREC, "1")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats5:SigmaY")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))SIGMAY_VALUE")
}

record(ai, "$(CAM):Stats5:SigmaY_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))SIGMAY_VALUE")
   field(PREC, "1")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats5:SigmaXY")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))SIGMAXY_VALUE")
}

record(ai, "$(CAM):Stats5:SigmaXY_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))SIGMAXY_VALUE")
   field(PREC, "3")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(ao, "$(CAM):Stats5:SkewX")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))SKEWX_VALUE")
}

record(ai, "$(CAM):Stats5:SkewX_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))SKEWX_VALUE")
   field(PREC, "3")
   field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats5:SkewY")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))SKEWY_VALUE")
}

record(ai, "$(CAM):Stats5:SkewY_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))SKEWY_VALUE")
   field(PREC, "3")
   field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats5:KurtosisX")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))KURTOSISX_VALUE")
}

record(ai, "$(CAM):Stats5:KurtosisX_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))KURTOSISX_VALUE")
   field(PREC, "3")
   field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats5:KurtosisY")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))KURTOSISY_VALUE")
}

record(ai, "$(CAM):Stats5:KurtosisY_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))KURTOSISY_VALUE")
   field(PREC, "3")
   field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats5:Eccentricity")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))ECCENTRICITY_VALUE")
}

record(ai, "$(CAM):Stats5:Eccentricity_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))ECCENTRICITY_VALUE")
   field(PREC, "3")
   field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats5:Orientation")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))ORIENTATION_VALUE")
}

record(ai, "$(CAM):Stats5:Orientation_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))ORIENTATION_VALUE")
   field(PREC, "3")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control time series                              #
###################################################################
record(waveform, "$(CAM):Stats5:TSMinValue")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats5_TS,0,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats5:TSMinX")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats5_TS,1,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats5:TSMinY")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats5_TS,2,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats5:TSMaxValue")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats5_TS,3,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats5:TSMaxX")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats5_TS,4,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats5:TSMaxY")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats5_TS,5,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats5:TSMeanValue")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats5_TS,6,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats5:TSSigma")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats5_TS,7,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats5:TSTotal")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats5_TS,8,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats5:TSNet")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats5_TS,9,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats5:TSCentroidTotal")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats5_TS,10,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats5:TSCentroidX")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats5_TS,11,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats5:TSCentroidY")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats5_TS,12,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats5:TSSigmaX")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats5_TS,13,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats5:TSSigmaY")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats5_TS,14,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats5:TSSigmaXY")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats5_TS,15,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats5:TSSkewX")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats5_TS,16,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats5:TSSkewY")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats5_TS,17,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats5:TSKurtosisX")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats5_TS,18,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats5:TSKurtosisY")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats5_TS,19,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats5:TSEccentricity")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats5_TS,20,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats5:TSOrientation")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats5_TS,21,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats5:TSTimestamp")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats5_TS,22,$(TIMEOUT=1))TS_TIME_SERIES")
   field(NELM, "2048")
   field(FTVL, "DOUBLE")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control profiles                                 #
###################################################################
record(bo, "$(CAM):Stats5:ComputeProfiles")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))COMPUTE_PROFILES")
   field(VAL,  "0")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Stats5:ComputeProfiles_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))COMPUTE_PROFILES")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(ZSV,  "MINOR")
   field(OSV,  "NO_ALARM")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats5:ProfileSizeX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))PROFILE_SIZE_X")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Stats5:ProfileSizeY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))PROFILE_SIZE_Y")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Stats5:CursorX")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))CURSOR_X")
   field(VAL,  "256")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Stats5:CursorX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))CURSOR_X")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Stats5:CursorY")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))CURSOR_Y")
   field(VAL,  "256")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Stats5:CursorY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))CURSOR_Y")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats5:ProfileAverageX_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))PROFILE_AVERAGE_X")
   field(FTVL, "DOUBLE")
   field(NELM, "$(XSIZE)")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats5:ProfileAverageY_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))PROFILE_AVERAGE_Y")
   field(FTVL, "DOUBLE")
   field(NELM, "$(YSIZE)")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats5:ProfileThresholdX_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))PROFILE_THRESHOLD_X")
   field(FTVL, "DOUBLE")
   field(NELM, "$(XSIZE)")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats5:ProfileThresholdY_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))PROFILE_THRESHOLD_Y")
   field(FTVL, "DOUBLE")
   field(NELM, "$(YSIZE)")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats5:ProfileCentroidX_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))PROFILE_CENTROID_X")
   field(FTVL, "DOUBLE")
   field(NELM, "$(XSIZE)")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(waveform, "$(CAM):Stats5:ProfileCentroidY_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))PROFILE_CENTROID_Y")
   field(FTVL, "DOUBLE")
   field(NELM, "$(YSIZE)")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(waveform, "$(CAM):Stats5:ProfileCursorX_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))PROFILE_CURSOR_X")
   field(FTVL, "DOUBLE")
   field(NELM, "$(XSIZE)")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}

record(waveform, "$(CAM):Stats5:ProfileCursorY_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))PROFILE_CURSOR_Y")
   field(FTVL, "DOUBLE")
   field(NELM, "$(YSIZE)")
   field(SCAN, "I/O Intr")
   field(TSE,  "-2")
}


###################################################################
#  These are used to define the histogram                         #
###################################################################
record(bo, "$(CAM):Stats5:ComputeHistogram")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))COMPUTE_HISTOGRAM")
   field(VAL,  "0")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Stats5:ComputeHistogram_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))COMPUTE_HISTOGRAM")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(ZSV,  "MINOR")
   field(OSV,  "NO_ALARM")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Stats5:HistSize")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))HIST_SIZE")
   field(VAL,  "256")
   info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Stats5:HistSize_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))HIST_SIZE")
   field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats5:HistMin")
{
   field(PINI, "YES")
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))HIST_MIN")
   field(VAL,  "0")
   info(autosaveFields, "VAL")
}

record(ai, "$(CAM):Stats5:HistMin_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))HIST_MIN")
   field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats5:HistMax")
{
   field(PINI, "YES")
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))HIST_MAX")
   field(VAL,  "255")
   info(autosaveFields, "VAL")
}

record(ai, "$(CAM):Stats5:HistMax_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))HIST_MAX")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Stats5:HistBelow")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))HIST_BELOW")
}

record(longin, "$(CAM):Stats5:HistBelow_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))HIST_BELOW")
   field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Stats5:HistAbove")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))HIST_ABOVE")
}

record(longin, "$(CAM):Stats5:HistAbove_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))HIST_ABOVE")
   field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Stats5:HistEntropy")
{
   field(DTYP, "asynFloat64")
   field(OUT,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))HIST_ENTROPY")
}

record(ai, "$(CAM):Stats5:HistEntropy_RBV")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))HIST_ENTROPY")
   field(PREC, "3")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats5:Histogram_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))HIST_ARRAY")
   field(FTVL, "DOUBLE")
   field(NELM, "256")
   field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):Stats5:HistogramX_RBV")
{
   field(DTYP, "asynFloat64ArrayIn")
   field(INP,  "@asyn(Stats5,$(ADDR=0),$(TIMEOUT=1))HIST_X_ARRAY")
   field(FTVL, "DOUBLE")
   field(NELM, "256")
   field(SCAN, "I/O Intr")
}


###################################################################
#  These records set the HOPR and LOPR values for the cursor      #
#  and size to the maximum for the input array                    #
###################################################################

record(longin, "$(CAM):Stats5:MaxSizeX")
{
    field(INP,  "$(CAM):Stats5:ProfileSizeX_RBV CP")
    field(FLNK, "$(CAM):Stats5:SetXHOPR.PROC PP")
}

record(dfanout, "$(CAM):Stats5:SetXHOPR")
{
    field(DOL,  "$(CAM):Stats5:MaxSizeX NPP")
    field(OMSL, "closed_loop")
    field(OUTA, "$(CAM):Stats5:CursorX.HOPR NPP")
}

record(longin, "$(CAM):Stats5:MaxSizeY")
{
    field(INP,  "$(CAM):Stats5:ProfileSizeY_RBV CP")
    field(FLNK, "$(CAM):Stats5:SetYHOPR.PROC PP")
}

record(dfanout, "$(CAM):Stats5:SetYHOPR")
{
    field(DOL,  "$(CAM):Stats5:MaxSizeY NPP")
    field(OMSL, "closed_loop")
    field(OUTA, "$(CAM):Stats5:CursorY.HOPR NPP")
}

###################################################################
#  These records reset the statistics                             #
###################################################################
record(sseq, "$(CAM):Stats5:Reset")
{
   field(LNK1, "$(CAM):Stats5:MinValue PP MS")    
   field(LNK2, "$(CAM):Stats5:MaxValue PP MS")    
   field(LNK3, "$(CAM):Stats5:MeanValue PP MS")    
   field(LNK4, "$(CAM):Stats5:SigmaValue PP MS")    
   field(LNK5, "$(CAM):Stats5:Total PP MS")    
   field(LNK6, "$(CAM):Stats5:Net PP MS")    
   field(LNK7, "$(CAM):Stats5:MinX PP MS")    
   field(LNK8, "$(CAM):Stats5:MinY PP MS")    
   field(LNK9, "$(CAM):Stats5:MaxX PP MS")
   field(LNKA, "$(CAM):Stats5:MaxY PP MS")    
   field(FLNK, "$(CAM):Stats5:Reset1")   
}

record(sseq, "$(CAM):Stats5:Reset1")
{
   field(LNK1, "$(CAM):Stats5:CentroidX PP MS")    
   field(LNK2, "$(CAM):Stats5:CentroidY PP MS")    
   field(LNK3, "$(CAM):Stats5:SigmaX PP MS")    
   field(LNK4, "$(CAM):Stats5:SigmaY PP MS")    
   field(LNK5, "$(CAM):Stats5:SigmaXY PP MS")    
   field(LNK6, "$(CAM):Stats5:CentroidTotal PP MS")    
   field(LNK7, "$(CAM):Stats5:SkewX PP MS")    
   field(LNK8, "$(CAM):Stats5:SkewY PP MS")    
   field(LNK9, "$(CAM):Stats5:KurtosisX PP MS")    
   field(LNKA, "$(CAM):Stats5:KurtosisY PP MS")    
   field(FLNK, "$(CAM):Stats5:Reset2")   
}

record(sseq, "$(CAM):Stats5:Reset2")
{
   field(LNK1, "$(CAM):Stats5:Eccentricity PP MS")    
   field(LNK2, "$(CAM):Stats5:Orientation PP MS")    
   field(LNK3, "$(CAM):Stats5:HistBelow PP MS")    
   field(LNK4, "$(CAM):Stats5:HistAbove PP MS")    
   field(LNK5, "$(CAM):Stats5:HistEntropy PP MS")    
}

#=================================================================#
# Template file: NDFile.template
# Database for NDFile driver, which saves files for NDArray data.
# Mark Rivers
# April 7, 2008

###################################################################
#  These records control file I/O                                 # 
###################################################################

# File path.
record(waveform, "$(CAM):TIFF1:FilePath")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))FILE_PATH")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

record(waveform, "$(CAM):TIFF1:FilePath_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))FILE_PATH")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

record(bi, "$(CAM):TIFF1:FilePathExists_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))FILE_PATH_EXISTS")
    field(ZNAM, "No")
    field(ZSV,  "MAJOR")
    field(ONAM, "Yes")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):TIFF1:CreateDirectory")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))CREATE_DIR")
    field(VAL,  "0" )
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):TIFF1:CreateDirectory_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))CREATE_DIR")
    field(VAL,  "")
    field(SCAN, "I/O Intr")
}

# Filename
record(waveform, "$(CAM):TIFF1:FileName")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))FILE_NAME")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

record(waveform, "$(CAM):TIFF1:FileName_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))FILE_NAME")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):TIFF1:FileNumber")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))FILE_NUMBER")
    field(VAL,  "1")
    info(asyn:READBACK, "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):TIFF1:FileNumber_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))FILE_NUMBER")
    field(SCAN, "I/O Intr")
}

# Autoincrement flag
record(bo, "$(CAM):TIFF1:AutoIncrement")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))AUTO_INCREMENT")
    field(VAL,  "1")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):TIFF1:AutoIncrement_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))AUTO_INCREMENT")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(SCAN, "I/O Intr")
}

# File template
record(waveform, "$(CAM):TIFF1:FileTemplate")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))FILE_TEMPLATE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

record(waveform, "$(CAM):TIFF1:FileTemplate_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))FILE_TEMPLATE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

# Full filename, including path
record(waveform, "$(CAM):TIFF1:FullFileName_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))FULL_FILE_NAME")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

# Autosave flag
record(bo, "$(CAM):TIFF1:AutoSave")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))AUTO_SAVE")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):TIFF1:AutoSave_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))AUTO_SAVE")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(SCAN, "I/O Intr")
}

# Write file
record(busy, "$(CAM):TIFF1:WriteFile")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))WRITE_FILE")
    field(ZNAM, "Done")
    field(ONAM, "Write")
}

record(bi, "$(CAM):TIFF1:WriteFile_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))WRITE_FILE")
    field(ZNAM, "Done")
    field(ZSV,  "NO_ALARM")
    field(ONAM, "Writing")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}


# Read file
record(busy, "$(CAM):TIFF1:ReadFile")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))READ_FILE")
    field(ZNAM, "Done")
    field(ONAM, "Read")
}

record(bi, "$(CAM):TIFF1:ReadFile_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))READ_FILE")
    field(ZNAM, "Done")
    field(ZSV,  "NO_ALARM")
    field(ONAM, "Reading")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

# File data format 
record(mbbo, "$(CAM):TIFF1:FileFormat")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))FILE_FORMAT")
    field(VAL,  "0")
    field(ZRST, "Undefined")
    field(ZRVL, "0")
    field(ONST, "Invalid")
    field(ONVL, "1")
    info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):TIFF1:FileFormat_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))FILE_FORMAT")
    field(ZRST, "netCDF")
    field(ZRVL, "0")
    field(ONST, "Undefined")
    field(ONVL, "1")
    field(SCAN, "I/O Intr")
}

# File save mode 
record(mbbo, "$(CAM):TIFF1:FileWriteMode")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))WRITE_MODE")
    field(VAL,  "0")
    field(ZRST, "Single")
    field(ZRVL, "0")
    field(ONST, "Capture")
    field(ONVL, "1")
    field(TWST, "Stream")
    field(TWVL, "2")
    info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):TIFF1:FileWriteMode_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))WRITE_MODE")
    field(ZRST, "Single")
    field(ZRVL, "0")
    field(ONST, "Capture")
    field(ONVL, "1")
    field(TWST, "Stream")
    field(TWVL, "2")
    field(SCAN, "I/O Intr")
}

# Capture data
record(busy, "$(CAM):TIFF1:Capture")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))CAPTURE")
    field(ZNAM, "Done")
    field(ONAM, "Capture")
    field(ZSV,  "NO_ALARM")
    field(OSV,  "NO_ALARM")
    info(autosaveFields, "OSV ZSV")
}

record(bi, "$(CAM):TIFF1:Capture_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))CAPTURE")
    field(ZNAM, "Done")
    field(ZSV,  "NO_ALARM")
    field(ONAM, "Capturing")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):TIFF1:NumCapture")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))NUM_CAPTURE")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):TIFF1:NumCapture_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))NUM_CAPTURE")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):TIFF1:NumCaptured_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))NUM_CAPTURED")
    field(SCAN, "I/O Intr")
}

# Delete driver file flag
record(bo, "$(CAM):TIFF1:DeleteDriverFile")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))DELETE_DRIVER_FILE")
    field(VAL,  "0")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):TIFF1:DeleteDriverFile_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))DELETE_DRIVER_FILE")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(SCAN, "I/O Intr")
}

record(bi, "$(CAM):TIFF1:WriteStatus")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))WRITE_STATUS")
    field(ZNAM, "Write OK")
    field(ZSV,  "NO_ALARM")
    field(ONAM, "Write error")
    field(OSV,  "MAJOR")
    field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):TIFF1:WriteMessage")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))WRITE_MESSAGE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):TIFF1:LazyOpen")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))FILE_LAZY_OPEN")
    field(VAL,  "0")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):TIFF1:LazyOpen_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))FILE_LAZY_OPEN")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(SCAN, "I/O Intr")
}

record(stringout, "$(CAM):TIFF1:TempSuffix")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(OUT,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))FILE_TEMP_SUFFIX")
    field(VAL,  "")
}

record(stringin, "$(CAM):TIFF1:TempSuffix_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))FILE_TEMP_SUFFIX")
    field(VAL,  "")
    field(SCAN, "I/O Intr")
}
# Database to add automatic reset of FileNumber on changes
# to FilePath, FileTemplate, or FileName

# Add FLNKS to ResetFileNumber
record(waveform, "$(CAM):TIFF1:FilePath")
{
    field(FLNK, "$(CAM):TIFF1:ResetFileNumber" )
}
record(waveform, "$(CAM):TIFF1:FileName")
{
    field(FLNK, "$(CAM):TIFF1:ResetFileNumber" )
}
record(waveform, "$(CAM):TIFF1:FileTemplate")
{
    field(FLNK, "$(CAM):TIFF1:ResetFileNumber" )
}

# AutoFileNumberReset flag
record(bo, "$(CAM):TIFF1:AutoFileNumberReset")
{
    field(PINI, "YES")
    field(VAL,  "1")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info( autosaveFields, "VAL" )
}

record(calcout, "$(CAM):TIFF1:ResetFileNumber")
{
    field(INPA, "$(CAM):TIFF1:AutoFileNumberReset NPP")
    field(CALC, "A")
    field(OOPT, "When Non-zero" )
    field(OUT,  "$(CAM):TIFF1:FileNumber PP")
}
#=================================================================#
# Template file: NDFileTIFF.template
# Database for NDFileTIFF driver, which saves NDArray data 
# in the TIFF file format
# Mark Rivers
# May 10, 2009

#=================================================================#
# Template file: NDFile.template
# Database for NDFile driver, which saves files for NDArray data.
# Mark Rivers
# April 7, 2008

###################################################################
#  These records control file I/O                                 # 
###################################################################

# File path.
record(waveform, "$(CAM):TIFF1:FilePath")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))FILE_PATH")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

record(waveform, "$(CAM):TIFF1:FilePath_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))FILE_PATH")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

record(bi, "$(CAM):TIFF1:FilePathExists_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))FILE_PATH_EXISTS")
    field(ZNAM, "No")
    field(ZSV,  "MAJOR")
    field(ONAM, "Yes")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):TIFF1:CreateDirectory")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))CREATE_DIR")
    field(VAL,  "0" )
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):TIFF1:CreateDirectory_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))CREATE_DIR")
    field(VAL,  "")
    field(SCAN, "I/O Intr")
}

# Filename
record(waveform, "$(CAM):TIFF1:FileName")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))FILE_NAME")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

record(waveform, "$(CAM):TIFF1:FileName_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))FILE_NAME")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):TIFF1:FileNumber")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))FILE_NUMBER")
    field(VAL,  "1")
    info(asyn:READBACK, "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):TIFF1:FileNumber_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))FILE_NUMBER")
    field(SCAN, "I/O Intr")
}

# Autoincrement flag
record(bo, "$(CAM):TIFF1:AutoIncrement")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))AUTO_INCREMENT")
    field(VAL,  "1")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):TIFF1:AutoIncrement_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))AUTO_INCREMENT")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(SCAN, "I/O Intr")
}

# File template
record(waveform, "$(CAM):TIFF1:FileTemplate")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))FILE_TEMPLATE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

record(waveform, "$(CAM):TIFF1:FileTemplate_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))FILE_TEMPLATE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

# Full filename, including path
record(waveform, "$(CAM):TIFF1:FullFileName_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))FULL_FILE_NAME")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

# Autosave flag
record(bo, "$(CAM):TIFF1:AutoSave")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))AUTO_SAVE")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):TIFF1:AutoSave_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))AUTO_SAVE")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(SCAN, "I/O Intr")
}

# Write file
record(busy, "$(CAM):TIFF1:WriteFile")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))WRITE_FILE")
    field(ZNAM, "Done")
    field(ONAM, "Write")
}

record(bi, "$(CAM):TIFF1:WriteFile_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))WRITE_FILE")
    field(ZNAM, "Done")
    field(ZSV,  "NO_ALARM")
    field(ONAM, "Writing")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}


# Read file
record(busy, "$(CAM):TIFF1:ReadFile")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))READ_FILE")
    field(ZNAM, "Done")
    field(ONAM, "Read")
}

record(bi, "$(CAM):TIFF1:ReadFile_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))READ_FILE")
    field(ZNAM, "Done")
    field(ZSV,  "NO_ALARM")
    field(ONAM, "Reading")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

# File data format 
record(mbbo, "$(CAM):TIFF1:FileFormat")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))FILE_FORMAT")
    field(VAL,  "0")
    field(ZRST, "Undefined")
    field(ZRVL, "0")
    field(ONST, "Invalid")
    field(ONVL, "1")
    info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):TIFF1:FileFormat_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))FILE_FORMAT")
    field(ZRST, "netCDF")
    field(ZRVL, "0")
    field(ONST, "Undefined")
    field(ONVL, "1")
    field(SCAN, "I/O Intr")
}

# File save mode 
record(mbbo, "$(CAM):TIFF1:FileWriteMode")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))WRITE_MODE")
    field(VAL,  "0")
    field(ZRST, "Single")
    field(ZRVL, "0")
    field(ONST, "Capture")
    field(ONVL, "1")
    field(TWST, "Stream")
    field(TWVL, "2")
    info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):TIFF1:FileWriteMode_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))WRITE_MODE")
    field(ZRST, "Single")
    field(ZRVL, "0")
    field(ONST, "Capture")
    field(ONVL, "1")
    field(TWST, "Stream")
    field(TWVL, "2")
    field(SCAN, "I/O Intr")
}

# Capture data
record(busy, "$(CAM):TIFF1:Capture")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))CAPTURE")
    field(ZNAM, "Done")
    field(ONAM, "Capture")
    field(ZSV,  "NO_ALARM")
    field(OSV,  "NO_ALARM")
    info(autosaveFields, "OSV ZSV")
}

record(bi, "$(CAM):TIFF1:Capture_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))CAPTURE")
    field(ZNAM, "Done")
    field(ZSV,  "NO_ALARM")
    field(ONAM, "Capturing")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):TIFF1:NumCapture")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))NUM_CAPTURE")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):TIFF1:NumCapture_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))NUM_CAPTURE")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):TIFF1:NumCaptured_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))NUM_CAPTURED")
    field(SCAN, "I/O Intr")
}

# Delete driver file flag
record(bo, "$(CAM):TIFF1:DeleteDriverFile")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))DELETE_DRIVER_FILE")
    field(VAL,  "0")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):TIFF1:DeleteDriverFile_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))DELETE_DRIVER_FILE")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(SCAN, "I/O Intr")
}

record(bi, "$(CAM):TIFF1:WriteStatus")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))WRITE_STATUS")
    field(ZNAM, "Write OK")
    field(ZSV,  "NO_ALARM")
    field(ONAM, "Write error")
    field(OSV,  "MAJOR")
    field(SCAN, "I/O Intr")
}

record(waveform, "$(CAM):TIFF1:WriteMessage")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))WRITE_MESSAGE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

record(bo, "$(CAM):TIFF1:LazyOpen")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))FILE_LAZY_OPEN")
    field(VAL,  "0")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):TIFF1:LazyOpen_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))FILE_LAZY_OPEN")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(SCAN, "I/O Intr")
}

record(stringout, "$(CAM):TIFF1:TempSuffix")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(OUT,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))FILE_TEMP_SUFFIX")
    field(VAL,  "")
}

record(stringin, "$(CAM):TIFF1:TempSuffix_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))FILE_TEMP_SUFFIX")
    field(VAL,  "")
    field(SCAN, "I/O Intr")
}
#=================================================================#
# Template file: NDPluginBase.template
# Database for NDPluginBase, i.e. records common to all plugins
# Mark Rivers
# April 25, 2008

#=================================================================#
# Template file: NDArrayBase.template
# Database for area detector control using asyn driver and standard asyn device support
# Mark Rivers
# March 9, 2008

###################################################################
#  This record contains the version of ADCore                     #
###################################################################

record(stringin, "$(CAM):TIFF1:ADCoreVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))ADCORE_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the version of the driver or plugin       #
###################################################################

record(stringin, "$(CAM):TIFF1:DriverVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))DRIVER_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the asyn port name of this detector       #
###################################################################

record(stringin, "$(CAM):TIFF1:PortName_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))PORT_NAME_SELF")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records contain basic information about the detector     # 
###################################################################

record(stringin, "$(CAM):TIFF1:Manufacturer_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))MANUFACTURER")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):TIFF1:Model_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))MODEL")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):TIFF1:SerialNumber_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))SERIAL_NUMBER")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):TIFF1:SDKVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))SDK_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):TIFF1:FirmwareVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))FIRMWARE_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control acquisition start and stop               #
###################################################################

record(bo, "$(CAM):TIFF1:Acquire") {
   field(DTYP, "asynInt32")
   field(OUT, "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))ACQUIRE")
   field(ZNAM, "Done")
   field(ONAM, "Acquire")
   field(VAL,  "0")
   field(FLNK, "$(CAM):TIFF1:SetAcquireBusy")
   info(asyn:READBACK, "1")
}

record(bi, "$(CAM):TIFF1:Acquire_RBV") {
   field(DTYP, "asynInt32")
   field(INP, "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))ACQUIRE")
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):TIFF1:SetAcquireBusy")
{
    field(INPA, "$(CAM):TIFF1:Acquire NPP")
    field(CALC, "A")
    field(OOPT, "Transition To Non-zero")
    field(OUT,  "$(CAM):TIFF1:AcquireBusy PP")
}

record(busy, "$(CAM):TIFF1:AcquireBusy") {
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(VAL,  "0")
}

record(bi, "$(CAM):TIFF1:AcquireBusyCB") {
   field(DTYP, "asynInt32")
   field(INP, "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))ACQUIRE_BUSY")
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):TIFF1:ClearAcquireBusy") {
    field(INPA, "$(CAM):TIFF1:AcquireBusyCB CP")
    field(CALC, "A")
    field(OOPT, "Transition To Zero")
    field(OUT,  "$(CAM):TIFF1:AcquireBusy PP")
}

record(bo, "$(CAM):TIFF1:WaitForPlugins") {
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT, "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))WAIT_FOR_PLUGINS")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(VAL,  "0")
}

###################################################################
#  These records are the array size and data type                 #
###################################################################
# The number of dimensions
record(longout, "$(CAM):TIFF1:NDimensions")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))ARRAY_NDIMENSIONS")
}

record(longin, "$(CAM):TIFF1:NDimensions_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))ARRAY_NDIMENSIONS")
    field(SCAN, "I/O Intr")
}

# The array dimensions waveform records
record(waveform, "$(CAM):TIFF1:Dimensions")
{
    field(DTYP, "asynInt32ArrayOut")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))ARRAY_DIMENSIONS")
    field(FTVL, "LONG")
    field(NELM, "10")
    field(FLNK, "$(CAM):TIFF1:Dim0SA")
}

record(subArray, "$(CAM):TIFF1:Dim0SA")
{
    field(INP,  "$(CAM):TIFF1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "0")
    field(FLNK, "$(CAM):TIFF1:ArraySize0")
}

record(longin, "$(CAM):TIFF1:ArraySize0")
{
    field(INP,  "$(CAM):TIFF1:Dim0SA")
    field(FLNK, "$(CAM):TIFF1:Dim1SA")
}

record(subArray, "$(CAM):TIFF1:Dim1SA")
{
    field(INP,  "$(CAM):TIFF1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "1")
    field(FLNK, "$(CAM):TIFF1:ArraySize1")
}

record(longin, "$(CAM):TIFF1:ArraySize1")
{
    field(INP,  "$(CAM):TIFF1:Dim1SA")
    field(FLNK, "$(CAM):TIFF1:Dim2SA")
}

record(subArray, "$(CAM):TIFF1:Dim2SA")
{
    field(INP,  "$(CAM):TIFF1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "2")
    field(FLNK, "$(CAM):TIFF1:ArraySize2")
}

record(longin, "$(CAM):TIFF1:ArraySize2")
{
    field(INP,  "$(CAM):TIFF1:Dim2SA")
    field(FLNK, "$(CAM):TIFF1:Dim3SA")
}

record(subArray, "$(CAM):TIFF1:Dim3SA")
{
    field(INP,  "$(CAM):TIFF1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "3")
    field(FLNK, "$(CAM):TIFF1:ArraySize3")
}

record(longin, "$(CAM):TIFF1:ArraySize3")
{
    field(INP,  "$(CAM):TIFF1:Dim3SA")
    field(FLNK, "$(CAM):TIFF1:Dim4SA")
}

record(subArray, "$(CAM):TIFF1:Dim4SA")
{
    field(INP,  "$(CAM):TIFF1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "4")
    field(FLNK, "$(CAM):TIFF1:ArraySize4")
}

record(longin, "$(CAM):TIFF1:ArraySize4")
{
    field(INP,  "$(CAM):TIFF1:Dim4SA")
    field(FLNK, "$(CAM):TIFF1:Dim5SA")
}

record(subArray, "$(CAM):TIFF1:Dim5SA")
{
    field(INP,  "$(CAM):TIFF1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "5")
    field(FLNK, "$(CAM):TIFF1:ArraySize5")
}

record(longin, "$(CAM):TIFF1:ArraySize5")
{
    field(INP,  "$(CAM):TIFF1:Dim5SA")
    field(FLNK, "$(CAM):TIFF1:Dim6SA")
}

record(subArray, "$(CAM):TIFF1:Dim6SA")
{
    field(INP,  "$(CAM):TIFF1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "6")
    field(FLNK, "$(CAM):TIFF1:ArraySize6")
}

record(longin, "$(CAM):TIFF1:ArraySize6")
{
    field(INP,  "$(CAM):TIFF1:Dim6SA")
    field(FLNK, "$(CAM):TIFF1:Dim7SA")
}

record(subArray, "$(CAM):TIFF1:Dim7SA")
{
    field(INP,  "$(CAM):TIFF1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "7")
    field(FLNK, "$(CAM):TIFF1:ArraySize7")
}

record(longin, "$(CAM):TIFF1:ArraySize7")
{
    field(INP,  "$(CAM):TIFF1:Dim7SA")
    field(FLNK, "$(CAM):TIFF1:Dim8SA")
}

record(subArray, "$(CAM):TIFF1:Dim8SA")
{
    field(INP,  "$(CAM):TIFF1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "8")
    field(FLNK, "$(CAM):TIFF1:ArraySize8")
}

record(longin, "$(CAM):TIFF1:ArraySize8")
{
    field(INP,  "$(CAM):TIFF1:Dim8SA")
    field(FLNK, "$(CAM):TIFF1:Dim9SA")
}

record(subArray, "$(CAM):TIFF1:Dim9SA")
{
    field(INP,  "$(CAM):TIFF1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "9")
    field(FLNK, "$(CAM):TIFF1:ArraySize9")
}

record(longin, "$(CAM):TIFF1:ArraySize9")
{
    field(INP,  "$(CAM):TIFF1:Dim9SA")
}


record(waveform, "$(CAM):TIFF1:Dimensions_RBV")
{
    field(DTYP, "asynInt32ArrayIn")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))ARRAY_DIMENSIONS")
    field(FTVL, "LONG")
    field(NELM, "10")
    field(FLNK, "$(CAM):TIFF1:Dim0SA_RBV")
    field(SCAN, "I/O Intr")
}

record(subArray, "$(CAM):TIFF1:Dim0SA_RBV")
{
    field(INP,  "$(CAM):TIFF1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "0")
    field(FLNK, "$(CAM):TIFF1:ArraySize0_RBV")
}

record(longin, "$(CAM):TIFF1:ArraySize0_RBV")
{
    field(INP,  "$(CAM):TIFF1:Dim0SA_RBV")
    field(FLNK, "$(CAM):TIFF1:Dim1SA_RBV")
}

record(subArray, "$(CAM):TIFF1:Dim1SA_RBV")
{
    field(INP,  "$(CAM):TIFF1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "1")
    field(FLNK, "$(CAM):TIFF1:ArraySize1_RBV")
}

record(longin, "$(CAM):TIFF1:ArraySize1_RBV")
{
    field(INP,  "$(CAM):TIFF1:Dim1SA_RBV")
    field(FLNK, "$(CAM):TIFF1:Dim2SA_RBV")
}

record(subArray, "$(CAM):TIFF1:Dim2SA_RBV")
{
    field(INP,  "$(CAM):TIFF1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "2")
    field(FLNK, "$(CAM):TIFF1:ArraySize2_RBV")
}

record(longin, "$(CAM):TIFF1:ArraySize2_RBV")
{
    field(INP,  "$(CAM):TIFF1:Dim2SA_RBV")
    field(FLNK, "$(CAM):TIFF1:Dim3SA_RBV")
}

record(subArray, "$(CAM):TIFF1:Dim3SA_RBV")
{
    field(INP,  "$(CAM):TIFF1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "3")
    field(FLNK, "$(CAM):TIFF1:ArraySize3_RBV")
}

record(longin, "$(CAM):TIFF1:ArraySize3_RBV")
{
    field(INP,  "$(CAM):TIFF1:Dim3SA_RBV")
    field(FLNK, "$(CAM):TIFF1:Dim4SA_RBV")
}

record(subArray, "$(CAM):TIFF1:Dim4SA_RBV")
{
    field(INP,  "$(CAM):TIFF1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "4")
    field(FLNK, "$(CAM):TIFF1:ArraySize4_RBV")
}

record(longin, "$(CAM):TIFF1:ArraySize4_RBV")
{
    field(INP,  "$(CAM):TIFF1:Dim4SA_RBV")
    field(FLNK, "$(CAM):TIFF1:Dim5SA_RBV")
}

record(subArray, "$(CAM):TIFF1:Dim5SA_RBV")
{
    field(INP,  "$(CAM):TIFF1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "5")
    field(FLNK, "$(CAM):TIFF1:ArraySize5_RBV")
}

record(longin, "$(CAM):TIFF1:ArraySize5_RBV")
{
    field(INP,  "$(CAM):TIFF1:Dim5SA_RBV")
    field(FLNK, "$(CAM):TIFF1:Dim6SA_RBV")
}

record(subArray, "$(CAM):TIFF1:Dim6SA_RBV")
{
    field(INP,  "$(CAM):TIFF1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "6")
    field(FLNK, "$(CAM):TIFF1:ArraySize6_RBV")
}

record(longin, "$(CAM):TIFF1:ArraySize6_RBV")
{
    field(INP,  "$(CAM):TIFF1:Dim6SA_RBV")
    field(FLNK, "$(CAM):TIFF1:Dim7SA_RBV")
}

record(subArray, "$(CAM):TIFF1:Dim7SA_RBV")
{
    field(INP,  "$(CAM):TIFF1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "7")
    field(FLNK, "$(CAM):TIFF1:ArraySize7_RBV")
}

record(longin, "$(CAM):TIFF1:ArraySize7_RBV")
{
    field(INP,  "$(CAM):TIFF1:Dim7SA_RBV")
    field(FLNK, "$(CAM):TIFF1:Dim8SA_RBV")
}

record(subArray, "$(CAM):TIFF1:Dim8SA_RBV")
{
    field(INP,  "$(CAM):TIFF1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "8")
    field(FLNK, "$(CAM):TIFF1:ArraySize8_RBV")
}

record(longin, "$(CAM):TIFF1:ArraySize8_RBV")
{
    field(INP,  "$(CAM):TIFF1:Dim8SA_RBV")
    field(FLNK, "$(CAM):TIFF1:Dim9SA_RBV")
}

record(subArray, "$(CAM):TIFF1:Dim9SA_RBV")
{
    field(INP,  "$(CAM):TIFF1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "9")
    field(FLNK, "$(CAM):TIFF1:ArraySize9_RBV")
}

record(longin, "$(CAM):TIFF1:ArraySize9_RBV")
{
    field(INP,  "$(CAM):TIFF1:Dim9SA_RBV")
}


record(mbbi, "$(CAM):TIFF1:BayerPattern_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))BAYER_PATTERN")
   field(ZRST, "RGGB")
   field(ZRVL, "0")
   field(ONST, "GBRG")
   field(ONVL, "1")
   field(TWST, "GRBG")
   field(TWVL, "2")
   field(THST, "BGGR")
   field(THVL, "3")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):TIFF1:ArraySizeX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_X")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):TIFF1:ArraySizeY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_Y")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):TIFF1:ArraySizeZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_Z")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):TIFF1:ArraySize_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records have information on the compression              # 
###################################################################
record(stringin, "$(CAM):TIFF1:Codec_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))CODEC")
   field(VAL,  "")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):TIFF1:CompressedSize_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))COMPRESSED_SIZE")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the data type                            # 
###################################################################

record(mbbo, "$(CAM):TIFF1:DataType")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))DATA_TYPE")
   field(ZRST, "Int8")
   field(ZRVL, "0")
   field(ONST, "UInt8")
   field(ONVL, "1")
   field(TWST, "Int16")
   field(TWVL, "2")
   field(THST, "UInt16")
   field(THVL, "3")
   field(FRST, "Int32")
   field(FRVL, "4")
   field(FVST, "UInt32")
   field(FVVL, "5")
   field(SXST, "Int64")
   field(SXVL, "6")
   field(SVST, "UInt64")
   field(SVVL, "7")
   field(EIST, "Float32")
   field(EIVL, "8")
   field(NIST, "Float64")
   field(NIVL, "9")
   field(VAL,  "0")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):TIFF1:DataType_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))DATA_TYPE")
   field(ZRST, "Int8")
   field(ZRVL, "0")
   field(ONST, "UInt8")
   field(ONVL, "1")
   field(TWST, "Int16")
   field(TWVL, "2")
   field(THST, "UInt16")
   field(THVL, "3")
   field(FRST, "Int32")
   field(FRVL, "4")
   field(FVST, "UInt32")
   field(FVVL, "5")
   field(SXST, "Int64")
   field(SXVL, "6")
   field(SVST, "UInt64")
   field(SVVL, "7")
   field(EIST, "Float32")
   field(EIVL, "8")
   field(NIST, "Float64")
   field(NIVL, "9")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):TIFF1:BitsPerPixel_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))BITS_PER_PIXEL")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the color mode                           #
#  These choices must agree with NDColorMode_t in NDArray.h       # 
###################################################################

record(mbbo, "$(CAM):TIFF1:ColorMode")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))COLOR_MODE")
   field(ZRST, "Mono")
   field(ZRVL, "0")
   field(ONST, "Bayer")
   field(ONVL, "1")
   field(TWST, "RGB1")
   field(TWVL, "2")
   field(THST, "RGB2")
   field(THVL, "3")
   field(FRST, "RGB3")
   field(FRVL, "4")
   field(FVST, "YUV444")
   field(FVVL, "5")
   field(SXST, "YUV422")
   field(SXVL, "6")
   field(SVST, "YUV421")
   field(SVVL, "7")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):TIFF1:ColorMode_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))COLOR_MODE")
   field(ZRST, "Mono")
   field(ZRVL, "0")
   field(ONST, "Bayer")
   field(ONVL, "1")
   field(TWST, "RGB1")
   field(TWVL, "2")
   field(THST, "RGB2")
   field(THVL, "3")
   field(FRST, "RGB3")
   field(FRVL, "4")
   field(FVST, "YUV444")
   field(FVVL, "5")
   field(SXST, "YUV422")
   field(SXVL, "6")
   field(SVST, "YUV421")
   field(SVVL, "7")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records are the uniqueId and time stamps of the array     #
###################################################################
record(longin, "$(CAM):TIFF1:UniqueId_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))UNIQUE_ID")
    field(SCAN, "I/O Intr")
}

record(ai, "$(CAM):TIFF1:TimeStamp_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))TIME_STAMP")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):TIFF1:EpicsTSSec_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))EPICS_TS_SEC")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):TIFF1:EpicsTSNsec_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))EPICS_TS_NSEC")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records provide statistics on array callbacks and        #
#  array callback rates                                           # 
###################################################################
record(longout, "$(CAM):TIFF1:ArrayCounter")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))ARRAY_COUNTER")
}

record(longin, "$(CAM):TIFF1:ArrayCounter_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))ARRAY_COUNTER")
    field(SCAN, "I/O Intr")
    field(TSE,  "-2")
    field(LOW,  "0" )
    field(LSV,  "MINOR" )
    info(autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV TSE")
}

# Updated rate calculation to use a smoothing factor w/ guard against negative values
# 0 rate sets alarm state to MINOR
record(calc, "$(CAM):TIFF1:ArrayRate_RBV")
{
    field(INPA, "$(CAM):TIFF1:ArrayRate_RBV.LB NPP NMS")   # Previous counter (Last B value)
    field(INPB, "$(CAM):TIFF1:ArrayCounter_RBV NPP NMS")   # Current counter value
    field(INPC, "1.0")                                # Delta time in seconds
    field(INPD, "$(CAM):TIFF1:ArrayRate_RBV.VAL NPP NMS")  # Previous rate
    field(INPE, "0.0")                 # Smoothing factor
    field(CALC, "(D*E)/C+MAX(0,B-A)*(1-E)/C")
    field(PREC, "2" )
    field(EGU,  "Hz" )
    field(SCAN, "1 second")
    field(LOW,  "0")
    field(LSV,  "MINOR")
    field(ADEL, "0.1")
    info(autosaveFields, "ADEL DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV MDEL PREC C E SCAN EGU")
}

###################################################################
#  These records control NDArray callacks                         # 
###################################################################
record(bo, "$(CAM):TIFF1:ArrayCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))ARRAY_CALLBACKS")
    field(ZNAM, "Disable")
    field(ZSV,  "MINOR")
    field(ONAM, "Enable")
    field(OSV,  "NO_ALARM")
    field(VAL, "1")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):TIFF1:ArrayCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))ARRAY_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ZSV,  "MINOR")
    field(ONAM, "Enabled")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains macro definitions for the attributes      # 
###################################################################

record(waveform, "$(CAM):TIFF1:NDAttributesMacros")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_MACROS")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

###################################################################
#  This record is the name of a file defining attributes          # 
###################################################################

record(waveform, "$(CAM):TIFF1:NDAttributesFile")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_FILE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

###################################################################
#  This record defines the status of reading attributes file      # 
###################################################################

record(mbbi, "$(CAM):TIFF1:NDAttributesStatus")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_STATUS")
    field(ZRVL, "0")
    field(ZRST, "Attributes file OK")
    field(ZRSV, "NO_ALARM")
    field(ONVL, "1")
    field(ONST, "File not found")
    field(ONSV, "MINOR")
    field(TWVL, "2")
    field(TWST, "XML syntax error")
    field(TWSV, "MAJOR")
    field(THVL, "3")
    field(THST, "Macro substitution error")
    field(THSV, "MAJOR")
    field(SCAN, "I/O Intr")
}

###################################################################
#  Status of NDArrayPool - number of buffers, memory used etc.    # 
###################################################################

record(ai, "$(CAM):TIFF1:PoolMaxMem")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))POOL_MAX_MEMORY")
   field(PREC, "1")
   field(EGU,  "MB")
   field(SCAN, "Passive")
   field(PINI, "YES")
}

record(ai, "$(CAM):TIFF1:PoolUsedMem")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))POOL_USED_MEMORY")
   field(PREC, "1")
   field(EGU,  "MB")
   field(SCAN, "1 second")
   field(FLNK, "$(CAM):TIFF1:PoolAllocBuffers")
   info(autosaveFields, "SCAN")
}

record(longin, "$(CAM):TIFF1:PoolAllocBuffers")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))POOL_ALLOC_BUFFERS")
   field(FLNK, "$(CAM):TIFF1:PoolFreeBuffers")
}

record(longin, "$(CAM):TIFF1:PoolFreeBuffers")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))POOL_FREE_BUFFERS")
   field(FLNK, "$(CAM):TIFF1:PoolUsedBuffers")
}

record(calc, "$(CAM):TIFF1:PoolUsedBuffers")
{
    field(INPA, "$(CAM):TIFF1:PoolAllocBuffers NPP MS")
    field(INPB, "$(CAM):TIFF1:PoolFreeBuffers NPP MS")
    field(CALC, "A-B")
}

record(bo, "$(CAM):TIFF1:EmptyFreeList")
{
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))POOL_EMPTY_FREELIST")
}

record(longin, "$(CAM):TIFF1:NumQueuedArrays")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))NUM_QUEUED_ARRAYS")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the type of plugin                        #
###################################################################

record(stringin, "$(CAM):TIFF1:PluginType_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))PLUGIN_TYPE")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the connection of the server to          #
#  an NDArray driver port and address                             #
###################################################################
# Array port name
record(stringout, "$(CAM):TIFF1:NDArrayPort")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(OUT,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))NDARRAY_PORT")
    field(VAL,  "$(CAM_PORT)")
    info(autosaveFields, "DESC VAL")
}

record(stringin, "$(CAM):TIFF1:NDArrayPort_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))NDARRAY_PORT")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):TIFF1:NDArrayAddress")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))NDARRAY_ADDR")
    field(VAL,  "$(NDARRAY_ADDR=0)")
    info(autosaveFields, "DESC VAL")
}

record(longin, "$(CAM):TIFF1:NDArrayAddress_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))NDARRAY_ADDR")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control whether callbacks are enabled and        #
#  minimum time between callbacks                                 #
###################################################################
record(bo, "$(CAM):TIFF1:EnableCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))ENABLE_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    field(VAL,  "0")
    info(autosaveFields, "DESC VAL")
}

record(bi, "$(CAM):TIFF1:EnableCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))ENABLE_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    field(ZSV,  "MINOR")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):TIFF1:MinCallbackTime")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))MIN_CALLBACK_TIME")
    field(EGU,  "s")
    field(PREC, "3")
    field(VAL,  "0.0")
    field(DRVL, "0")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):TIFF1:MinCallbackTime_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))MIN_CALLBACK_TIME")
    field(EGU,  "s")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):TIFF1:MaxArrayRate")
{
    field(DTYP, "Soft Channel")
    field(OUT,  "$(CAM):TIFF1:MaxArrayRate_COUT PP")
    field(EGU,  "Hz")
    field(PREC, "3")
    field(VAL,  "0.0")
    info(autosaveFields, "VAL")
}

record(calcout, "$(CAM):TIFF1:MaxArrayRate_COUT")
{
    field(INPA, "$(CAM):TIFF1:MaxArrayRate")
    field(CALC, "A=0?0:1.0/A")
    field(OUT,  "$(CAM):TIFF1:MinCallbackTime PP")
}

record(calc, "$(CAM):TIFF1:MaxArrayRate_RBV")
{
    field(INPA, "$(CAM):TIFF1:MinCallbackTime_RBV CP")
    field(CALC, "A=0?0:1.0/A")
    field(EGU,  "Hz")
    field(PREC, "3")
    field(SCAN, "Passive")
}

record(ao, "$(CAM):TIFF1:MaxByteRate")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))MAX_BYTE_RATE")
    field(EGU,  "s")
    field(PREC, "3")
    field(VAL,  "0.0")
    field(DRVL, "0")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):TIFF1:MaxByteRate_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))MAX_BYTE_RATE")
    field(EGU,  "s")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the last execution time of the plugin     #
###################################################################
record(ai, "$(CAM):TIFF1:ExecutionTime_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))EXECUTION_TIME")
    field(EGU,  "ms")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record requests that the plugin execute again with the    #
#  same NDArray                                                   #
###################################################################
record(bo, "$(CAM):TIFF1:ProcessPlugin")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))PROCESS_PLUGIN")
    field(VAL,  "1")
}

###################################################################
#  These records control whether callbacks block or not           #
###################################################################
record(bo, "$(CAM):TIFF1:BlockingCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))BLOCKING_CALLBACKS")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(VAL,  "0")
    info(autosaveFields, "DESC ZSV OSV VAL")
}

record(bi, "$(CAM):TIFF1:BlockingCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))BLOCKING_CALLBACKS")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(ZSV,  "NO_ALARM")
    field(OSV,  "MINOR")
    field(SCAN, "I/O Intr")
    info( autosaveFields, "DESC ZSV OSV" )
}


record(longout, "$(CAM):TIFF1:DroppedArrays")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))DROPPED_ARRAYS")
    field(VAL,  "0")
    info( autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV EGU" )
}

record(longin, "$(CAM):TIFF1:DroppedArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))DROPPED_ARRAYS")
    field(SCAN, "I/O Intr")
    field(HIGH, "1")
    field(HSV,  "MINOR")
    info( autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV EGU" )
}

record(longout, "$(CAM):TIFF1:QueueSize")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))QUEUE_SIZE")
    field(PINI, "YES")
    info( autosaveFields, "DESC EGU" )
}

record(longin, "$(CAM):TIFF1:QueueSize_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))QUEUE_SIZE")
    field(FLNK, "$(CAM):TIFF1:QueueFreeLow")
    field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):TIFF1:QueueFreeLow") {
    field(CALC, "A*0.25")
    field(INPA, "$(CAM):TIFF1:QueueSize")
    field(OUT,  "$(CAM):TIFF1:QueueFree.LOW")
    field(FLNK, "$(CAM):TIFF1:QueueUseHIGH")
}

# Set a HIGH warning level for the input queue fill level to 75%
# of the full size of the queue
record(calcout, "$(CAM):TIFF1:QueueUseHIGH") {
   field(CALC, "A*0.75")
   field(INPA, "$(CAM):TIFF1:QueueSize")
   field(OUT,  "$(CAM):TIFF1:QueueUse.HIGH")
   field(FLNK, "$(CAM):TIFF1:QueueUseHIHI")
}

# Set a HIHI level for the input queue fill level to indicate an error
# (MAJOR alarm)  when it fills up to the full size of the queue (frames start dropping)
record(calcout, "$(CAM):TIFF1:QueueUseHIHI") {
   field(CALC, "A*1.0")
   field(INPA, "$(CAM):TIFF1:QueueSize")
   field(OUT,  "$(CAM):TIFF1:QueueUse.HIHI")
}

record(longin, "$(CAM):TIFF1:QueueFree")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))QUEUE_FREE")
    field(LLSV, "MAJOR")
    field(LSV,  "MINOR")
    field(LOLO, "0")
    field(HYST, "1")
    field(SCAN, "I/O Intr")
}

# Display the fill level on the plugins input queue
record(calc, "$(CAM):TIFF1:QueueUse") {
    field(CALC, "A-B")
    field(INPA, "$(CAM):TIFF1:QueueSize")
    field(INPB, "$(CAM):TIFF1:QueueFree CP")
    field(SCAN, "Passive")
    field(HHSV, "MAJOR")
    field(HSV,  "MINOR")
    field(HYST, "1")
}

record(longout, "$(CAM):TIFF1:NumThreads")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))NUM_THREADS")
    field(VAL,  "1")
    field(PINI, "YES")
    info(autosaveFields, "DESC VAL")
}

record(longin, "$(CAM):TIFF1:NumThreads_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))NUM_THREADS")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):TIFF1:MaxThreads_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))MAX_THREADS")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control output array sorting                     #
###################################################################
record(mbbo, "$(CAM):TIFF1:SortMode") {
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))SORT_MODE")
    field(ZRVL, "0")
    field(ZRST, "Unsorted")
    field(ONVL, "1")
    field(ONST, "Sorted")
}

record(mbbi, "$(CAM):TIFF1:SortMode_RBV") {
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))SORT_MODE")
    field(ZRVL, "0")
    field(ZRST, "Unsorted")
    field(ONVL, "1")
    field(ONST, "Sorted")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):TIFF1:SortTime") {
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))SORT_TIME")
    field(PREC, "3")
    field(VAL, "0.1")
}

record(ai, "$(CAM):TIFF1:SortTime_RBV") {
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))SORT_TIME")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):TIFF1:SortSize")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))SORT_SIZE")
    field(VAL,  "20")
    field(PINI, "YES")
}

record(longin, "$(CAM):TIFF1:SortSize_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))SORT_SIZE")
    field(FLNK, "$(CAM):TIFF1:SortFreeLow")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):TIFF1:SortFree") {
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))SORT_FREE")
    field(LLSV, "MAJOR")
    field(LSV,  "MINOR")
    field(LOLO, "0")
    field(HYST, "1")
    field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):TIFF1:SortFreeLow") {
    field(CALC, "A*0.25")
    field(INPA, "$(CAM):TIFF1:SortSize")
    field(OUT,  "$(CAM):TIFF1:SortFree.LOW")
}

record(longout, "$(CAM):TIFF1:DroppedOutputArrays")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))DROPPED_OUTPUT_ARRAYS")
    field(VAL,  "0")
}

record(longin, "$(CAM):TIFF1:DroppedOutputArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))DROPPED_OUTPUT_ARRAYS")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):TIFF1:DisorderedArrays")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))DISORDERED_ARRAYS")
    field(PINI, "YES")
}

record(longin, "$(CAM):TIFF1:DisorderedArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(TIFF1,$(ADDR=0),$(TIMEOUT=1))DISORDERED_ARRAYS")
    field(SCAN, "I/O Intr")
}



###################################################################
#  The asynRecord is used for mainly for trace mask               # 
###################################################################
 
# Set ASYN_TRACEIO_HEX bit by default
record(asyn,"$(CAM):TIFF1:AsynIO")
{
    field(PORT, "TIFF1")
    field(TIB2,"1")
    info("ADType", "ADPlugin")
}


# We replace some fields in records defined in NDFile.template
# File data format 
record(mbbo, "$(CAM):TIFF1:FileFormat")
{
    field(ZRST, "TIFF")
    field(ZRVL, "0")
    field(ONST, "Invalid")
    field(ONVL, "1")
}

record(mbbi, "$(CAM):TIFF1:FileFormat_RBV")
{
    field(ZRST, "TIFF")
    field(ZRVL, "0")
    field(ONST, "Undefined")
    field(ONVL, "1")
}

#=================================================================#
# Template file: NDTransform.template

#=================================================================#
# Template file: NDPluginBase.template
# Database for NDPluginBase, i.e. records common to all plugins
# Mark Rivers
# April 25, 2008

#=================================================================#
# Template file: NDArrayBase.template
# Database for area detector control using asyn driver and standard asyn device support
# Mark Rivers
# March 9, 2008

###################################################################
#  This record contains the version of ADCore                     #
###################################################################

record(stringin, "$(CAM):Trans1:ADCoreVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))ADCORE_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the version of the driver or plugin       #
###################################################################

record(stringin, "$(CAM):Trans1:DriverVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))DRIVER_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the asyn port name of this detector       #
###################################################################

record(stringin, "$(CAM):Trans1:PortName_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))PORT_NAME_SELF")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records contain basic information about the detector     # 
###################################################################

record(stringin, "$(CAM):Trans1:Manufacturer_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))MANUFACTURER")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):Trans1:Model_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))MODEL")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):Trans1:SerialNumber_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))SERIAL_NUMBER")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):Trans1:SDKVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))SDK_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

record(stringin, "$(CAM):Trans1:FirmwareVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))FIRMWARE_VERSION")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control acquisition start and stop               #
###################################################################

record(bo, "$(CAM):Trans1:Acquire") {
   field(DTYP, "asynInt32")
   field(OUT, "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))ACQUIRE")
   field(ZNAM, "Done")
   field(ONAM, "Acquire")
   field(VAL,  "0")
   field(FLNK, "$(CAM):Trans1:SetAcquireBusy")
   info(asyn:READBACK, "1")
}

record(bi, "$(CAM):Trans1:Acquire_RBV") {
   field(DTYP, "asynInt32")
   field(INP, "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))ACQUIRE")
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):Trans1:SetAcquireBusy")
{
    field(INPA, "$(CAM):Trans1:Acquire NPP")
    field(CALC, "A")
    field(OOPT, "Transition To Non-zero")
    field(OUT,  "$(CAM):Trans1:AcquireBusy PP")
}

record(busy, "$(CAM):Trans1:AcquireBusy") {
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(VAL,  "0")
}

record(bi, "$(CAM):Trans1:AcquireBusyCB") {
   field(DTYP, "asynInt32")
   field(INP, "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))ACQUIRE_BUSY")
   field(ZNAM, "Done")
   field(ZSV,  "NO_ALARM")
   field(ONAM, "Acquiring")
   field(OSV,  "MINOR")
   field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):Trans1:ClearAcquireBusy") {
    field(INPA, "$(CAM):Trans1:AcquireBusyCB CP")
    field(CALC, "A")
    field(OOPT, "Transition To Zero")
    field(OUT,  "$(CAM):Trans1:AcquireBusy PP")
}

record(bo, "$(CAM):Trans1:WaitForPlugins") {
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT, "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))WAIT_FOR_PLUGINS")
   field(ZNAM, "No")
   field(ONAM, "Yes")
   field(VAL,  "0")
}

###################################################################
#  These records are the array size and data type                 #
###################################################################
# The number of dimensions
record(longout, "$(CAM):Trans1:NDimensions")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))ARRAY_NDIMENSIONS")
}

record(longin, "$(CAM):Trans1:NDimensions_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))ARRAY_NDIMENSIONS")
    field(SCAN, "I/O Intr")
}

# The array dimensions waveform records
record(waveform, "$(CAM):Trans1:Dimensions")
{
    field(DTYP, "asynInt32ArrayOut")
    field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))ARRAY_DIMENSIONS")
    field(FTVL, "LONG")
    field(NELM, "10")
    field(FLNK, "$(CAM):Trans1:Dim0SA")
}

record(subArray, "$(CAM):Trans1:Dim0SA")
{
    field(INP,  "$(CAM):Trans1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "0")
    field(FLNK, "$(CAM):Trans1:ArraySize0")
}

record(longin, "$(CAM):Trans1:ArraySize0")
{
    field(INP,  "$(CAM):Trans1:Dim0SA")
    field(FLNK, "$(CAM):Trans1:Dim1SA")
}

record(subArray, "$(CAM):Trans1:Dim1SA")
{
    field(INP,  "$(CAM):Trans1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "1")
    field(FLNK, "$(CAM):Trans1:ArraySize1")
}

record(longin, "$(CAM):Trans1:ArraySize1")
{
    field(INP,  "$(CAM):Trans1:Dim1SA")
    field(FLNK, "$(CAM):Trans1:Dim2SA")
}

record(subArray, "$(CAM):Trans1:Dim2SA")
{
    field(INP,  "$(CAM):Trans1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "2")
    field(FLNK, "$(CAM):Trans1:ArraySize2")
}

record(longin, "$(CAM):Trans1:ArraySize2")
{
    field(INP,  "$(CAM):Trans1:Dim2SA")
    field(FLNK, "$(CAM):Trans1:Dim3SA")
}

record(subArray, "$(CAM):Trans1:Dim3SA")
{
    field(INP,  "$(CAM):Trans1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "3")
    field(FLNK, "$(CAM):Trans1:ArraySize3")
}

record(longin, "$(CAM):Trans1:ArraySize3")
{
    field(INP,  "$(CAM):Trans1:Dim3SA")
    field(FLNK, "$(CAM):Trans1:Dim4SA")
}

record(subArray, "$(CAM):Trans1:Dim4SA")
{
    field(INP,  "$(CAM):Trans1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "4")
    field(FLNK, "$(CAM):Trans1:ArraySize4")
}

record(longin, "$(CAM):Trans1:ArraySize4")
{
    field(INP,  "$(CAM):Trans1:Dim4SA")
    field(FLNK, "$(CAM):Trans1:Dim5SA")
}

record(subArray, "$(CAM):Trans1:Dim5SA")
{
    field(INP,  "$(CAM):Trans1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "5")
    field(FLNK, "$(CAM):Trans1:ArraySize5")
}

record(longin, "$(CAM):Trans1:ArraySize5")
{
    field(INP,  "$(CAM):Trans1:Dim5SA")
    field(FLNK, "$(CAM):Trans1:Dim6SA")
}

record(subArray, "$(CAM):Trans1:Dim6SA")
{
    field(INP,  "$(CAM):Trans1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "6")
    field(FLNK, "$(CAM):Trans1:ArraySize6")
}

record(longin, "$(CAM):Trans1:ArraySize6")
{
    field(INP,  "$(CAM):Trans1:Dim6SA")
    field(FLNK, "$(CAM):Trans1:Dim7SA")
}

record(subArray, "$(CAM):Trans1:Dim7SA")
{
    field(INP,  "$(CAM):Trans1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "7")
    field(FLNK, "$(CAM):Trans1:ArraySize7")
}

record(longin, "$(CAM):Trans1:ArraySize7")
{
    field(INP,  "$(CAM):Trans1:Dim7SA")
    field(FLNK, "$(CAM):Trans1:Dim8SA")
}

record(subArray, "$(CAM):Trans1:Dim8SA")
{
    field(INP,  "$(CAM):Trans1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "8")
    field(FLNK, "$(CAM):Trans1:ArraySize8")
}

record(longin, "$(CAM):Trans1:ArraySize8")
{
    field(INP,  "$(CAM):Trans1:Dim8SA")
    field(FLNK, "$(CAM):Trans1:Dim9SA")
}

record(subArray, "$(CAM):Trans1:Dim9SA")
{
    field(INP,  "$(CAM):Trans1:Dimensions NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "9")
    field(FLNK, "$(CAM):Trans1:ArraySize9")
}

record(longin, "$(CAM):Trans1:ArraySize9")
{
    field(INP,  "$(CAM):Trans1:Dim9SA")
}


record(waveform, "$(CAM):Trans1:Dimensions_RBV")
{
    field(DTYP, "asynInt32ArrayIn")
    field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))ARRAY_DIMENSIONS")
    field(FTVL, "LONG")
    field(NELM, "10")
    field(FLNK, "$(CAM):Trans1:Dim0SA_RBV")
    field(SCAN, "I/O Intr")
}

record(subArray, "$(CAM):Trans1:Dim0SA_RBV")
{
    field(INP,  "$(CAM):Trans1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "0")
    field(FLNK, "$(CAM):Trans1:ArraySize0_RBV")
}

record(longin, "$(CAM):Trans1:ArraySize0_RBV")
{
    field(INP,  "$(CAM):Trans1:Dim0SA_RBV")
    field(FLNK, "$(CAM):Trans1:Dim1SA_RBV")
}

record(subArray, "$(CAM):Trans1:Dim1SA_RBV")
{
    field(INP,  "$(CAM):Trans1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "1")
    field(FLNK, "$(CAM):Trans1:ArraySize1_RBV")
}

record(longin, "$(CAM):Trans1:ArraySize1_RBV")
{
    field(INP,  "$(CAM):Trans1:Dim1SA_RBV")
    field(FLNK, "$(CAM):Trans1:Dim2SA_RBV")
}

record(subArray, "$(CAM):Trans1:Dim2SA_RBV")
{
    field(INP,  "$(CAM):Trans1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "2")
    field(FLNK, "$(CAM):Trans1:ArraySize2_RBV")
}

record(longin, "$(CAM):Trans1:ArraySize2_RBV")
{
    field(INP,  "$(CAM):Trans1:Dim2SA_RBV")
    field(FLNK, "$(CAM):Trans1:Dim3SA_RBV")
}

record(subArray, "$(CAM):Trans1:Dim3SA_RBV")
{
    field(INP,  "$(CAM):Trans1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "3")
    field(FLNK, "$(CAM):Trans1:ArraySize3_RBV")
}

record(longin, "$(CAM):Trans1:ArraySize3_RBV")
{
    field(INP,  "$(CAM):Trans1:Dim3SA_RBV")
    field(FLNK, "$(CAM):Trans1:Dim4SA_RBV")
}

record(subArray, "$(CAM):Trans1:Dim4SA_RBV")
{
    field(INP,  "$(CAM):Trans1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "4")
    field(FLNK, "$(CAM):Trans1:ArraySize4_RBV")
}

record(longin, "$(CAM):Trans1:ArraySize4_RBV")
{
    field(INP,  "$(CAM):Trans1:Dim4SA_RBV")
    field(FLNK, "$(CAM):Trans1:Dim5SA_RBV")
}

record(subArray, "$(CAM):Trans1:Dim5SA_RBV")
{
    field(INP,  "$(CAM):Trans1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "5")
    field(FLNK, "$(CAM):Trans1:ArraySize5_RBV")
}

record(longin, "$(CAM):Trans1:ArraySize5_RBV")
{
    field(INP,  "$(CAM):Trans1:Dim5SA_RBV")
    field(FLNK, "$(CAM):Trans1:Dim6SA_RBV")
}

record(subArray, "$(CAM):Trans1:Dim6SA_RBV")
{
    field(INP,  "$(CAM):Trans1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "6")
    field(FLNK, "$(CAM):Trans1:ArraySize6_RBV")
}

record(longin, "$(CAM):Trans1:ArraySize6_RBV")
{
    field(INP,  "$(CAM):Trans1:Dim6SA_RBV")
    field(FLNK, "$(CAM):Trans1:Dim7SA_RBV")
}

record(subArray, "$(CAM):Trans1:Dim7SA_RBV")
{
    field(INP,  "$(CAM):Trans1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "7")
    field(FLNK, "$(CAM):Trans1:ArraySize7_RBV")
}

record(longin, "$(CAM):Trans1:ArraySize7_RBV")
{
    field(INP,  "$(CAM):Trans1:Dim7SA_RBV")
    field(FLNK, "$(CAM):Trans1:Dim8SA_RBV")
}

record(subArray, "$(CAM):Trans1:Dim8SA_RBV")
{
    field(INP,  "$(CAM):Trans1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "8")
    field(FLNK, "$(CAM):Trans1:ArraySize8_RBV")
}

record(longin, "$(CAM):Trans1:ArraySize8_RBV")
{
    field(INP,  "$(CAM):Trans1:Dim8SA_RBV")
    field(FLNK, "$(CAM):Trans1:Dim9SA_RBV")
}

record(subArray, "$(CAM):Trans1:Dim9SA_RBV")
{
    field(INP,  "$(CAM):Trans1:Dimensions_RBV NPP NMS")
    field(FTVL, "LONG")
    field(MALM, "10")
    field(NELM, "1")
    field(INDX, "9")
    field(FLNK, "$(CAM):Trans1:ArraySize9_RBV")
}

record(longin, "$(CAM):Trans1:ArraySize9_RBV")
{
    field(INP,  "$(CAM):Trans1:Dim9SA_RBV")
}


record(mbbi, "$(CAM):Trans1:BayerPattern_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))BAYER_PATTERN")
   field(ZRST, "RGGB")
   field(ZRVL, "0")
   field(ONST, "GBRG")
   field(ONVL, "1")
   field(TWST, "GRBG")
   field(TWVL, "2")
   field(THST, "BGGR")
   field(THVL, "3")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Trans1:ArraySizeX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_X")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Trans1:ArraySizeY_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_Y")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Trans1:ArraySizeZ_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_Z")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Trans1:ArraySize_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records have information on the compression              # 
###################################################################
record(stringin, "$(CAM):Trans1:Codec_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))CODEC")
   field(VAL,  "")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Trans1:CompressedSize_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))COMPRESSED_SIZE")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the data type                            # 
###################################################################

record(mbbo, "$(CAM):Trans1:DataType")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))DATA_TYPE")
   field(ZRST, "Int8")
   field(ZRVL, "0")
   field(ONST, "UInt8")
   field(ONVL, "1")
   field(TWST, "Int16")
   field(TWVL, "2")
   field(THST, "UInt16")
   field(THVL, "3")
   field(FRST, "Int32")
   field(FRVL, "4")
   field(FVST, "UInt32")
   field(FVVL, "5")
   field(SXST, "Int64")
   field(SXVL, "6")
   field(SVST, "UInt64")
   field(SVVL, "7")
   field(EIST, "Float32")
   field(EIVL, "8")
   field(NIST, "Float64")
   field(NIVL, "9")
   field(VAL,  "0")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Trans1:DataType_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))DATA_TYPE")
   field(ZRST, "Int8")
   field(ZRVL, "0")
   field(ONST, "UInt8")
   field(ONVL, "1")
   field(TWST, "Int16")
   field(TWVL, "2")
   field(THST, "UInt16")
   field(THVL, "3")
   field(FRST, "Int32")
   field(FRVL, "4")
   field(FVST, "UInt32")
   field(FVVL, "5")
   field(SXST, "Int64")
   field(SXVL, "6")
   field(SVST, "UInt64")
   field(SVVL, "7")
   field(EIST, "Float32")
   field(EIVL, "8")
   field(NIST, "Float64")
   field(NIVL, "9")
   field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Trans1:BitsPerPixel_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))BITS_PER_PIXEL")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the color mode                           #
#  These choices must agree with NDColorMode_t in NDArray.h       # 
###################################################################

record(mbbo, "$(CAM):Trans1:ColorMode")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))COLOR_MODE")
   field(ZRST, "Mono")
   field(ZRVL, "0")
   field(ONST, "Bayer")
   field(ONVL, "1")
   field(TWST, "RGB1")
   field(TWVL, "2")
   field(THST, "RGB2")
   field(THVL, "3")
   field(FRST, "RGB3")
   field(FRVL, "4")
   field(FVST, "YUV444")
   field(FVVL, "5")
   field(SXST, "YUV422")
   field(SXVL, "6")
   field(SVST, "YUV421")
   field(SVVL, "7")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Trans1:ColorMode_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))COLOR_MODE")
   field(ZRST, "Mono")
   field(ZRVL, "0")
   field(ONST, "Bayer")
   field(ONVL, "1")
   field(TWST, "RGB1")
   field(TWVL, "2")
   field(THST, "RGB2")
   field(THVL, "3")
   field(FRST, "RGB3")
   field(FRVL, "4")
   field(FVST, "YUV444")
   field(FVVL, "5")
   field(SXST, "YUV422")
   field(SXVL, "6")
   field(SVST, "YUV421")
   field(SVVL, "7")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records are the uniqueId and time stamps of the array     #
###################################################################
record(longin, "$(CAM):Trans1:UniqueId_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))UNIQUE_ID")
    field(SCAN, "I/O Intr")
}

record(ai, "$(CAM):Trans1:TimeStamp_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))TIME_STAMP")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Trans1:EpicsTSSec_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))EPICS_TS_SEC")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Trans1:EpicsTSNsec_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))EPICS_TS_NSEC")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records provide statistics on array callbacks and        #
#  array callback rates                                           # 
###################################################################
record(longout, "$(CAM):Trans1:ArrayCounter")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))ARRAY_COUNTER")
}

record(longin, "$(CAM):Trans1:ArrayCounter_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))ARRAY_COUNTER")
    field(SCAN, "I/O Intr")
    field(TSE,  "-2")
    field(LOW,  "0" )
    field(LSV,  "MINOR" )
    info(autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV TSE")
}

# Updated rate calculation to use a smoothing factor w/ guard against negative values
# 0 rate sets alarm state to MINOR
record(calc, "$(CAM):Trans1:ArrayRate_RBV")
{
    field(INPA, "$(CAM):Trans1:ArrayRate_RBV.LB NPP NMS")   # Previous counter (Last B value)
    field(INPB, "$(CAM):Trans1:ArrayCounter_RBV NPP NMS")   # Current counter value
    field(INPC, "1.0")                                # Delta time in seconds
    field(INPD, "$(CAM):Trans1:ArrayRate_RBV.VAL NPP NMS")  # Previous rate
    field(INPE, "0.0")                 # Smoothing factor
    field(CALC, "(D*E)/C+MAX(0,B-A)*(1-E)/C")
    field(PREC, "2" )
    field(EGU,  "Hz" )
    field(SCAN, "1 second")
    field(LOW,  "0")
    field(LSV,  "MINOR")
    field(ADEL, "0.1")
    info(autosaveFields, "ADEL DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV MDEL PREC C E SCAN EGU")
}

###################################################################
#  These records control NDArray callacks                         # 
###################################################################
record(bo, "$(CAM):Trans1:ArrayCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))ARRAY_CALLBACKS")
    field(ZNAM, "Disable")
    field(ZSV,  "MINOR")
    field(ONAM, "Enable")
    field(OSV,  "NO_ALARM")
    field(VAL, "1")
    info(autosaveFields, "VAL")
}

record(bi, "$(CAM):Trans1:ArrayCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))ARRAY_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ZSV,  "MINOR")
    field(ONAM, "Enabled")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains macro definitions for the attributes      # 
###################################################################

record(waveform, "$(CAM):Trans1:NDAttributesMacros")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_MACROS")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

###################################################################
#  This record is the name of a file defining attributes          # 
###################################################################

record(waveform, "$(CAM):Trans1:NDAttributesFile")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_FILE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

###################################################################
#  This record defines the status of reading attributes file      # 
###################################################################

record(mbbi, "$(CAM):Trans1:NDAttributesStatus")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))ND_ATTRIBUTES_STATUS")
    field(ZRVL, "0")
    field(ZRST, "Attributes file OK")
    field(ZRSV, "NO_ALARM")
    field(ONVL, "1")
    field(ONST, "File not found")
    field(ONSV, "MINOR")
    field(TWVL, "2")
    field(TWST, "XML syntax error")
    field(TWSV, "MAJOR")
    field(THVL, "3")
    field(THST, "Macro substitution error")
    field(THSV, "MAJOR")
    field(SCAN, "I/O Intr")
}

###################################################################
#  Status of NDArrayPool - number of buffers, memory used etc.    # 
###################################################################

record(ai, "$(CAM):Trans1:PoolMaxMem")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))POOL_MAX_MEMORY")
   field(PREC, "1")
   field(EGU,  "MB")
   field(SCAN, "Passive")
   field(PINI, "YES")
}

record(ai, "$(CAM):Trans1:PoolUsedMem")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))POOL_USED_MEMORY")
   field(PREC, "1")
   field(EGU,  "MB")
   field(SCAN, "1 second")
   field(FLNK, "$(CAM):Trans1:PoolAllocBuffers")
   info(autosaveFields, "SCAN")
}

record(longin, "$(CAM):Trans1:PoolAllocBuffers")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))POOL_ALLOC_BUFFERS")
   field(FLNK, "$(CAM):Trans1:PoolFreeBuffers")
}

record(longin, "$(CAM):Trans1:PoolFreeBuffers")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))POOL_FREE_BUFFERS")
   field(FLNK, "$(CAM):Trans1:PoolUsedBuffers")
}

record(calc, "$(CAM):Trans1:PoolUsedBuffers")
{
    field(INPA, "$(CAM):Trans1:PoolAllocBuffers NPP MS")
    field(INPB, "$(CAM):Trans1:PoolFreeBuffers NPP MS")
    field(CALC, "A-B")
}

record(bo, "$(CAM):Trans1:EmptyFreeList")
{
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))POOL_EMPTY_FREELIST")
}

record(longin, "$(CAM):Trans1:NumQueuedArrays")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))NUM_QUEUED_ARRAYS")
   field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the type of plugin                        #
###################################################################

record(stringin, "$(CAM):Trans1:PluginType_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))PLUGIN_TYPE")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the connection of the server to          #
#  an NDArray driver port and address                             #
###################################################################
# Array port name
record(stringout, "$(CAM):Trans1:NDArrayPort")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(OUT,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))NDARRAY_PORT")
    field(VAL,  "$(CAM_PORT)")
    info(autosaveFields, "DESC VAL")
}

record(stringin, "$(CAM):Trans1:NDArrayPort_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))NDARRAY_PORT")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Trans1:NDArrayAddress")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))NDARRAY_ADDR")
    field(VAL,  "$(NDARRAY_ADDR=0)")
    info(autosaveFields, "DESC VAL")
}

record(longin, "$(CAM):Trans1:NDArrayAddress_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))NDARRAY_ADDR")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control whether callbacks are enabled and        #
#  minimum time between callbacks                                 #
###################################################################
record(bo, "$(CAM):Trans1:EnableCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))ENABLE_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    field(VAL,  "0")
    info(autosaveFields, "DESC VAL")
}

record(bi, "$(CAM):Trans1:EnableCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))ENABLE_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    field(ZSV,  "MINOR")
    field(OSV,  "NO_ALARM")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Trans1:MinCallbackTime")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))MIN_CALLBACK_TIME")
    field(EGU,  "s")
    field(PREC, "3")
    field(VAL,  "0.0")
    field(DRVL, "0")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):Trans1:MinCallbackTime_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))MIN_CALLBACK_TIME")
    field(EGU,  "s")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Trans1:MaxArrayRate")
{
    field(DTYP, "Soft Channel")
    field(OUT,  "$(CAM):Trans1:MaxArrayRate_COUT PP")
    field(EGU,  "Hz")
    field(PREC, "3")
    field(VAL,  "0.0")
    info(autosaveFields, "VAL")
}

record(calcout, "$(CAM):Trans1:MaxArrayRate_COUT")
{
    field(INPA, "$(CAM):Trans1:MaxArrayRate")
    field(CALC, "A=0?0:1.0/A")
    field(OUT,  "$(CAM):Trans1:MinCallbackTime PP")
}

record(calc, "$(CAM):Trans1:MaxArrayRate_RBV")
{
    field(INPA, "$(CAM):Trans1:MinCallbackTime_RBV CP")
    field(CALC, "A=0?0:1.0/A")
    field(EGU,  "Hz")
    field(PREC, "3")
    field(SCAN, "Passive")
}

record(ao, "$(CAM):Trans1:MaxByteRate")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))MAX_BYTE_RATE")
    field(EGU,  "s")
    field(PREC, "3")
    field(VAL,  "0.0")
    field(DRVL, "0")
    info(autosaveFields, "VAL")
}

record(ai, "$(CAM):Trans1:MaxByteRate_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))MAX_BYTE_RATE")
    field(EGU,  "s")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record contains the last execution time of the plugin     #
###################################################################
record(ai, "$(CAM):Trans1:ExecutionTime_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))EXECUTION_TIME")
    field(EGU,  "ms")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

###################################################################
#  This record requests that the plugin execute again with the    #
#  same NDArray                                                   #
###################################################################
record(bo, "$(CAM):Trans1:ProcessPlugin")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))PROCESS_PLUGIN")
    field(VAL,  "1")
}

###################################################################
#  These records control whether callbacks block or not           #
###################################################################
record(bo, "$(CAM):Trans1:BlockingCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))BLOCKING_CALLBACKS")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(VAL,  "0")
    info(autosaveFields, "DESC ZSV OSV VAL")
}

record(bi, "$(CAM):Trans1:BlockingCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))BLOCKING_CALLBACKS")
    field(ZNAM, "No")
    field(ONAM, "Yes")
    field(ZSV,  "NO_ALARM")
    field(OSV,  "MINOR")
    field(SCAN, "I/O Intr")
    info( autosaveFields, "DESC ZSV OSV" )
}


record(longout, "$(CAM):Trans1:DroppedArrays")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))DROPPED_ARRAYS")
    field(VAL,  "0")
    info( autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV EGU" )
}

record(longin, "$(CAM):Trans1:DroppedArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))DROPPED_ARRAYS")
    field(SCAN, "I/O Intr")
    field(HIGH, "1")
    field(HSV,  "MINOR")
    info( autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV EGU" )
}

record(longout, "$(CAM):Trans1:QueueSize")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))QUEUE_SIZE")
    field(PINI, "YES")
    info( autosaveFields, "DESC EGU" )
}

record(longin, "$(CAM):Trans1:QueueSize_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))QUEUE_SIZE")
    field(FLNK, "$(CAM):Trans1:QueueFreeLow")
    field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):Trans1:QueueFreeLow") {
    field(CALC, "A*0.25")
    field(INPA, "$(CAM):Trans1:QueueSize")
    field(OUT,  "$(CAM):Trans1:QueueFree.LOW")
    field(FLNK, "$(CAM):Trans1:QueueUseHIGH")
}

# Set a HIGH warning level for the input queue fill level to 75%
# of the full size of the queue
record(calcout, "$(CAM):Trans1:QueueUseHIGH") {
   field(CALC, "A*0.75")
   field(INPA, "$(CAM):Trans1:QueueSize")
   field(OUT,  "$(CAM):Trans1:QueueUse.HIGH")
   field(FLNK, "$(CAM):Trans1:QueueUseHIHI")
}

# Set a HIHI level for the input queue fill level to indicate an error
# (MAJOR alarm)  when it fills up to the full size of the queue (frames start dropping)
record(calcout, "$(CAM):Trans1:QueueUseHIHI") {
   field(CALC, "A*1.0")
   field(INPA, "$(CAM):Trans1:QueueSize")
   field(OUT,  "$(CAM):Trans1:QueueUse.HIHI")
}

record(longin, "$(CAM):Trans1:QueueFree")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))QUEUE_FREE")
    field(LLSV, "MAJOR")
    field(LSV,  "MINOR")
    field(LOLO, "0")
    field(HYST, "1")
    field(SCAN, "I/O Intr")
}

# Display the fill level on the plugins input queue
record(calc, "$(CAM):Trans1:QueueUse") {
    field(CALC, "A-B")
    field(INPA, "$(CAM):Trans1:QueueSize")
    field(INPB, "$(CAM):Trans1:QueueFree CP")
    field(SCAN, "Passive")
    field(HHSV, "MAJOR")
    field(HSV,  "MINOR")
    field(HYST, "1")
}

record(longout, "$(CAM):Trans1:NumThreads")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))NUM_THREADS")
    field(VAL,  "1")
    field(PINI, "YES")
    info(autosaveFields, "DESC VAL")
}

record(longin, "$(CAM):Trans1:NumThreads_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))NUM_THREADS")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Trans1:MaxThreads_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))MAX_THREADS")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control output array sorting                     #
###################################################################
record(mbbo, "$(CAM):Trans1:SortMode") {
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))SORT_MODE")
    field(ZRVL, "0")
    field(ZRST, "Unsorted")
    field(ONVL, "1")
    field(ONST, "Sorted")
}

record(mbbi, "$(CAM):Trans1:SortMode_RBV") {
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))SORT_MODE")
    field(ZRVL, "0")
    field(ZRST, "Unsorted")
    field(ONVL, "1")
    field(ONST, "Sorted")
    field(SCAN, "I/O Intr")
}

record(ao, "$(CAM):Trans1:SortTime") {
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))SORT_TIME")
    field(PREC, "3")
    field(VAL, "0.1")
}

record(ai, "$(CAM):Trans1:SortTime_RBV") {
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))SORT_TIME")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Trans1:SortSize")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))SORT_SIZE")
    field(VAL,  "20")
    field(PINI, "YES")
}

record(longin, "$(CAM):Trans1:SortSize_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))SORT_SIZE")
    field(FLNK, "$(CAM):Trans1:SortFreeLow")
    field(SCAN, "I/O Intr")
}

record(longin, "$(CAM):Trans1:SortFree") {
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))SORT_FREE")
    field(LLSV, "MAJOR")
    field(LSV,  "MINOR")
    field(LOLO, "0")
    field(HYST, "1")
    field(SCAN, "I/O Intr")
}

record(calcout, "$(CAM):Trans1:SortFreeLow") {
    field(CALC, "A*0.25")
    field(INPA, "$(CAM):Trans1:SortSize")
    field(OUT,  "$(CAM):Trans1:SortFree.LOW")
}

record(longout, "$(CAM):Trans1:DroppedOutputArrays")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))DROPPED_OUTPUT_ARRAYS")
    field(VAL,  "0")
}

record(longin, "$(CAM):Trans1:DroppedOutputArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))DROPPED_OUTPUT_ARRAYS")
    field(SCAN, "I/O Intr")
}

record(longout, "$(CAM):Trans1:DisorderedArrays")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))DISORDERED_ARRAYS")
    field(PINI, "YES")
}

record(longin, "$(CAM):Trans1:DisorderedArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))DISORDERED_ARRAYS")
    field(SCAN, "I/O Intr")
}



###################################################################
#  The asynRecord is used for mainly for trace mask               # 
###################################################################
 
# Set ASYN_TRACEIO_HEX bit by default
record(asyn,"$(CAM):Trans1:AsynIO")
{
    field(PORT, "Trans1")
    field(TIB2,"1")
    info("ADType", "ADPlugin")
}


record(mbbo, "$(CAM):Trans1:Type")
{
   field(PINI, "1")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Trans1,$(ADDR=0),$(TIMEOUT=1))TRANSFORM_TYPE")
   field(ZRST, "None")
   field(ZRVL, "0")
   field(ONST, "Rot90")
   field(ONVL, "1")
   field(TWST, "Rot180")
   field(TWVL, "2")
   field(THST, "Rot270")
   field(THVL, "3")
   field(FRST, "Mirror")
   field(FRVL, "4")
   field(FVST, "Rot90Mirror")
   field(FVVL, "5")
   field(SXST, "Rot180Mirror")
   field(SXVL, "6")
   field(SVST, "Rot270Mirror")
   field(SVVL, "7")
   info(autosaveFields, "VAL")
}
