# Select the source field for the energy
record(bo, "$(P)$(CRLID):EnergySelect") {
  field(DESC, "energy selection")
  field(DTYP, "Soft Channel")
  field(ZNAM, "Mono")
  field(ONAM, "Local")
  field(VAL, "1")
  field(FLNK, "$(P)$(CRLID):EnergyCalc")
}

# The local energy
record(ao, "$(P)$(CRLID):EnergyLocal") {
  field(DESC, "local energy")
  field(VAL,  "12.398")
  field(PREC, "4")
  field(EGU, "keV")
  field(FLNK, "$(P)$(CRLID):EnergyCalc")
}

# The beamline energy
record(ao, "$(P)$(CRLID):EnergyBeamline") {
  field(DESC, "beamline energy")
  field(DOL,  "$(KEV) CP")
  field(OMSL, "closed_loop")
  field(PREC, "4")
  field(EGU, "keV")
  field(FLNK, "$(P)$(CRLID):EnergyCalc")
}

# Calculate the energy to be used
record(calcout, "$(P)$(CRLID):EnergyCalc"){
  field(DESC, "Energy select calc")
  field(SCAN, "Passive")
  field(INPA, "$(P)$(CRLID):EnergySelect.RVAL")
  field(INPB, "$(P)$(CRLID):EnergyBeamline")
  field(INPC, "$(P)$(CRLID):EnergyLocal")
  field(CALC, "(A==0)?B:C")
  field(OUT, "$(P)$(CRLID):energy PP")
  field(PREC, "4")
  field(SCAN, "Passive")
}

record(ao, "$(P)$(CRLID):energy"){
	field(EGU, "keV")
    field(DOL,  "$(KEV) CP")
    field(OMSL, "closed_loop")
	field(DTYP, "pydev")
	field(OUT, "@$(OBJ).updateE(VAL)")
	field(FLNK, "$(P)$(CRLID):recalc_table.PROC CA")
}

record(ai, "$(P)$(CRLID):energy_RBV"){
  field(DTYP, "pydev")
  field(INP,  "@pydev.iointr('updated_E')")
  field(SCAN, "I/O Intr")
  field(PREC, "5")
}


record(ao, "$(P)$(CRLID):focalSize"){
	field(EGU, "m")
	field(DTYP, "pydev")
	field(OUT, "@$(OBJ).updateFsize(VAL)")
}

record(calcout, "$(P)$(CRLID):fSize_twk_up"){
	field(INPA, "$(P)$(CRLID):sortedIndex_RBV")
	field(CALC, "MIN(A+1,2**$(NUM)-1)")
	field(OUT, "$(P)$(CRLID):sortedIndex PP")
}

record(calcout, "$(P)$(CRLID):fSize_twk_dn"){
	field(INPA, "$(P)$(CRLID):sortedIndex_RBV")
	field(CALC, "MAX(0,A-1)")
	field(OUT, "$(P)$(CRLID):sortedIndex PP")
}

record(ao, "$(P)$(CRLID):slitSize_H"){
	field(EGU, "m")
    field(DOL,  "$(SLITH) CP")
    field(OMSL, "closed_loop")
	field(DTYP, "pydev")
	field(OUT, "@$(OBJ).updateSlitSize(VAL, 'hor')")
	field(FLNK, "$(P)$(CRLID):recalc_table.PROC CA")
	field(PREC, "6")
}

record(ai, "$(P)$(CRLID):slitSize_H_RBV"){
  field(DTYP, "pydev")
  field(INP,  "@pydev.iointr('updated_slitSize_H')")
  field(SCAN, "I/O Intr")
  field(PREC, "6")
  field(EGU, "m")
}

record(ao, "$(P)$(CRLID):slitSize_V"){
	field(EGU, "m")
    field(DOL,  "$(SLITV) CP")
    field(OMSL, "closed_loop")
	field(DTYP, "pydev")
	field(OUT, "@$(OBJ).updateSlitSize(VAL, 'vert')")
	field(FLNK, "$(P)$(CRLID):recalc_table.PROC CA")
	field(PREC, "6")
}

record(ai, "$(P)$(CRLID):slitSize_V_RBV"){
  field(DTYP, "pydev")
  field(INP,  "@pydev.iointr('updated_slitSize_V')")
  field(SCAN, "I/O Intr")
  field(PREC, "6")
  field(EGU, "m")
}

record(bo, "$(P)$(CRLID):recalc_enable"){
	field(DESC, "Lookup table calc enable")
	field(SCAN, "Passive")
	field(ZNAM, "Disabled")
	field(ONAM, "Enabled")
}

# Not sure this would work -- how to get a PV to simply trigger code?
record(bo, "$(P)$(CRLID):recalc_table"){
	field(DTYP, "pydev")
	field(OUT, "@$(OBJ).construct_lookup_table()")
	field(FLNK, "$(P)$(CRLID):refind_config.PROC CA")
	field(SDIS, "$(P)$(CRLID):recalc_enable")
	field(DISV, "0")
}

# Not sure this would work -- how to get a PV to simply trigger code?
record(bo, "$(P)$(CRLID):refind_config"){
	field(DTYP, "pydev")
	field(OUT, "@$(OBJ).find_config()")
}

record(bo, "$(P)$(CRLID):thickerr_flag"){
	field(DTYP, "pydev")
	field(ZNAM, "Off")
	field(ONAM, "On")
	field(OUT, "@$(OBJ).setThickerrFlag(VAL)")
    field(FLNK, "$(P)$(CRLID):recalc_table.PROC CA")
}

record(bi, "$(P)$(CRLID):thickerr_flag_RBV"){
	field(DTYP, "pydev")
    field(INP,  "@pydev.iointr('updated_thickerr_Flag')")
    field(SCAN, "I/O Intr")
}


record(longin, "$(P)$(CRLID):lenses") {
  field(DTYP, "pydev")
  field(INP,  "@pydev.iointr('new_lenses')")
  field(SCAN, "I/O Intr")
  field(FLNK, "$(P)$(CRLID):lens_decode.PROC CA")
}

record(transform, "$(P)$(CRLID):lens_decode"){
	field(INPA, "$(P)$(CRLID):lenses PP")
	field(CLCB, "A % 2")
	field(CLCC, "(A >> 1) % 2")
	field(CLCD, "(A >> 2) % 2")
	field(CLCE, "(A >> 3) % 2")
	field(CLCF, "(A >> 4) % 2")
	field(CLCG, "(A >> 5) % 2")
	field(CLCH, "(A >> 6) % 2")
	field(CLCI, "(A >> 7) % 2")
	field(CLCJ, "(A >> 8) % 2")
	field(CLCK, "(A >> 9) % 2")
#	field(CLCL, "(A >> 10) % 2")
#	field(CLCM, "(A >> 11) % 2")
}

record(calcout, "$(P)$(CRLID):lens_encode"){
	field(OUT, "$(P)$(CRLID):lensConfig_BW PP")
	field(CALC, "A+B*2+C*4+D*8+E*16+F*32+G*64+H*128+I*256+J*512")
} 

record(calcout, "$(P)$(CRLID):lens_RBV_encode"){
	field(OUT, "$(P)$(CRLID):lensConfig_RBV PP")
	field(CALC, "A+B*2+C*4+D*8+E*16+F*32+G*64+H*128+I*256+J*512")
} 

record(longin, "$(P)$(CRLID):lensConfig_RBV") {
}

record(longout, "$(P)$(CRLID):lensConfig_BW") {
  field(DTYP, "pydev")
  field(OUT, "@$(OBJ).updateConfig(VAL)")
}

record(ai, "$(P)$(CRLID):fSize_actual"){
  field(DTYP, "pydev")
  field(INP,  "@pydev.iointr('new_fSize')")
  field(SCAN, "I/O Intr")
  field(PREC, "5")
}

record(longout, "$(P)$(CRLID):sortedIndex") {
  field(DTYP, "pydev")
  field(OUT, "@$(OBJ).updateIndex(VAL)")
}

record(longin, "$(P)$(CRLID):sortedIndex_RBV") {
  field(DTYP, "pydev")
  field(INP,  "@pydev.iointr('new_index')")
  field(SCAN, "I/O Intr")
}

record(longout, "$(P)$(CRLID):previewIndex") {
  field(DTYP, "pydev")
  field(OUT, "@$(OBJ).getPreviewFocalSize(VAL)")
}

record(ai, "$(P)$(CRLID):fSize_preview"){
  field(DTYP, "pydev")
  field(INP,  "@pydev.iointr('new_preview')")
  field(SCAN, "I/O Intr")
  field(PREC, "6")
}

record(bo, "$(P)$(CRLID):verbosity"){
	field(DTYP, "pydev")
	field(OUT, "@$(OBJ).updateVerbosity(VAL)")
	field(ZNAM, "Off")
	field(ONAM, "On")
	
}

record(waveform, "$(P)$(CRLID):fSizes"){
  field(DTYP, "pydev")
  field(INP,  "@pydev.iointr('new_lookupTable')")
  field(SCAN, "I/O Intr")
  field(PREC, "6")
  field(FTVL, "DOUBLE")
  field(NELM, "$(ELEM)")
}

record(waveform, "$(P)$(CRLID):invF_indices"){
  field(DTYP, "pydev")
  field(INP,  "@pydev.iointr('new_invFind_list')")
  field(SCAN, "I/O Intr")
  field(PREC, "6")
  field(FTVL, "DOUBLE")
  field(NELM, "$(ELEM)")
}

record(waveform, "$(P)$(CRLID):invF"){
  field(DTYP, "pydev")
  field(INP,  "@pydev.iointr('new_invF_list')")
  field(SCAN, "I/O Intr")
  field(PREC, "6")
  field(FTVL, "DOUBLE")
  field(NELM, "$(ELEM)")
}

record(waveform, "$(P)$(CRLID):configs"){
  field(DTYP, "pydev")
  field(INP,  "@pydev.iointr('new_configs')")
  field(SCAN, "I/O Intr")
  field(PREC, "6")
  field(FTVL, "LONG")
  field(NELM, "$(ELEM)")
  }

# The commented out records below were meant to replicate the lock feature used
# in filter control.  BL staff indicated not required but kept in case needed.
# Will also have to update python code (in/out masks, culled tables/indices need
# to be uncommented).
# MW 2024.09.04

#!record(calcout, "$(P)$(CRLID):outMask_encode"){
#!	field(OUT, "$(P)$(CRLID):outMask PP")
#!	field(CALC, "A+B*2+C*4+D*8+E*16+F*32+G*64+H*128+I*256+J*512")
#!}
#!
#!record(longout, "$(P)$(CRLID):outMask") {
#!  field(DTYP, "pydev")
#!  field(DESC, "Fixed-out lens mask")
#!  field(OUT, "@$(OBJ).setOutMask(VAL)")
#!}
#!
#!record(calcout, "$(P)$(CRLID):inMask_encode"){
#!	field(OUT, "$(P)$(CRLID):inMask PP")
#!	field(CALC, "A+B*2+C*4+D*8+E*16+F*32+G*64+H*128+I*256+J*512")
#!}
#!
#!record(longout, "$(P)$(CRLID):inMask") {
#!  field(DTYP, "pydev")
#!  field(DESC, "Fixed-in lens mask")
#!  field(OUT, "@$(OBJ).setInMask(VAL)")
#!}




#!record(longin, "$(P)$(CRLID):inMask_RBV") {
#!  field(DTYP, "pydev")
#!  field(INP,  "@pydev.iointr('new_inMask')")
#!  field(SCAN, "I/O Intr")
#!}
#!
#!record(longin, "$(P)$(CRLID):outMask_RBV") {
#!  field(DTYP, "pydev")
#!  field(INP,  "@pydev.iointr('new_outMask')")
#!  field(SCAN, "I/O Intr")
#!}


#! record(waveform, "$(P)$(CRLID):fSizes_culled"){
#!   field(DTYP, "pydev")
#!   field(INP,  "@pydev.iointr('new_culledTable')")
#!   field(SCAN, "I/O Intr")
#!   field(PREC, "6")
#!   field(FTVL, "DOUBLE")
#!   field(NELM, "$(ELEM)")
#! }
#! record(waveform, "$(P)$(CRLID):configs_culled"){
#!   field(DTYP, "pydev")
#!   field(INP,  "@pydev.iointr('new_culledConfigs')")
#!   field(SCAN, "I/O Intr")
#!   field(PREC, "6")
#!   field(FTVL, "LONG")
#!   field(NELM, "$(ELEM)")
#! }