#=================================================================#
# 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):Trans$(N):ADCoreVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Trans$(N),$(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):Trans$(N):DriverVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Trans$(N),$(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):Trans$(N):PortName_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Trans$(N),$(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):Trans$(N):Manufacturer_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Trans$(N),$(ADDR=0),$(TIMEOUT=1))MANUFACTURER")
   field(VAL,  "Unknown")
   field(SCAN, "I/O Intr")
}

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

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

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

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

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

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

record(bi, "$(CAM):Trans$(N):Acquire_RBV") {
   field(DTYP, "asynInt32")
   field(INP, "@asyn(Trans$(N),$(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):Trans$(N):SetAcquireBusy")
{
    field(INPA, "$(CAM):Trans$(N):Acquire NPP")
    field(CALC, "A")
    field(OOPT, "Transition To Non-zero")
    field(OUT,  "$(CAM):Trans$(N):AcquireBusy PP")
}

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

record(bi, "$(CAM):Trans$(N):AcquireBusyCB") {
   field(DTYP, "asynInt32")
   field(INP, "@asyn(Trans$(N),$(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):Trans$(N):ClearAcquireBusy") {
    field(INPA, "$(CAM):Trans$(N):AcquireBusyCB CP")
    field(CALC, "A")
    field(OOPT, "Transition To Zero")
    field(OUT,  "$(CAM):Trans$(N):AcquireBusy PP")
}

record(bo, "$(CAM):Trans$(N):WaitForPlugins") {
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT, "@asyn(Trans$(N),$(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):Trans$(N):NDimensions")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Trans$(N),$(ADDR=0),$(TIMEOUT=1))ARRAY_NDIMENSIONS")
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


record(mbbi, "$(CAM):Trans$(N):BayerPattern_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Trans$(N),$(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):Trans$(N):ArraySizeX_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Trans$(N),$(ADDR=0),$(TIMEOUT=1))ARRAY_SIZE_X")
   field(SCAN, "I/O Intr")
}

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

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

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

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

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

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

record(mbbo, "$(CAM):Trans$(N):DataType")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Trans$(N),$(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):Trans$(N):DataType_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Trans$(N),$(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):Trans$(N):BitsPerPixel_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Trans$(N),$(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):Trans$(N):ColorMode")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Trans$(N),$(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):Trans$(N):ColorMode_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Trans$(N),$(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):Trans$(N):UniqueId_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Trans$(N),$(ADDR=0),$(TIMEOUT=1))UNIQUE_ID")
    field(SCAN, "I/O Intr")
}

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

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

record(longin, "$(CAM):Trans$(N):EpicsTSNsec_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Trans$(N),$(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):Trans$(N):ArrayCounter")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Trans$(N),$(ADDR=0),$(TIMEOUT=1))ARRAY_COUNTER")
}

record(longin, "$(CAM):Trans$(N):ArrayCounter_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Trans$(N),$(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):Trans$(N):ArrayRate_RBV")
{
    field(INPA, "$(CAM):Trans$(N):ArrayRate_RBV.LB NPP NMS")   # Previous counter (Last B value)
    field(INPB, "$(CAM):Trans$(N):ArrayCounter_RBV NPP NMS")   # Current counter value
    field(INPC, "1.0")                                # Delta time in seconds
    field(INPD, "$(CAM):Trans$(N):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):Trans$(N):ArrayCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Trans$(N),$(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):Trans$(N):ArrayCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Trans$(N),$(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):Trans$(N):NDAttributesMacros")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(Trans$(N),$(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):Trans$(N):NDAttributesFile")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(Trans$(N),$(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):Trans$(N):NDAttributesStatus")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Trans$(N),$(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):Trans$(N):PoolMaxMem")
{
   field(DTYP, "asynFloat64")
   field(INP,  "@asyn(Trans$(N),$(ADDR=0),$(TIMEOUT=1))POOL_MAX_MEMORY")
   field(PREC, "1")
   field(EGU,  "MB")
   field(SCAN, "Passive")
   field(PINI, "YES")
}

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

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

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

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

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

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

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

record(stringin, "$(CAM):Trans$(N):PluginType_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Trans$(N),$(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):Trans$(N):NDArrayPort")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(OUT,  "@asyn(Trans$(N),$(ADDR=0),$(TIMEOUT=1))NDARRAY_PORT")
    field(VAL,  "$(PLUGIN_SRC)")
    info(autosaveFields, "DESC VAL")
}

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

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

record(longin, "$(CAM):Trans$(N):NDArrayAddress_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Trans$(N),$(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):Trans$(N):EnableCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Trans$(N),$(ADDR=0),$(TIMEOUT=1))ENABLE_CALLBACKS")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    field(VAL,  "0")
    info(autosaveFields, "DESC VAL")
}

record(bi, "$(CAM):Trans$(N):EnableCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Trans$(N),$(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):Trans$(N):MinCallbackTime")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Trans$(N),$(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):Trans$(N):MinCallbackTime_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Trans$(N),$(ADDR=0),$(TIMEOUT=1))MIN_CALLBACK_TIME")
    field(EGU,  "s")
    field(PREC, "3")
    field(SCAN, "I/O Intr")
}

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

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

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

record(ao, "$(CAM):Trans$(N):MaxByteRate")
{
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Trans$(N),$(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):Trans$(N):MaxByteRate_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Trans$(N),$(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):Trans$(N):ExecutionTime_RBV")
{
    field(DTYP, "asynFloat64")
    field(INP,  "@asyn(Trans$(N),$(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):Trans$(N):ProcessPlugin")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Trans$(N),$(ADDR=0),$(TIMEOUT=1))PROCESS_PLUGIN")
    field(VAL,  "1")
}

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

record(bi, "$(CAM):Trans$(N):BlockingCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Trans$(N),$(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):Trans$(N):DroppedArrays")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Trans$(N),$(ADDR=0),$(TIMEOUT=1))DROPPED_ARRAYS")
    field(VAL,  "0")
    info( autosaveFields, "DESC LOLO LOW HIGH HIHI LLSV LSV HSV HHSV EGU" )
}

record(longin, "$(CAM):Trans$(N):DroppedArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Trans$(N),$(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):Trans$(N):QueueSize")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Trans$(N),$(ADDR=0),$(TIMEOUT=1))QUEUE_SIZE")
    field(PINI, "YES")
    info( autosaveFields, "DESC EGU" )
}

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

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

# Set a HIGH warning level for the input queue fill level to 75%
# of the full size of the queue
record(calcout, "$(CAM):Trans$(N):QueueUseHIGH") {
   field(CALC, "A*0.75")
   field(INPA, "$(CAM):Trans$(N):QueueSize")
   field(OUT,  "$(CAM):Trans$(N):QueueUse.HIGH")
   field(FLNK, "$(CAM):Trans$(N):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):Trans$(N):QueueUseHIHI") {
   field(CALC, "A*1.0")
   field(INPA, "$(CAM):Trans$(N):QueueSize")
   field(OUT,  "$(CAM):Trans$(N):QueueUse.HIHI")
}

record(longin, "$(CAM):Trans$(N):QueueFree")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Trans$(N),$(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):Trans$(N):QueueUse") {
    field(CALC, "A-B")
    field(INPA, "$(CAM):Trans$(N):QueueSize")
    field(INPB, "$(CAM):Trans$(N):QueueFree CP")
    field(SCAN, "Passive")
    field(HHSV, "MAJOR")
    field(HSV,  "MINOR")
    field(HYST, "1")
}

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

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

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

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

record(mbbi, "$(CAM):Trans$(N):SortMode_RBV") {
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Trans$(N),$(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):Trans$(N):SortTime") {
    field(PINI, "YES")
    field(DTYP, "asynFloat64")
    field(OUT,  "@asyn(Trans$(N),$(ADDR=0),$(TIMEOUT=1))SORT_TIME")
    field(PREC, "3")
    field(VAL, "0.1")
}

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

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

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

record(longin, "$(CAM):Trans$(N):SortFree") {
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Trans$(N),$(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):Trans$(N):SortFreeLow") {
    field(CALC, "A*0.25")
    field(INPA, "$(CAM):Trans$(N):SortSize")
    field(OUT,  "$(CAM):Trans$(N):SortFree.LOW")
}

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

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

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

record(longin, "$(CAM):Trans$(N):DisorderedArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Trans$(N),$(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):Trans$(N):AsynIO")
{
    field(PORT, "Trans$(N)")
    field(TIB2,"1")
    info("ADType", "ADPlugin")
}


record(mbbo, "$(CAM):Trans$(N):Type")
{
   field(PINI, "1")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Trans$(N),$(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")
}
