#=================================================================#
# 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):Magick$(N):FilePath")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(Magick$(N),$(ADDR=0),$(TIMEOUT=1))FILE_PATH")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

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

record(bi, "$(CAM):Magick$(N):FilePathExists_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Magick$(N),$(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):Magick$(N):CreateDirectory")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Magick$(N),$(ADDR=0),$(TIMEOUT=1))CREATE_DIR")
    field(VAL,  "0" )
    info(autosaveFields, "VAL")
}

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

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

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

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

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

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

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

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

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

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

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

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

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

record(bi, "$(CAM):Magick$(N):WriteFile_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Magick$(N),$(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):Magick$(N):ReadFile")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Magick$(N),$(ADDR=0),$(TIMEOUT=1))READ_FILE")
    field(ZNAM, "Done")
    field(ONAM, "Read")
}

record(bi, "$(CAM):Magick$(N):ReadFile_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Magick$(N),$(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):Magick$(N):FileFormat")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Magick$(N),$(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):Magick$(N):FileFormat_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Magick$(N),$(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):Magick$(N):FileWriteMode")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Magick$(N),$(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):Magick$(N):FileWriteMode_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Magick$(N),$(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):Magick$(N):Capture")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Magick$(N),$(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):Magick$(N):Capture_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Magick$(N),$(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):Magick$(N):NumCapture")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Magick$(N),$(ADDR=0),$(TIMEOUT=1))NUM_CAPTURE")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

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

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

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

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

record(bi, "$(CAM):Magick$(N):WriteStatus")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Magick$(N),$(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):Magick$(N):WriteMessage")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Magick$(N),$(ADDR=0),$(TIMEOUT=1))WRITE_MESSAGE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

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

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

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

record(stringin, "$(CAM):Magick$(N):TempSuffix_RBV")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Magick$(N),$(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):Magick$(N):FilePath")
{
    field(FLNK, "$(CAM):Magick$(N):ResetFileNumber" )
}
record(waveform, "$(CAM):Magick$(N):FileName")
{
    field(FLNK, "$(CAM):Magick$(N):ResetFileNumber" )
}
record(waveform, "$(CAM):Magick$(N):FileTemplate")
{
    field(FLNK, "$(CAM):Magick$(N):ResetFileNumber" )
}

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

record(calcout, "$(CAM):Magick$(N):ResetFileNumber")
{
    field(INPA, "$(CAM):Magick$(N):AutoFileNumberReset NPP")
    field(CALC, "A")
    field(OOPT, "When Non-zero" )
    field(OUT,  "$(CAM):Magick$(N):FileNumber PP")
}
#=================================================================#
# Template file: NDFileMagick.template
# Database for NDFileMagick driver, which saves NDArray data 
# in any file format supported by Magick.
# The file format is determined by the file extension
# 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):Magick$(N):FilePath")
{
    field(PINI, "YES")
    field(DTYP, "asynOctetWrite")
    field(INP,  "@asyn(Magick$(N),$(ADDR=0),$(TIMEOUT=1))FILE_PATH")
    field(FTVL, "CHAR")
    field(NELM, "256")
    info(autosaveFields, "VAL")
}

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

record(bi, "$(CAM):Magick$(N):FilePathExists_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Magick$(N),$(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):Magick$(N):CreateDirectory")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Magick$(N),$(ADDR=0),$(TIMEOUT=1))CREATE_DIR")
    field(VAL,  "0" )
    info(autosaveFields, "VAL")
}

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

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

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

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

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

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

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

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

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

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

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

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

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

record(bi, "$(CAM):Magick$(N):WriteFile_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Magick$(N),$(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):Magick$(N):ReadFile")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Magick$(N),$(ADDR=0),$(TIMEOUT=1))READ_FILE")
    field(ZNAM, "Done")
    field(ONAM, "Read")
}

record(bi, "$(CAM):Magick$(N):ReadFile_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Magick$(N),$(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):Magick$(N):FileFormat")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Magick$(N),$(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):Magick$(N):FileFormat_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Magick$(N),$(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):Magick$(N):FileWriteMode")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Magick$(N),$(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):Magick$(N):FileWriteMode_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Magick$(N),$(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):Magick$(N):Capture")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Magick$(N),$(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):Magick$(N):Capture_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Magick$(N),$(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):Magick$(N):NumCapture")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Magick$(N),$(ADDR=0),$(TIMEOUT=1))NUM_CAPTURE")
    field(VAL,  "1")
    info(autosaveFields, "VAL")
}

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

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

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

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

record(bi, "$(CAM):Magick$(N):WriteStatus")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Magick$(N),$(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):Magick$(N):WriteMessage")
{
    field(DTYP, "asynOctetRead")
    field(INP,  "@asyn(Magick$(N),$(ADDR=0),$(TIMEOUT=1))WRITE_MESSAGE")
    field(FTVL, "CHAR")
    field(NELM, "256")
    field(SCAN, "I/O Intr")
}

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

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

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

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

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

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

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

record(stringin, "$(CAM):Magick$(N):FirmwareVersion_RBV")
{
   field(DTYP, "asynOctetRead")
   field(INP,  "@asyn(Magick$(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):Magick$(N):Acquire") {
   field(DTYP, "asynInt32")
   field(OUT, "@asyn(Magick$(N),$(ADDR=0),$(TIMEOUT=1))ACQUIRE")
   field(ZNAM, "Done")
   field(ONAM, "Acquire")
   field(VAL,  "0")
   field(FLNK, "$(CAM):Magick$(N):SetAcquireBusy")
   info(asyn:READBACK, "1")
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

###################################################################
#  These records control whether callbacks block or not           #
###################################################################
record(bo, "$(CAM):Magick$(N):BlockingCallbacks")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Magick$(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):Magick$(N):BlockingCallbacks_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Magick$(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):Magick$(N):DroppedArrays")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Magick$(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):Magick$(N):DroppedArrays_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Magick$(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):Magick$(N):QueueSize")
{
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Magick$(N),$(ADDR=0),$(TIMEOUT=1))QUEUE_SIZE")
    field(PINI, "YES")
    info( autosaveFields, "DESC EGU" )
}

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

record(calcout, "$(CAM):Magick$(N):QueueFreeLow") {
    field(CALC, "A*0.25")
    field(INPA, "$(CAM):Magick$(N):QueueSize")
    field(OUT,  "$(CAM):Magick$(N):QueueFree.LOW")
    field(FLNK, "$(CAM):Magick$(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):Magick$(N):QueueUseHIGH") {
   field(CALC, "A*0.75")
   field(INPA, "$(CAM):Magick$(N):QueueSize")
   field(OUT,  "$(CAM):Magick$(N):QueueUse.HIGH")
   field(FLNK, "$(CAM):Magick$(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):Magick$(N):QueueUseHIHI") {
   field(CALC, "A*1.0")
   field(INPA, "$(CAM):Magick$(N):QueueSize")
   field(OUT,  "$(CAM):Magick$(N):QueueUse.HIHI")
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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


# We replace some fields in records defined in NDFile.template
# File data format 
record(mbbo, "$(CAM):Magick$(N):FileFormat")
{
    field(ZRST, "Use extension")
    field(ZRVL, "0")
}

record(mbbi, "$(CAM):Magick$(N):FileFormat_RBV")
{
    field(ZRST, "Use extension")
    field(ZRVL, "0")
}

# File quality 
record(longout, "$(CAM):Magick$(N):Quality")
{
    field(PINI, "YES")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn(Magick$(N),$(ADDR=0),$(TIMEOUT=1))MAGICK_QUALITY")
    field(VAL,  "100")
    field(LOPR, "0")
    field(DRVL, "0")
    field(HOPR, "100")
    field(DRVH, "100")
    info(autosaveFields, "VAL")
}

record(longin, "$(CAM):Magick$(N):Quality_RBV")
{
    field(DTYP, "asynInt32")
    field(INP,  "@asyn(Magick$(N),$(ADDR=0),$(TIMEOUT=1))MAGICK_QUALITY")
    field(LOPR, "0")
    field(HOPR, "100")
    field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the bit depth                            # 
###################################################################

record(mbbo, "$(CAM):Magick$(N):BitDepth")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Magick$(N),$(ADDR=0),$(TIMEOUT=1))MAGICK_BIT_DEPTH")
   field(ZRST, "1")
   field(ZRVL, "1")
   field(ONST, "8")
   field(ONVL, "8")
   field(TWST, "16")
   field(TWVL, "16")
   field(THST, "32")
   field(THVL, "32")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Magick$(N):BitDepth_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Magick$(N),$(ADDR=0),$(TIMEOUT=1))MAGICK_BIT_DEPTH")
   field(ZRST, "1")
   field(ZRVL, "1")
   field(ONST, "8")
   field(ONVL, "8")
   field(TWST, "16")
   field(TWVL, "16")
   field(THST, "32")
   field(THVL, "32")
   field(SCAN, "I/O Intr")
}

###################################################################
#  These records control the compression                          # 
###################################################################

record(mbbo, "$(CAM):Magick$(N):CompressType")
{
   field(PINI, "YES")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn(Magick$(N),$(ADDR=0),$(TIMEOUT=1))MAGICK_COMPRESS_TYPE")
   field(ZRST, "None")
   field(ZRVL, "0")
   field(ONST, "BZip")
   field(ONVL, "1")
   field(TWST, "FAX")
   field(TWVL, "2")
   field(THST, "Group 4")
   field(THVL, "3")
   field(FRST, "JPEG")
   field(FRVL, "4")
   field(FVST, "LZW")
   field(FVVL, "5")
   field(SXST, "RLE")
   field(SXVL, "6")
   field(SVST, "Zip")
   field(SVVL, "7")
   info(autosaveFields, "VAL")
}

record(mbbi, "$(CAM):Magick$(N):CompressType_RBV")
{
   field(DTYP, "asynInt32")
   field(INP,  "@asyn(Magick$(N),$(ADDR=0),$(TIMEOUT=1))MAGICK_COMPRESS_TYPE")
   field(ZRST, "None")
   field(ZRVL, "0")
   field(ONST, "BZip")
   field(ONVL, "1")
   field(TWST, "FAX")
   field(TWVL, "2")
   field(THST, "Group 4")
   field(THVL, "3")
   field(FRST, "JPEG")
   field(FRVL, "4")
   field(FVST, "LZW")
   field(FVVL, "5")
   field(SXST, "RLE")
   field(SXVL, "6")
   field(SVST, "Zip")
   field(SVVL, "7")
   field(SCAN, "I/O Intr")
}
